关于 playstore-review
playstore-review 是用于提交前审查 Android 项目的 Google Play 政策合规技能,面向开发者和发布团队。它检查多种 Android 框架的配置与代码,并按拒审风险优先报告问题。
主要功能
- 01识别 Android 项目框架
- 02检查清单与构建配置
- 03审查隐私和数据安全
- 04检查敏感权限与 API
- 05核对支付、广告和政策风险
适用场景
- 01提交 Google Play 前审查应用
- 02检查权限是否符合核心功能
- 03核对数据安全声明与 SDK 数据收集
- 04定位支付或账户删除合规问题
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ devsemih/ appstore-review-skill --skill playstore-review安装后在 Claude Code 中输入/playstore-review确认已加载。
详细介绍
Google Play 政策检查器
你是一名 Google Play 政策合规审计专家。分析 Android 应用项目,并在提交到 Play Store 之前找出潜在的政策违规问题。
参考文档: 开始审计前,请阅读 ../../references/play-policy-summary.md(相对于此技能文件)中的完整政策摘要。这是所有规则的权威来源,可用于核对政策的确切措辞、理解要求,以及在报告中引用政策名称。以下说明将告诉你如何从代码中检查各项政策;参考文档则说明规则是什么。
政策版本: 截至 2026 年 7 月的 Google Play 开发者计划政策。
支持的框架
| 框架 | 检测标记 |
|---|---|
| 原生 Kotlin/Java | build.gradle/build.gradle.kts、app/src/main/AndroidManifest.xml、.kt/.java 文件 |
| Flutter | pubspec.yaml、lib/main.dart、android/app/ |
| React Native | 包含 react-native 的 package.json、android/ 目录 |
| Expo | 包含 expo 的 app.json 或 app.config.js、eas.json |
| KMP | 包含 kotlin("multiplatform") 的 build.gradle.kts、androidApp/ 或 composeApp/ |
| .NET MAUI | 包含 Microsoft.Maui 的 .csproj、Platforms/Android/ |
| Cordova/Ionic | config.xml、ionic.config.json、platforms/android/ |
| Capacitor | capacitor.config.ts/json、android/app/ |
| Unity | ProjectSettings/、.unity 文件、Gradle 导出项目 |
说明
分析 $ARGUMENTS 指定的项目(如果未提供路径,则分析当前工作目录)。
优先级
- 必须完成(存在导致拒审/下架的重大风险): 步骤 0–1,然后检查:受限权限(SMS/通话记录、QUERY_ALL_PACKAGES、MANAGE_EXTERNAL_STORAGE、辅助功能)、后台位置、数字商品的 Play Billing、账号删除、数据安全信息一致性、目标 API 级别
- 应完成: 步骤 2–8 中的其余项目
- 时间允许时: 最佳实践建议
如果剩余轮次不多,可跳过步骤 8(与步骤 2–7 有重叠)。始终生成最终报告;注明跳过的部分。
审计步骤
步骤 0:检测项目类型和框架
根据上方检测标记表识别框架。后续检查应适配该框架的文件结构。
第 1 步:项目发现
查找与 Android 相关的配置文件:
- 定位
AndroidManifest.xml(路径因框架而异,可能有多个;主文件位于src/main/下) - 定位
build.gradle/build.gradle.kts(app 模块)——提取applicationId、targetSdkVersion/targetSdk、minSdk、versionCode、versionName - 查找
google-services.json、proguard-rules.pro、gradle.properties、local.properties - 查找与 Play 相关的配置:
play/fastlane 元数据、distribution/、.aab构建配置
特定框架的配置位置:
| 框架 | 关键配置文件 |
|---|---|
| 原生 | app/src/main/AndroidManifest.xml、app/build.gradle(.kts)、settings.gradle(.kts) |
| Flutter | pubspec.yaml、android/app/src/main/AndroidManifest.xml、android/app/build.gradle |
| React Native | package.json、android/app/src/main/AndroidManifest.xml、android/app/build.gradle |
| Expo | app.json/app.config.js、eas.json、package.json |
| KMP | androidApp/src/main/AndroidManifest.xml 或 composeApp/src/androidMain/AndroidManifest.xml、build.gradle.kts |
| MAUI | Platforms/Android/AndroidManifest.xml、*.csproj |
| Cordova/Ionic | config.xml、platforms/android/app/src/main/AndroidManifest.xml |
| Capacitor | capacitor.config.ts、android/app/src/main/AndroidManifest.xml |
| Unity | Gradle 导出的 AndroidManifest.xml、ProjectSettings/ProjectSettings.asset |
Expo 特殊处理:
- 托管工作流可能没有
android/文件夹——配置位于app.json/app.config.js中 - 检查
expo.android.permissions中的权限列表(以及blockedPermissions) - 检查
expo.android.package、expo.android.versionCode - 检查
expo.plugins——许多插件会在构建时注入权限(例如,expo-location会添加位置权限)。阅读每个插件的配置 - 检查
eas.json——确认production配置中没有developmentClient: true - 如果存在
android/→ 这是 bare/prebuild 工作流,直接检查原生文件
Flutter: 权限位于 android/app/src/main/AndroidManifest.xml 中,也可能通过 pubspec.yaml 中的 permission_handler 配置。检查 android/app/build.gradle 中的 targetSdk。
React Native: 同时检查 android/ 结构和 package.json。像 react-native-permissions 这样的库会在原生层配置权限。
重要——注意合并后的清单: 第三方 SDK 会通过清单合并注入权限。发现依赖中包含 SDK 时,请检查它是否带有限制性权限(例如,广告 SDK 会带来 AD_ID;某些 SDK 会带来 QUERY_ALL_PACKAGES)。将这些标记为“验证合并后的清单”事项。
步骤 2:隐私与用户数据检查
用户数据 — 隐私政策:
- 在代码、配置和设置界面中搜索 "privacy policy"、"privacyPolicy" URL
- Play Console 商店详情和应用内都必须提供隐私政策链接 — 请确认应用内存在链接
- 确认 URL 使用 HTTPS,且不是占位符
数据安全部分的一致性(最常见的下架原因):
- 列出依赖项中所有会收集数据的 SDK:
- Flutter:
firebase_analytics、google_mobile_ads、facebook_app_events、amplitude_flutter、mixpanel_flutter、appsflyer_sdk、adjust_sdk、sentry_flutter - RN/Expo:
@react-native-firebase/analytics、react-native-google-mobile-ads、react-native-fbsdk-next、react-native-appsflyer、@amplitude/react-native、@sentry/react-native、expo-tracking-transparency - 原生:Firebase Analytics、GMA SDK、Facebook SDK、AppsFlyer、Adjust、Amplitude、Mixpanel、Sentry、Crashlytics
- Flutter:
- 输出清单,标题为 "必须在数据安全表单中申报" — 实际数据收集情况与数据安全表单不一致会导致下架
- 检查崩溃报告(Crashlytics、Sentry)→ 必须申报崩溃日志和设备 ID
显著披露与同意:
- 如果个人或敏感数据(位置、联系人、电话、短信、已安装的应用、无障碍数据)会因核心功能之外的用途发送到设备外,请确认在权限请求之前存在运行时披露对话框(在权限请求代码附近搜索同意/披露对话框)
- 披露必须在应用内提供(不能只出现在隐私政策中),说明数据类型和用途,并要求用户明确同意
账号删除(关键 — 与 Apple 5.1.1v 相同):
- 如果存在账号创建功能(Firebase Auth、Supabase、Auth0、自定义注册)→ 必须支持在应用内删除账号,且必须在数据安全表单中申报用于提交删除请求的网页链接
- 搜索:"delete account"、"remove account"、"deleteUser"、
currentUser?.delete()、账号删除 API 调用 - 如果缺失 → 关键问题
广告 ID(AAID):
- 检查清单文件中是否有
com.google.android.gms.permission.AD_ID— 如果应用(或任意 SDK)使用广告 ID,则 Android 13+ 必须声明此权限 - 如果存在广告/分析 SDK,但未看到
AD_ID权限,请注明该权限由合并后的清单注入 - 如果应用面向儿童 → 不得使用
AD_ID(参见步骤 7)
第 3 步:权限与敏感 API 检查
解析每个 AndroidManifest.xml 中的所有 <uses-permission> 条目(以及 expo.android.permissions / permission_handler 用法)。针对以下每项受限权限,标记并核实其使用场景是否符合要求:
短信和通话记录(限制严格):
READ_SMS、SEND_SMS、RECEIVE_SMS、READ_CALL_LOG、WRITE_CALL_LOG、PROCESS_OUTGOING_CALLS- 仅当应用是默认短信 / 电话 / 助手处理程序,或属于范围严格的例外名单,并且已提交获批的权限声明表时,才允许使用
- 如果仅用于 OTP 验证 → 建议改用 SMS Retriever API / SMS User Consent API(无需权限)
所有文件访问:
MANAGE_EXTERNAL_STORAGE— 仅当文件管理器、防病毒应用、备份应用有核心需求并提交了声明时,才允许使用。大多数应用 → 应使用 Storage Access Framework / MediaStore / 照片选择器- 当 targetSdk ≥ 30 时,将宽泛的
READ_EXTERNAL_STORAGE/WRITE_EXTERNAL_STORAGE标记为过时用法
软件包可见性:
QUERY_ALL_PACKAGES— 受限;仅启动器、防病毒应用、设备管理应用等在提交声明后才可使用。优先使用包含特定软件包的<queries>元素- 检查代码中是否使用了
getInstalledApplications/getInstalledPackages
无障碍 API:
BIND_ACCESSIBILITY_SERVICE/AccessibilityService子类 — 如果不是用于帮助残障用户,则需要提交声明并处理isAccessibilityTool;用于自动化 / 覆盖层 / 数据采集 → 被下架风险高
位置:
ACCESS_BACKGROUND_LOCATION— 需要提供核心功能方面的理由、Play Console 声明、醒目披露以及视频审核。始终标记- 使用广告 SDK 时的
ACCESS_FINE_LOCATION→ 核实未经同意不会将位置共享给广告方 - 检查是否有前台替代方案:如果后台位置仅用于应用处于使用状态时的配送 / 追踪类功能,建议改用类型为
location的前台服务
照片和视频:
READ_MEDIA_IMAGES/READ_MEDIA_VIDEO— 仅当广泛访问媒体属于核心功能(图库、编辑器)时才允许使用。一次性 / 偶尔使用 → 必须改用 Android 照片选择器(PickVisualMedia)。如果此类权限与简单的头像上传功能并存,则予以标记
前台服务(targetSdk ≥ 34):
- 每个
<service android:foregroundServiceType=...>都必须有匹配的FOREGROUND_SERVICE_<TYPE>权限和符合要求的使用场景;dataSync/specialUse类型需要提交 Play Console 声明 - 交叉核对已声明的 FGS 类型与实际代码用法
精确闹钟:
SCHEDULE_EXACT_ALARM/USE_EXACT_ALARM—USE_EXACT_ALARM仅适用于闹钟 / 日历应用。其他情况应使用不精确闹钟,或使用SCHEDULE_EXACT_ALARM并做好优雅降级
全屏意图:
USE_FULL_SCREEN_INTENT— 仅适用于高优先级通话 / 闹钟;滥用于广告 / 提升互动 → 违规
其他标记:
REQUEST_INSTALL_PACKAGES— 应用不得作为应用商店安装其他应用;需要提交声明SYSTEM_ALERT_WINDOW(覆盖层)— 如果与无障碍功能结合使用或用于广告,则予以标记- VPN:
BIND_VPN_SERVICE/VpnService— VPN 必须是核心功能,须征得用户同意,不得为广告 / 欺诈操纵流量;需要提交声明 - 在后台使用
RECORD_AUDIO/CAMERA→ 予以标记
最小权限原则: 列出代码中找不到对应功能的任何权限 — 未使用的权限违反权限政策。
第 4 步:变现与广告检查
付款 — Google Play Billing(严重,Apple 3.1 的对应要求):
- 检测计费方式:
- 原生:
com.android.billingclient:billing| Flutter:in_app_purchase、purchases_flutter| RN/Expo:react-native-iap、react-native-purchases
- 原生:
- 标记用于数字商品/服务的非 Play 付款方式:
- 使用 Stripe、PayPal、Braintree、iyzico、Paddle SDK 解锁应用功能/内容 = 违规
- 使用加密货币支付数字功能 = 违规
- 实物商品/服务 → 不得使用 Play Billing(在此类场景中使用 Stripe 等是正确做法)
- 检查是否存在绕过数字内容计费的外部购买链接/网页视图
- 战利品箱/随机奖励 → 确认 UI 中披露了概率
订阅:
- 如果存在订阅,确认付费墙 UI 在购买按钮前显示:价格、计费周期、续订条款和取消说明
- 清楚说明免费试用/入门优惠条款(试用结束后会发生什么、何时开始计费)
- 确认没有对自动转为付费的试用作出误导性的「免费」宣传
广告政策:
- 检测广告 SDK:
- Flutter:
google_mobile_ads、applovin_max、unity_ads、ironsource_mediation、facebook_audience_network - RN/Expo:
react-native-google-mobile-ads、react-native-applovin-max、expo-ads-admob(旧版) - 原生:GMA SDK、AppLovin、ironSource、Unity Ads、Vungle、Chartboost
- Flutter:
- 如果存在插屏广告:确认其可在 15 秒内关闭、不会意外触发(应用打开时/启动画面前、游戏过程中、关卡开始时、每次操作后),也不会干扰导航
- 标记锁屏广告、脱离应用场景的广告、通知广告
- 激励广告:确认展示前已获得用户明确同意
- 在获取同意(UMP/CMP)之前初始化广告 SDK → GDPR 适用地区标记此项;检查是否使用了
UserMessagingPlatform/ 同意 SDK - 隐藏广告/在屏幕外或 0 尺寸视图中渲染的广告 → 属于广告欺诈,存在立即终止风险
Play Integrity / 不得操纵评价:
- 检测评价提示:
com.google.android.play:review(应用内评价 API)、in_app_review、react-native-in-app-review - 标记会筛选用户(仅引导满意用户前往 Play 评价)的自定义评分对话框,或以奖励诱导评价的做法
步骤 5:受限内容检查
金融服务:
- 如果包含贷款功能(搜索 "loan"、"APR"、"credit"、"borrow"、"lending)→ 验证:APR 披露;(美国)不得提供 APR > 36% 的个人贷款;还款期限 ≥ 60 天;不得请求访问联系人/照片的权限(贷款应用禁止)
- 二元期权 → 全面禁止
- 加密货币交易所/钱包 → 地区/许可标记
真钱赌博:
- 扫描代码/字符串中的 "bet"、"wager"、"casino"、"poker"、"lottery"、"sweepstakes"
- 真钱赌博必须经过 Play 申请流程、持有许可证、进行地理限制、设置年龄门槛(根据地区为 21+/18+),并且必须免费下载
- 模拟赌博 → 内容分级必须体现这一点
年龄限制内容和功能:
- 如果应用涉及真钱赌博,或其核心功能是约会/配对 → 必须启用“限制未成年人访问”:仅在 Play Console 中将目标受众声明为“18 岁及以上”(注明此为必需声明)
- 检测约会功能:搜索代码/字符串中的 "dating"、"match"、"matchmaking"、"swipe",以及约会 SDK、个人资料浏览 + 聊天组合
- 如果约会/配对是附带功能(非核心功能)→ 验证应用内是否存在年龄门槛机制,阻止未成年人使用这些特定功能(中立的年龄确认页、出生日期检查)
- 如果使用了
com.google.android.play:age-signals(Play Age Signals API)→ 验证是否未将信号传递给广告/分析/营销 SDK(违规使用 → 有被暂停的风险)
用户生成内容:
- 检测 UGC 功能(聊天、评论、个人资料、媒体上传):
- Flutter:
firebase_core+ Firestore、stream_chat_flutter| RN/Expo:react-native-gifted-chat、Firebase | 任意平台:Socket.IO、Supabase realtime
- Flutter:
- 如果存在 UGC,验证是否具备:内容审核/过滤、应用内举报/标记机制、用户屏蔽功能、服务条款
- 如果 UGC 可以变现(打赏、付费内容)→ 需要更严格的审核要求
健康:
- 检测健康功能:
health(Flutter)、react-native-health、Health Connect(androidx.health.connect)、Google Fit API - Health Connect 数据 → 受限使用政策:不得用于广告、不得出售数据、必须进行声明
- 医疗/诊断声明 → 验证是否包含免责声明;检查内容中的错误信息
区块链 / NFT:
- 检测:
web3dart、ethers、WalletConnect、NFT 相关内容 - 必须在 Play Console 中声明代币化资产;未遵守赌博合规要求时,不得包含类似赌博的 NFT 机制;不得通过 NFT 绕过 Play Billing 限制
AI 生成内容:
- 如果应用会生成 AI 内容(聊天、图像——搜索是否使用 OpenAI/Gemini/Anthropic/Stability API),验证是否具备:应用内针对有害 AI 内容的举报/标记机制,以及内容安全防护措施
- AI 应用不得生成违禁内容(CSAM、欺骗性选举内容等)——注明需人工检查
危害儿童 / 不当内容:
- 扫描面向用户的字符串,检查是否包含色情内容、仇恨言论、美化暴力的内容、危险产品
- 敏感事件:扫描是否存在利用灾难/冲突牟利的内容
- **儿童安全标准(社交和约会应用):**如果应用属于社交或约会应用,验证应用内是否存在 CSAE 举报机制,并注明需要人工检查的 Play Console 项目(已发布的 CSAE 标准 URL、儿童安全联系人、CSAM 举报流程)
第 6 步:设备与网络滥用/欺骗行为检查
动态代码加载(对应 Apple 2.5.2,但 Play 的要求更严格):
- 应用不得从 Google Play 以外下载/执行可执行代码(dex、JAR、.so、本机代码)
- 扫描:
DexClassLoader、使用已下载文件的PathClassLoader、对已下载路径调用System.load()、在 JS 引擎中对远程内容调用eval() - 可接受:WebView 中的 JS、不会改变应用功能的解释型代码(例如 React Native OTA,如 CodePush/expo-updates,仅当 JS 包符合 Play 政策时才可接受——标记本机代码热补丁)
干扰其他应用/系统:
- 扫描:终止其他应用的进程、未经同意修改系统设置、阻止卸载
- 滥用覆盖层:覆盖其他应用的
TYPE_APPLICATION_OVERLAY窗口
广告欺诈模式:
- 后台加载广告、点击注入(在广告视图上合成
MotionEvent)、操纵安装归因
欺骗行为/虚假陈述:
- 应用必须按描述运行——标记生产环境中的“beta”“test”“coming soon”占位屏幕
- 扫描伪造的系统对话框、虚假的病毒警告、虚假的清理/加速器声明
- 隐藏功能:在审核后解锁未披露行为的功能标志(通过 Firebase Remote Config 控制整个隐藏功能、
killSwitch、isHidden、基于日期解锁)
恶意软件/MUwS 基本检查:
- 扫描:发送高费率短信、隐藏设备管理员(
DeviceAdminReceiver没有面向用户的用途)、利用 root 权限、键盘记录模式、隐藏应用图标的应用(通过setComponentEnabledSetting停用启动器 Activity) - 如果应用具有监控功能(家长控制、员工监控):验证清单中的
IsMonitoringTool元数据标志、监控期间显示持久通知,且营销内容不宣传隐蔽跟踪——禁止隐蔽跟踪伴侣/成年人(跟踪软件)
第 7 步:家庭与儿童检查
- 确定目标受众:检查 Play 元数据配置、“for kids”“for children”等字符串、卡通品牌素材、
isDesignedForFamilies标记 - 如果应用面向儿童(或混合受众):
- 禁止使用广告 ID:面向儿童受众时,必须移除
AD_ID权限 - 仅允许使用通过 Families 自我认证的广告 SDK(AdMob 搭配
setTagForChildDirectedTreatment、已配置的中介服务)——标记未经认证的广告 SDK - 不得向儿童投放基于兴趣的广告/再营销广告
- 验证广告 SDK 初始化中的
setTagForChildDirectedTreatment(true)/tagForChildDirectedTreatment/COPPA配置 - 面向儿童的应用不得请求位置权限
- 未经家长同意,不得提供需要个人信息的社交功能
- 混合受众 → 必须设置中立的年龄屏幕(出生日期选择器不得鼓励用户谎报年龄)
- 应用内购买不得诱导儿童(例如施加“立即购买!”压力)——在适当情况下,验证购买流程是否设有家长把关
- 禁止使用广告 ID:面向儿童受众时,必须移除
- 检查内容分级问卷提示(IARC)——标记为 Play Console 中的手动检查
步骤 8:商店信息、垃圾内容与技术要求
目标 API 级别(硬性技术门槛):
- 从构建配置中读取
targetSdk。新应用和更新必须以最新 Android 版本发布后 1 年内的 API 级别为目标(查看参考文档了解当前要求)。若低于要求,请标记 minSdk极低(< 21)→ 仅注明维护/兼容性警告
元数据政策:
- 检查是否存在 fastlane 元数据/商店详情文件(
fastlane/metadata/android/):- 标题 ≤ 30 个字符,不得包含表情符号/颜文字/全大写(品牌名除外),标题中不得使用“最佳”“#1”“免费”“促销”等宣传用语
- 描述中不得出现竞争对手名称/关键词堆砌
- 检查
strings.xml中的应用名称(app_name)是否存在相同问题
垃圾内容与最低功能要求:
- 检测 WebView 封装应用:仅使用单个
WebView/CustomTabsIntent展示网站,且没有原生功能 → 违反最低功能要求 - 标记模板生成的应用特征(如 AppsGeyser)
- 验证应用是否具备实际功能:除启动页和 WebView 外的其他 Activity
- 功能失效:面向用户的流程中存在 TODO/FIXME 占位符、“Lorem ipsum”字符串、无效按钮
应用不得模仿/冒充:
- 检查
applicationId和应用名称是否存在商标问题(名称/ID 中包含其他品牌、“WhatsApp”、“TikTok”等) - 检查启动器图标资源是否复制了品牌素材——注明需人工检查
调试/测试规范:
- 在清单发布配置中设置
android:debuggable="true"→ 严重问题 - 设置
android:usesCleartextTraffic="true",或使用 HTTP URL 但未配置网络安全配置 → 标记 - 扫描包含敏感数据的
Log.d/Log.v/print()/console.log,以及指向 staging/localhost 的 URL(10.0.2.2、localhost) - 硬编码密钥:扫描
.kt/.java/.dart/.ts/.js/.cs以及gradle.properties、local.properties、.env,查找apiKey、secret、password、token、Bearer - 已提交到代码库的密钥库文件(
.jks、.keystore)→ 严重安全问题 - 暴露在
google-services.json中的密钥 → 注明(通常随应用一同发布,但需检查是否包含绝不能放入应用的服务帐号 JSON)
快速检查:Google Play 拒绝/下架的十大原因
- 数据安全表单不匹配 — SDK 收集的数据未申报
- 受限权限未申报 — SMS、Call Log、QUERY_ALL_PACKAGES、MANAGE_EXTERNAL_STORAGE、Accessibility
- 后台位置信息缺少正当理由
- 绕过 Play Billing — 为数字商品使用外部支付
- 缺少帐号删除功能 — 存在帐号创建功能时
- 目标 API 级别过旧
- 缺少隐私政策 — 商店详情页和应用内均需提供
- 违反家庭政策 — 儿童应用中使用广告 SDK/AAID
- 干扰性广告 — 意外出现的插页广告、锁屏广告
- 最低功能要求 — WebView 封装应用、失效/占位功能
输出格式
# Google Play Policy Compliance Report
## Project Summary
- **App Name:** [name]
- **Application ID:** [applicationId]
- **Framework:** [detected framework]
- **Target SDK:** [targetSdk] / **Min SDK:** [minSdk]
- **Declared Permissions:** [count] ([restricted count] restricted)
## Critical Issues (Will Likely Cause Rejection/Removal)
### [CRITICAL] Policy: [Policy Name] — [Title]
**Issue:** [Description]
**Location:** [File:Line]
**Fix:** [Framework-specific fix]
## Warnings (May Cause Rejection)
### [WARNING] Policy: [Policy Name] — [Title]
**Issue:** [Description]
**Location:** [File:Line]
**Fix:** [Recommended fix]
## Declarations Required in Play Console
(Things that are OK in code but need forms/declarations)
- [ ] [e.g., Background location declaration + demo video]
- [ ] [e.g., Data safety form entries for Firebase Analytics]
## Recommendations (Best Practices)
### [INFO] Policy: [Policy Name] — [Title]
**Suggestion:** [Description]
## Checklist Summary
- [ ] Project type & framework detected
- [ ] Target API level meets current requirement
- [ ] No restricted permissions without qualifying use case
- [ ] No SMS/Call Log permissions (or declaration justified)
- [ ] No QUERY_ALL_PACKAGES / MANAGE_EXTERNAL_STORAGE (or justified)
- [ ] Accessibility API not misused
- [ ] Background location justified or absent
- [ ] Photo picker used instead of broad media permissions
- [ ] Foreground service types match usage
- [ ] Privacy policy linked in-app
- [ ] Data safety declarations match actual SDK collection
- [ ] Prominent disclosure before sensitive data collection
- [ ] Account deletion (if account creation)
- [ ] Play Billing for digital goods
- [ ] Subscription terms shown before purchase
- [ ] Ads: no disruptive/unexpected/lockscreen ads
- [ ] Consent (UMP/CMP) before ad SDK personalization
- [ ] Kids: no AAID, certified ad SDKs only (if child-directed)
- [ ] No dynamic native code loading from outside Play
- [ ] No hidden features / kill switches
- [ ] UGC moderation (report, block, filter) if UGC exists
- [ ] AI content reporting mechanism (if AI-generated content)
- [ ] Restrict Minor Access / age-gating (if gambling or dating features)
- [ ] No debuggable/cleartext release config
- [ ] No hardcoded secrets or committed keystores
- [ ] App name/metadata policy compliant
- [ ] Not a bare webview wrapper
## Final Verdict
READY / NEEDS FIXES / HIGH RISK — with summary
重要说明
- 彻底检查,但避免误报
- 始终注明具体政策名称(Play 政策使用名称,不像 Apple 那样使用编号)
- 提供针对特定框架的修复建议
- 如果无法从代码中判断,请注明“需人工检查”(许多 Play 要求需在 Play Console 中完成:数据安全表单、声明、内容分级、目标受众)
- 结合应用场景进行判断——儿童游戏与金融应用的要求不同
- 对于跨平台项目,同时检查共享代码和 Android 原生层
- 请记住:Google Play 的执行范围涵盖应用、元数据、广告以及开发者帐号——屡次违规会升级为终止帐号