rea-reverse

Google Play 上架合规体检(APK/AAB)

用发布包对照最常导致 Google Play 拒审或要求填写政策声明的规则逐项检查:目标 API 级别、16 KB 页面大小、受限权限、前台服务、签名等。已默认选中 Google Play 场景。

文件不离开你的浏览器. 解析在本地的 Web Worker 中完成,不上传任何内容。 如何自己验证

在单独页面打开工具(无广告、无统计)

Google Play 拒审,大多不是因为应用“做了什么”,而是因为发布包里“写了什么”:目标 API 级别低于当前要求、原生库没有按 16 KB 对齐、某个权限需要声明却没人提交、前台服务没写类型、用了调试证书签名。这些信息在上传之前就能从 APK 或 AAB 里读出来。

这个页面运行的是和 APK/AAB 分析器 相同的工具,只是默认选中了 Google Play 场景,让报告集中在 Play Console 会检查的内容上。每条结果都写明规则编号、判断依据(证据)、修复方法,并链接到写明该要求的 Google 官方页面。文件只在你的浏览器里读取,不会上传。

使用步骤

  1. 构建要提交的发布包:最好是 ./gradlew bundleRelease 生成的 .aab,也可以是发布版 .apk。
  2. 保持选中 Google Play(同时在 Play 以外分发就选“两者都要”);想提前看某个截止日期之后的结果,就改体检日期;然后拖入文件或点“选择文件”。
  3. 先按证据和修复方法处理所有“拒审”,再处理“高风险”;“建议”是提醒你核对 Play 管理中心里的表单,例如 Data safety。

真实输出示例

我们从 F-Droid 下载 VES Image Compare 2.3.6,选 Google Play 场景、日期 2026-11-02,复制了中文页面显示的报告。排版有压缩(标签和值放在一行,省略“触发条件”和官方依据,44 条通过或不适用的规则只保留一部分),所有数值原样保留。

样本: com.vincentengelsoftware.vesandroidimagecompare_51.apk(VES Image and Photo Compare 2.3.6,GPL-3.0-only),2026-11-02 从 F-Droid 下载,SHA-256 ba280b33…d86ef6 (f-droid.org/packages/com.vincentengelsoftware.vesandroidimagecompare/)

摘要
包名       com.vincentengelsoftware.vesandroidimagecompare
应用名称   vesIC
版本       2.3.6 (51)
minSdk     28
targetSdk  36
类型       APK · 1.8 MB
SHA-256(整个文件)  ba280b3332682c1a909a609bad51efcc20d8f3a278b1017c6aafadb84ad86ef6
拒审 0 · 高风险 1 · 建议 2 · 未知 0 · 通过 34

高风险 (1)
PLAY-05  提交 Google Play 用的是 APK 而不是 App Bundle  高风险
  Google Play 上的新应用必须上传 AAB;对新应用而言这是拒审项。
  证据      input is an APK
  修复方法  用 ./gradlew bundleRelease(或 Android Studio 的 Build > Generate Signed Bundle)生成 AAB,并启用 Play App Signing。

建议 (2)
PRIV-02  Data safety 表单:核对草稿  建议
  证据  Photos and videos ← CAMERA
PROT-03  Play Integrity API  建议
  证据  no class under com.google.android.play.core.integrity

通过 (44)
PLAY-01  targetSdkVersion 未达到 Google Play 要求  通过
PLAY-02  16 KB 页面大小:ELF 段未按 16 KB 对齐  通过
…
PLAY-16  照片和视频权限  通过
SIGN-01  使用了 Android 调试证书签名  通过
SIGN-03  只有 v1(JAR)签名  通过
…
PLAY-15  前台服务类型与全屏通知  通过
…
SIDE-02  targetSdk 过旧:安装时 Play Protect 警告  不适用
…
SIGN-05  签名证书在 2033-10-22 之前到期  通过
SIGN-08  ZIP 对齐与 resources.arsc 存储方式  通过
…

原生库    无
签名方案  v1, v2, v3
签名者 1 · v1
主题      CN=FDroid,OU=FDroid,O=fdroid.org,L=ORG,ST=ORG,C=UK
有效期    2022-08-21T20:49:39Z → 2050-01-06T20:49:39Z
密钥      RSA 2048
…

能检查什么

下表列出每一条检查、报告的级别,以及触发的具体条件。编号固定不变,报告里的 #PLAY-15 始终指同一条规则。

编号检查内容级别触发条件适用场景
PLAY-01targetSdkVersion 未达到 Google Play 要求拒审仅 Play。手机/平板:2026-08-31 起 targetSdk ≥ 36(可延期到 2026-11-01 期间,≥ 35 的按高风险);Wear OS/Automotive ≥ 35;TV ≥ 34;XR ≥ 34。设备形态取自 required 的 <uses-feature>。Google Play
PLAY-0216 KB 页面大小:ELF 段未按 16 KB 对齐拒审(2027-02-01 起)仅 Play。lib/arm64-v8a 和 lib/x86_64 下任一 PT_LOAD 的 p_align < 0x4000。2027-02-01 前为高风险,之后为拒审。Google Play
PLAY-0316 KB 页面大小:未压缩的 .so 在 ZIP 内未按 16 KB 对齐拒审(2027-02-01 起)仅 Play,仅 APK。不压缩(STORED)的 64 位 .so 数据偏移不是 16384 的倍数;extractNativeLibs="true" 时跳过。2027-02-01 前为高风险。Google Play
PLAY-04缺少 64 位原生库拒审仅 Play。有 armeabi-v7a/armeabi 却没有 arm64-v8a,或有 x86 却没有 x86_64;或 ELF 的位数/机器类型与所在 ABI 目录不符。Google Play
PLAY-06可调试包或测试包拒审仅 Play。application 上 android:debuggable="true" 或 android:testOnly="true"。Google Play
PLAY-07包名使用了保留前缀拒审仅 Play。包名为 com.example.*、com.android.* 或 android.*。Google Play
PLAY-08短信或通话记录权限拒审仅 Play。申请了任一短信或通话记录权限。Google Play
PLAY-09QUERY_ALL_PACKAGES 权限高风险仅 Play。申请了 QUERY_ALL_PACKAGES(高风险:需声明审核)。Google Play
PLAY-10所有文件访问权限拒审仅 Play。MANAGE_EXTERNAL_STORAGE 为拒审;只有 requestLegacyExternalStorage="true" 为高风险。Google Play
PLAY-13后台位置权限高风险仅 Play。申请了 ACCESS_BACKGROUND_LOCATION。Google Play
PLAY-16照片和视频权限拒审仅 Play,且仅当 targetSdk ≥ 33:申请了 READ_MEDIA_IMAGES 或 READ_MEDIA_VIDEO。Google Play
SIDE-01targetSdkVersion 过低,新版 Android 无法安装拒审Play 以外。targetSdk < 24(Android 15 及以上拒绝安装)或 < 23(Android 14 及以上)。Play 以外(线下分发)
SIGN-01使用了 Android 调试证书签名拒审任一签名者证书主题的 CN 为 "Android Debug"(SDK 调试密钥是 CN=Android Debug, O=Android, C=US;React Native 等框架模板的 O 值不同)。Play 为拒审,Play 以外为高风险。Google 写明 Play 不接受调试证书签名的应用;Play 很可能就是按这个主题识别的,但官方没有写明。Google Play / Play 以外(线下分发)
SIGN-03只有 v1(JAR)签名拒审仅 APK。没有 v2/v3 签名:只有 targetSdk ≥ 30 时为拒审(无法安装),低于 30 为高风险;完全没有签名单独提示。Google Play / Play 以外(线下分发)
PLAY-05提交 Google Play 用的是 APK 而不是 App Bundle高风险仅 Play 场景,仅 APK。高风险:新应用必须以 AAB 发布(2021 年 8 月起),Google 页面写明的是对新应用的要求。Android TV 应用(required 的 android.software.leanback)为拒审:2023-06-30 起 Play 不再接受 TV 应用用 APK 更新。Google Play
PLAY-11声明了无障碍服务高风险仅 Play。任一受 BIND_ACCESSIBILITY_SERVICE 保护的 <service>。资源表能解析时,同时读取服务配置 XML 中的 android:isAccessibilityTool。Google Play
PLAY-14精确闹钟权限高风险仅 Play。USE_EXACT_ALARM 为高风险(只允许核心功能是闹钟或日历的应用)。只有 SCHEDULE_EXACT_ALARM 为建议(用户可以拒绝授权)。Google Play
PLAY-15前台服务类型与全屏通知高风险仅当 targetSdk ≥ 34。拒审(所有场景):service 声明了 foregroundServiceType 却缺少对应的 FOREGROUND_SERVICE_<TYPE> 权限(启动即崩溃)。高风险:有 FOREGROUND_SERVICE 却没有任何声明类型的 service;Play 场景下另含每个带类型的前台服务(需填 Play Console 声明)以及 USE_FULL_SCREEN_INTENT。哪些未声明类型的 service 会以前台方式启动不做追踪(需要分析代码中的数据流)。Google Play / Play 以外(线下分发)
PLAY-17通讯录权限(Play 新规)建议仅 Play。申请了 READ_CONTACTS:建议;targetSdk ≥ 37 时为高风险(最小范围新规适用于以 Android 17 为目标的应用,2027-01-27 起执行)。Google Play
SIDE-02targetSdk 过旧:安装时 Play Protect 警告高风险Play 以外。targetSdk 比体检日期当时最新的 Android 版本低两个以上 API 级别(最新级别由规则数据维护)。Play 以外(线下分发)
SIDE-03增强型反诈保护会拦截的权限高风险Play 以外。RECEIVE_SMS、READ_SMS、通知监听或无障碍服务。在已启用 Google Play Protect 增强型反诈保护的部分市场(Google 未公布完整名单),从浏览器、聊天软件或文件管理器安装这类应用会被拦截。Play 以外(线下分发)
SIDE-04无障碍服务标记为辅助功能工具高风险Play 以外。无障碍服务的配置里 isAccessibilityTool="true"。只是提示:应用是否真的是面向残障用户的工具,需要人工确认。配置 XML 读不到时为未知。Play 以外(线下分发)
SIDE-06高危能力组合高风险Play 以外。同时具备以下三项或以上:SYSTEM_ALERT_WINDOW、无障碍服务、短信权限、设备管理员 receiver、通知监听。Play 以外(线下分发)
SIDE-07没有启动入口建议Play 以外。没有带 MAIN + LAUNCHER(或 LEANBACK_LAUNCHER)的 activity/activity-alias,也没有输入法、壁纸、无障碍、屏保、TV 输入、桌面等系统类组件。Play 以外(线下分发)
SIDE-08拆分 APK 被当作完整应用分发拒审Play 以外,仅 APK。拒审(无法单独安装):文件本身是拆分包(<manifest split>、isFeatureSplit),会报 INSTALL_FAILED_INVALID_APK "Full install must include a base package";或 base APK 的 <manifest> 上设置了 android:isSplitRequired="true" 或 android:requiredSplitTypes,会报 INSTALL_FAILED_MISSING_SPLIT。高风险:base APK 只在 <application> 上带 android:isSplitRequired,或带 meta-data com.android.vending.splits.required。安装器不读这两处,所以可能装得上,但缺了拆分包就不完整(拆分包里的代码或资源运行时可能找不到)。Play 以外(线下分发)
SIDE-09ZIP 结构不规范高风险仅 APK。重复条目、中央目录与本地头不一致、不安全路径、加密标志位或未知压缩方式为高风险;归档末尾有多余数据为建议。Google Play / Play 以外(线下分发)
SIDE-10Android 开发者验证:需要登记的信息建议Play 以外,仅 APK。始终列出需要登记的包名和签名证书 SHA-256。签名者是调试证书或公开的 AOSP 测试密钥时为高风险,因为无法证明所有权。Play 以外(线下分发)
SIGN-02使用了公开的密钥签名拒审任一签名者证书的 SHA-256 与私钥已公开的密钥一致:AOSP 测试证书(testkey、platform、shared、media 等),或 React Native 模板的 debug.keystore(Expo bare 模板里是同一个文件)。Play 为拒审,Play 以外为高风险。Google Play / Play 以外(线下分发)
SIGN-04签名密钥或证书摘要强度不足高风险RSA 密钥小于 2048 位、DSA 密钥,或证书签名基于 MD5 为高风险;证书签名基于 SHA-1 为建议。Google Play / Play 以外(线下分发)
SIGN-05签名证书在 2033-10-22 之前到期拒审仅 Play。任一签名者证书的 notAfter 早于 2033-10-22。APK:拒审(该规定针对应用签名密钥)。AAB:只是建议(AAB 上的是上传密钥,Google 用应用签名密钥签名应用,2033 年的规定针对的是后者)。Google Play
SIGN-08ZIP 对齐与 resources.arsc 存储方式拒审仅 APK。只有 targetSdk ≥ 30 且 resources.arsc 被压缩或未按 4 字节对齐时为拒审(无法安装)。其他未压缩条目未按 4 字节对齐为建议。Google Play / Play 以外(线下分发)
PRIV-07允许明文传输或信任用户安装的证书建议usesCleartextTraffic="true";或未声明且 targetSdk < 28(此时默认允许明文);或网络安全配置在 <debug-overrides> 之外允许明文或信任用户证书。配置读不到且没有其他发现时为未知。Google Play / Play 以外(线下分发)
PROT-01识别到应用防护(加壳 / 加固)建议只做识别:按库文件名识别到商业应用防护运行库,或者(弱信号)只有一个很小的 classes.dex 而 assets 中有大文件。保护代码是正当的,这里只说明利弊。Google Play / Play 以外(线下分发)
PLAY-12REQUEST_INSTALL_PACKAGES 权限高风险仅 Play。申请了 REQUEST_INSTALL_PACKAGES:高风险(只有安装其他应用属于核心功能时才允许,例如文件管理、浏览器、企业设备管理)。DEX 同时显示自更新链路时为拒审:有安装路径(PackageInstaller 调用或安装 intent)且有 .apk 下载地址字符串——Play 上的应用不得通过 Google Play 以外的方式更新自身。DEX 读不到时只按权限提示。Google Play
SIDE-05自更新链路高风险Play 以外。三项同时存在为高风险:REQUEST_INSTALL_PACKAGES 权限、DEX 中的安装路径(PackageInstaller 调用,或安装 intent 的 MIME 类型 / action)、.apk 下载地址字符串。有权限和安装路径但没有地址字符串为建议(地址常在运行时拼接)。DEX 扫描不完整且没找到时为未知。Play 以外(线下分发)
SIGN-06v1(JAR)签名与内容不一致拒审存在 v1 / JAR 签名时:逐项比对 MANIFEST.MF 摘要与实际条目,列出 META-INF/ 以外未被清单覆盖的条目,并校验 .SF 中对 MANIFEST.MF 的摘要(不验证 .SF 上的 PKCS#7 签名)。APK:只有 v1 签名或 minSdk < 24 时为拒审(Android 7.0 及以上改为校验 v2/v3,忽略 v1),否则为建议。AAB(用上传密钥做 JAR 签名):高风险,Google 没有写明上传签名损坏时如何处理。Google Play / Play 以外(线下分发)
SIGN-07v2 / v3 签名校验失败拒审仅 APK。重新计算每个 v2 / v3 / v3.1 签名者按 1 MiB 分块的内容摘要,并用 WebCrypto 验证签名。摘要不一致或签名验证失败为拒审(Android 无法安装)。WebCrypto 不支持的算法(DSA)或校验触及上限时为未知。v3.2(Android 17 混合 ML-DSA)签名块不校验。Google Play / Play 以外(线下分发)
SIGN-09与上一版本的签名不一致拒审仅在通过"与上一版本比较"加入上一版本后检查。比较两个文件签名者证书的 SHA-256;v3 / v3.1 的轮换谱系(proof-of-rotation)包含上一版全部签名者时视为一致(不验证谱系本身的签名)。APK 对 APK:拒审(更新装不上旧版本)。涉及 AAB 时为高风险:AAB 上是上传密钥,用户拿到的 APK 由 Play App Signing 重新签名,换上传密钥需要在 Play Console 申请重置。Google Play / Play 以外(线下分发)
PRIV-01需要在 Google Play SDK Index 核对的第三方 SDK建议列出识别到的全部 SDK(Manifest 组件和 meta-data、原生库、版本文件、DEX 类名前缀和版本常量)。建议级:SDK Index 没有公开 API,离线无法判断版本是否过时或被标记违规,请逐个查询。Google Play / Play 以外(线下分发)
PRIV-02Data safety 表单:核对草稿建议仅 Play。根据权限和识别到的 SDK 类别,列出 Data safety 表单大概率需要申报的数据类型。工具看不到你在 Play Console 的填写,这只是用来对照的草稿,不是结论。Google Play
PRIV-03广告 ID 权限与声明高风险仅 Play。高风险:有广告或统计 SDK、targetSdk ≥ 33 却没有声明 AD_ID(此时 getId() 返回全零;如果是有意移除,在声明中如实填写)。建议:声明了 AD_ID——Play Console 的广告 ID 声明和 Data safety 中的"设备或其他 ID"必须一致。Google Play
PRIV-04不可重置的设备标识高风险高风险:AndroidX / Google 库以外的代码调用了 TelephonyManager 的 getDeviceId / getImei / getMeid / getSubscriberId / getSimSerialNumber 或 Build.getSerial。建议:这些调用只出现在 AndroidX / Google 库代码中(兼容性封装)、引用了 Build.SERIAL 字段、Settings.Secure.getString 加 "android_id" 字符串(SSAID),或只声明了 READ_PHONE_STATE / READ_PRIVILEGED_PHONE_STATE。DEX 扫描不完整时为未知。Google Play / Play 以外(线下分发)
PRIV-05采集已安装应用列表高风险高风险:DEX 代码调用 getInstalledPackages / getInstalledApplications,申请了 QUERY_ALL_PACKAGES,并且有广告或统计 SDK。建议:有调用,但另外两项只占其一。DEX 扫描不完整且没找到时为未知。Google Play / Play 以外(线下分发)
PRIV-06发现登录功能:账号删除要求建议仅 Play。识别到登录类 SDK(Firebase Authentication、Google 登录 / Credential Manager、Facebook Login、微信、QQ、微博、LINE 等)。只是提醒:工具无法判断应用是否允许注册账号。不扫描资源字符串(如"注册")。Google Play
PROT-02未开启 R8 优化 / 混淆建议找到 ~~R8 标记(R8 写入 DEX 字符串池)为通过。只有 ~~D8 标记(未压缩代码;会指出 "compilation-mode":"debug"),或没有任何标记且 50 个以上类中 1–2 个字母的 R8 式类名不到 5% 时为建议。列出仍带 DEBUG 字段的 BuildConfig 类。没有标记且启发式无法判断时为未知。Google Play / Play 以外(线下分发)
PROT-03Play Integrity API建议Play 场景:没有找到 com.google.android.play.core.integrity 下的类时为建议。仅线下:找到时为建议(Play 以外安装的副本会被判为未授权)。仍调用 SafetyNet Attestation API(已于 2025 年 1 月关停)时一律为建议。Google Play / Play 以外(线下分发)
PROT-04运行时动态加载 dex 或 so拒审Play:运行时加载代码(DexClassLoader、InMemoryDexClassLoader、PathClassLoader、System.load / Runtime.load)且存在远程 .dex/.jar/.so 地址字符串为拒审;Google / AndroidX 库以外调用 DexClassLoader / InMemoryDexClassLoader 为高风险;其他情况(只有 PathClassLoader 或 System.load、只在已知库中、assets/ 中带代码文件)为建议。Play 以外同样的发现最高为高风险。Google Play / Play 以外(线下分发)

选中 Google Play 场景时,只与线下分发有关的规则(SIDE- 开头的 Play Protect 警告、开发者验证、拆分 APK 等)显示为不适用。如果你同时在 Play 以外分发,请改选两者都要。

能查出哪些拒审原因

目标 API 级别(PLAY-01)

2026-08-31 起,手机和平板上的新应用及更新必须以 API 36 为目标。可以在 Play Console 申请延期到 2026-11-01;在此之前,API 35 的版本按高风险而不是拒审提示。Wear OS 和 Android Automotive OS 应用要求 35,Android TV 和 Android XR 应用要求 34。工具读取 required 的 uses-feature 来选择对应门槛。来源:目标 API 级别要求。

16 KB 内存页(PLAY-02、PLAY-03)

以 Android 15 及以上为目标的应用,必须在 64 位设备上支持 16 KB 页面大小。工具读取 lib/arm64-v8a 和 lib/x86_64 下每个库的 ELF 程序头;对 APK 还会检查每个不压缩的库在 ZIP 里的偏移。Google 开发者文档写明,2027-02-01 起不合规的更新将无法发布;在此之前工具按高风险提示并显示倒计时。来源:支持 16 KB 页面大小。

App Bundle 和 64 位代码(PLAY-05、PLAY-04)

新应用必须以 Android App Bundle 发布。在 Play 场景下拖入 APK,PLAY-05 会按高风险提醒这一点,因为 Google 写明的是对新应用的要求。对 Android TV 应用则是拒审:2023 年 6 月 30 日起,Google Play 不再接受 TV 应用用 APK 更新。PLAY-04 检查每个 32 位 ABI 是否都有对应的 64 位版本,以及每个 .so 是否真的是为所在目录的架构编译的。

受限权限与声明表(PLAY-08 到 PLAY-17)

有些权限只允许用于特定的核心功能,并要在 Play Console 填写声明表:短信和通话记录、QUERY_ALL_PACKAGES、所有文件访问、REQUEST_INSTALL_PACKAGES、后台位置、照片和视频、精确闹钟,以及新加入的通讯录。这里的结果不是说权限被禁止,而是说审核人员会问你为什么需要它。通常的修法是改用范围更小的 API:SMS Retriever API、<queries>、存储访问框架(SAF)、系统 Photo Picker、Contact Picker、非精确闹钟。

接下来几个月有两个日期要注意。2027-01-27 起,“电话账户验证”不再是 READ_CALL_LOG 的允许用途;通讯录新规(PLAY-17)对以 Android 17 为目标的应用生效。见 Policy Deadlines 和通讯录权限。

前台服务与全屏通知(PLAY-15)

以 API 34 及以上为目标的应用,每个前台服务都要声明 foregroundServiceType,并申请对应的 FOREGROUND_SERVICE_<TYPE> 权限。声明了类型却缺少权限的服务一启动就会崩溃,所以工具在所有场景下都按拒审报告。在 Play 上,每个带类型的前台服务还需要在 Play Console 填写声明,USE_FULL_SCREEN_INTENT 只允许通话和闹钟类应用使用。有一个限制:没有声明类型的 service 是否会以前台方式启动,需要在代码里追踪 startForeground 的调用,本工具不做这种追踪。来源:前台服务要求、前台服务类型。

无障碍服务(PLAY-11)

声明了无障碍服务的应用,必须填写 AccessibilityService API 声明并提供显著披露。工具还会通过资源表读取该服务的配置 XML,显示它是否声明了 isAccessibilityTool="true"。这个标记只留给主要面向残障用户的工具。

发布构建与签名(PLAY-06、PLAY-07、SIGN-01 到 SIGN-09)

debuggable 或 testOnly 的构建会被拒,包名在 com.example、com.android、android 之下的也会被拒。签名方面,报告会检查:调试证书(任何 CN=Android Debug);私钥已公开的密钥,包括 AOSP 测试密钥,以及 React Native 模板自带的调试密钥(在你配置自己的上传密钥之前,模板的 release 构建默认用它签名,见 React Native:发布到 Google Play);小于 2048 位的 RSA 密钥、DSA 密钥和 MD5 签名;在 2033 年 10 月 22 日之前到期的证书;对 APK 还检查是否只有 v1 签名、resources.arsc 是否被压缩或未对齐。对 AAB 来说证书是你的上传密钥,Google 会用应用签名密钥重新签名,而 2033 年的有效期规定针对的是应用签名密钥,所以 AAB 上的有效期问题只作为建议提示。签名还会做完整校验(SIGN-06、SIGN-07)。点击“与上一版本比较签名”后,报告还会检查这次更新是否与上一版用的是同一密钥(SIGN-09)。来源:为应用签名、Play App Signing。

代码级检查(PLAY-12、PRIV-01 到 PRIV-06、PROT-02 到 PROT-04)

工具会在 DEX 代码中查找特定 API 的引用,并记录每个 API 是哪个类调用的。

  • 自更新(PLAY-12):申请了 REQUEST_INSTALL_PACKAGES、调用了 PackageInstaller,并且带有 .apk 下载地址的构建,按拒审报告。Google Play 不允许应用绕开 Play 自身的更新机制自行更新,请改用 In-App Updates API。
  • 广告 ID(PRIV-03):以 API 33 及以上为目标、有广告或统计 SDK,却没有声明 com.google.android.gms.permission.AD_ID 的应用,拿到的广告 ID 是全零。所有应用都必须在 Play Console 填写广告 ID 声明。
  • 设备标识(PRIV-04):调用 getImei、getDeviceId 或 Build.getSerial 会被标出,因为 Play 禁止把持久标识与个人数据关联。
  • 已安装应用(PRIV-05):Play 把已安装应用清单视为个人敏感数据,采集这份清单会被标出。
  • 账号删除(PRIV-06):识别到登录类 SDK 时,提醒允许注册账号的应用必须同时提供应用内和网页两种删除途径。
  • Data safety 草稿(PRIV-02):根据权限和 SDK 类别生成一份数据类型清单,用来对照 Data safety 的填写。
  • 加载代码(PROT-04):运行时加载代码,同时存在远程 .dex/.jar/.so 地址的,按拒审报告,因为 Play 不允许从 Google Play 以外获取可执行代码。请改用 Play Feature Delivery。
  • R8 与 Play Integrity(PROT-02、PROT-03):没有开启 R8、没有接入 Play Integrity 都只是建议,结果会说明收益和风险,不是缺陷。

来源:设备和网络滥用、广告 ID、用户数据、账号删除。

应用防护(PROT-01)

加壳和加固是保护代码的正当手段,工具不把它们当作问题。按库文件名识别到商业防护运行库时,报告会说明与审核相关的利弊:壳的启动代码在启发式扫描引擎看来可能像恶意软件的打包器;带签名自校验的防护在 Play App Signing 下可能失效;Google Play 不允许从 Play 以外下载可执行代码。这条结果只是建议,不是缺陷。

文件里看不出的事

一份没有问题的报告只覆盖发布包本身。Play Console 审核的不止这些,下面几项文件检查看不到,请单独核对:

  • Data safety 表单:每个 SDK 收集的数据都要与申报一致。PRIV-02 会根据权限,以及从 Manifest、文件和 DEX 中识别出的 SDK,生成一份对照草稿;以各 SDK 自己的数据披露文档为准。
  • 隐私政策与账号删除:可公开访问的隐私政策链接;如果用户可以注册账号,要提供应用内和网页两种删除途径。
  • 商店素材:标题、图标、截图和描述不得误导或冒充他人。
  • 测试要求:2023-11-13 之后注册的个人开发者账号,申请正式版之前需要至少 12 名测试者连续参加 14 天的封闭测试。
  • 运行时行为:对审核人员和普通用户的行为必须一致,不得从 Google Play 以外下载可执行代码。

本工具的结果不代表 Google 的审核结论。如果需要在 Android Studio 里基于源码的提示,Google 还提供 Play Policy Insights。

文件只留在你的电脑上

框架把文件交给一个 Web Worker,它只读取检查需要的部分:ZIP 目录、Manifest、资源表和几个被引用的 XML 文件、每个原生库开头的一小段、版本文件以及签名数据。Worker 里没有任何网络代码,它自己的 Content-Security-Policy 也禁止联网。分析结束后发送的统计事件只包含粗粒度取值(文件类型、大小区间、耗时区间、结果和未通过的检查数量),绝不包含文件名、包名、哈希或任何文件内容。框架把事件交给本页,由本页发送。详见隐私政策。

报告显示之后,Worker 还会按 4 MB 一段计算整个文件的 SHA-256。旁边有一个在 VirusTotal 上搜索这个哈希的链接。它只是一个普通链接:你点击之前不会发出任何请求,点击之后 VirusTotal 也只会从地址里拿到这个哈希。按哈希查询是查一个版本最稳妥的方式;把未发布的版本上传到公开扫描平台,可能会让文件被第三方获取。

  • 检查器运行在一个单独的框架(iframe)里,来源是 tools.rea-reverse.com,在你的设备上运行。
  • 这个页面在正文下方展示一个广告。广告脚本运行在 rea-reverse.com 上,而框架属于另一个源(origin),浏览器不允许广告脚本或本页的任何其他脚本读取你选择的文件或检查报告。
  • 框架的内容安全策略拦截它的脚本能发起的所有请求(connect-src 'none',也不加载任何第三方资源)。框架不能自行打开窗口或让本页跳转;只有你点击报告里的链接时才会打开页面。它传给本页的只有自身高度和上面说的统计事件。
  • 不想要任何广告和统计?在单独页面打开检查器。

如何自己验证

  1. 打开浏览器开发者工具的 Network(网络) 面板,加载本页。发往 tools.rea-reverse.com 的请求就是框架:它的 HTML、样式、字体和脚本,以及 Worker 脚本 /_astro/apk-worker-*.js。发往 Google 域名的请求是本页的广告。
  2. 清空日志,然后选择文件并完成一次检查。在过滤框里输入 domain:tools.rea-reverse.com:新出现的请求只有来自 tools.rea-reverse.com 的 Worker 脚本和它加载的代码块:工具会为下一个文件预先启动一个新的 Worker。它们都不带你的文件。广告请求可能还会继续,但它们来自本页,不带框架里的任何内容。
  3. 点开来自 tools.rea-reverse.com 的 play-compliance-checker/ 文档,查看 Headers:它的 Content-Security-Policy 里有 connect-src 'none' 和 frame-ancestors https://rea-reverse.com。在 Chrome 里,Application(应用)> Frames 也能看到框架的源和策略。Worker 运行在 default-src 'none'; script-src 'self'; connect-src 'none' 这条策略下。
  4. 检查隔离:在 Console(控制台) 里,上下文选 top,运行 document.getElementById('tool-frame').contentDocument,结果是 null;frames[0].document 会抛出 SecurityError。广告脚本拿到的也是这个结果。
  5. 或者先打开页面再断网,然后做检查,照样能用,哈希也照样算得出。

对应的命令行

用 build-tools 36.1.0 的 aapt2 读出 Play 管理中心会看的目标 API 和权限(有删节):

$ aapt2 dump badging com.vincentengelsoftware.vesandroidimagecompare_51.apk
package: name='com.vincentengelsoftware.vesandroidimagecompare' versionCode='51' versionName='2.3.6' platformBuildVersionName='16' platformBuildVersionCode='36' compileSdkVersion='36' compileSdkVersionCodename='16'
minSdkVersion:'28'
targetSdkVersion:'36'
uses-permission: name='android.permission.CAMERA'
uses-permission: name='android.permission.REORDER_TASKS'
…

签名检查。minSdk 是 28 时,apksigner 只需要也只校验 v3;让它按更老的设备校验,就能看到 v2:

$ apksigner verify --print-certs -v com.vincentengelsoftware.vesandroidimagecompare_51.apk
Verifies
Verified using v1 scheme (JAR signing): false
Verified using v2 scheme (APK Signature Scheme v2): false
Verified using v3 scheme (APK Signature Scheme v3): true
…
Signer #1 certificate DN: CN=FDroid, OU=FDroid, O=fdroid.org, L=ORG, ST=ORG, C=UK
Signer #1 certificate SHA-256 digest: 40aab1da704985cd5f6b7e036a5c91706500c8542d3faea7e560d59ee4c9e5ab
…
$ apksigner verify --min-sdk-version 24 -v com.vincentengelsoftware.vesandroidimagecompare_51.apk
Verifies
Verified using v1 scheme (JAR signing): false
Verified using v2 scheme (APK Signature Scheme v2): true
Verified using v3 scheme (APK Signature Scheme v3): true
…

ZIP 对齐(SIGN-08):targetSdk 30 及以上的应用,resources.arsc 必须不压缩存储并按 4 字节对齐。(OK) 后面没有 compressed,表示不压缩且已对齐:

$ zipalign -c -P 16 -v 4 com.vincentengelsoftware.vesandroidimagecompare_51.apk
Verifying alignment of com.vincentengelsoftware.vesandroidimagecompare_51.apk (4)...
…
    2280 classes.dex (OK)
…
 1279072 resources.arsc (OK)
…
Verification successful

常见问题

有没有能在上传前运行的 Google Play 政策检查工具?

这个页面就是:它在浏览器里读取发布用的 APK 或 AAB,对照能从文件里读出来的 Play 要求逐项检查,文件不上传。Play 管理中心的预发布报告要等你把包上传到测试轨道之后才会运行。

它能查出哪些常见的 Google Play 拒审原因?

目标 API 级别低于当前要求(PLAY-01)、原生库没有按 16 KB 对齐(PLAY-02、PLAY-03)、需要提交声明表的受限权限(PLAY-08 到 PLAY-17)、没有声明类型的前台服务(PLAY-15),以及可调试构建和调试证书(PLAY-06、SIGN-01)。

Play 管理中心说目标 API 级别不达标被拒,要改到多少?

按这里的规则,手机和平板从 2026-08-31 起要求 targetSdkVersion 36;Wear OS 和 Automotive 要 35,TV 和 XR 要 34。PLAY-01 会把文件里的值和要求的级别并排列出。

Google Play 的 16 KB 页面大小要求什么时候生效?

这里的规则在 2027-02-01 之前把未对齐的 64 位原生库算作高风险,之后算作拒审。在“按这一天生效的规则体检”里选一个更晚的日期,就能看到截止日期之后的报告。

报告没有问题,是不是就一定能过审?

不是。它只说明文件里没有触发已知规则。声明表、Data safety 表单、商店素材和运行时行为都要单独审核;显示“未知”表示某个值读不出来,需要人工核对。

我同时在 Play 和 Play 以外分发,该选哪个场景?

选“两者都要”。报告会同时运行线下分发相关的检查:安装限制、Play Protect 警告、增强型反诈保护和 Android 开发者验证。

更新于

相关内容