跳过主要内容

修复Google Play混淆率低于25%的Capacitor应用

通过启用R8、压缩未使用的DEX和发布Release App Bundle来让Capacitor Android应用通过Google Play的25%混淆检查。

修复Capacitor应用中的Google Play混淆率低于25%

Google Play控制台现在会标记Capacitor Android应用 应用优化率低于我们的阈值,通常伴有 混淆 仍然存在 3%. Google 至少希望混淆、优化和缩小。执行开始于 25% 2027年2月 , 如果失败,可能会减少可见性和发布选项。警告看起来像这样在 Android vitals 中:

在 Android vitals 中,这个警告看起来是这样的:

这是一个本机 Android DEX 问题。它不是关于您的 Vue、React 或 Angular 包。

__CAPGO_KEEP_0__ Capgo Google 在测量

什么

Google Play检查您的Android App Bundle: DEX 在您的 Android App Bundle 中:编译好的 Java 和 Kotlin,包括 Capacitor,插件和 AndroidX。从 2027 年 2 月起,超过 10 MB 10 MB 25% 必须在所有三个方面达到:

指标 它的含义 典型Capacitor导致低分的原因
混淆 类、字段和方法名称重命名为短名称 minifyEnabled 仍然 false
优化 R8内联、合并和重写字节码 默认 proguard-android.txt 包含 -dontoptimize
压缩 未使用的类和方法被移除 资源/code压缩从未打开

Play读取 r8.json 当您使用Android Gradle Plugin 8.10或更高版本的最新补丁时,才会使用最新的补丁。否则,它使用 mapping.txt然后DEX heuristics。一个Capacitor应用,未启用minification,几乎没有映射文件,因此Play看到可读的名称并报告几百分比的混淆(通常来自已混淆的库AAR)。这与 3% vitals评分相符。

官方政策: Play Console技术质量要求. 实现细节: DEX code 优化 和 启用R8应用优化.

为什么Capacitor应用会失败此检查

The Capacitor Android template still ships release builds 没有 R8:

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

这是 android-template/app/build.gradle中的默认设置。调试构建应该保持这种方式。发布构建不应如此,如果您发布到Play。

您的 JavaScript 已经通过 Vite 或 webpack 进行了压缩。Play 不会计算此项。只有原生 DEX 名称、未使用的原生 code 和 R8 优化才会计算。

步骤 1 — 启用 R8 发布

打开 android/app/build.gradle (Groovy 是 Capacitor 的默认值) 并更改 发布 块:

buildTypes {
    release {
        minifyEnabled true
        shrinkResources true
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
}

如果模块使用 Kotlin DSL(build.gradle.kts):

buildTypes {
    getByName("release") {
        isMinifyEnabled = true
        isShrinkResources = true
        proguardFiles(
            getDefaultProguardFile("proguard-android-optimize.txt"),
            "proguard-rules.pro"
        )
    }
}

三个细节很重要:

  1. minifyEnabled true 这是实际运行 R8(缩小 + 混淆 + 优化)的内容。
  2. shrinkResources true 移除未使用的 Android 资源。它需要进行压缩。
  3. 为此 R8 配置使用 proguard-android-optimize.txt. proguard-android.txt 运输 -dontoptimize,阻止R8优化并导致AGP 9错误。Play允许任何压缩器;Capacitor 应用程序应使用R8的优化默认值。见 Capacitor 插件AGP 9构建错误修复 如果插件仍然引用旧文件。

不要设置 minifyEnabled true 在 debug. 只有发布时才会保持本地运行速度快,堆栈跟踪可读。

步骤2 — 不要禁用R8全模式

打开 android/gradle.properties 并删除此行,如果存在:

android.enableR8.fullMode=false

AGP 8+ 已经启用了全模式。留下该标志会限制优化。

也要搜索 android/app/proguard-rules.pro (和任何额外 -include 文件) 为:

-dontobfuscate
-dontoptimize
-dontshrink
-keep class ** { *; }

那些规则即使你翻转后也会保持低的Play评分 minifyEnabled.除非你有一个文档记录的临时原因,否则请删除它们

步骤 3 — 保持 Capacitor 插件,而不是整个应用

R8使用反射元数据。Capacitor插件通过注解被发现,因此它们需要保留规则。 R8 使用反射元数据。 __CAPGO_KEEP_0__ 插件通过注解被发现,因此需要保留规则 自 Capacitor 3.2.3, @capacitor/android ships 开始 将

  • @CapacitorPlugin 消费者 ProGuard 规则 @PluginMethod保留:
  • 继承的类 com.getcapacitor.Plugin
  • 遗留 @NativePlugin 和Cordova插件类

保持当前的Capacitor 6/7/8行,这样消费者规则才会生效。

在 android/app/proguard-rules.pro 仅 如果您可以在发布版中重现的崩溃中添加额外的规则。

# Good: one misbehaving plugin package
-keep class com.mycompany.myplugin.** { *; }

# Bad: this will tank obfuscation and shrinking
-keep class com.getcapacitor.** { *; }
-keep class ** { *; }

狭窄胜过广泛: Capgo 插件目录或询问 Capgo 咨询服务 __CAPGO_KEEP_0__咨询服务

官方Capacitor说明: 使用ProGuard.

步骤4 — 构建真实发布包

上下文:关于Capgo页面。角色:UI标签。位置:关于.astro页面。消息键`about_how_step_label`(关于如何步骤标签)。

调试APK仍会显示~0%混淆。Play只评估您上传的内容。

npm run build
npx cap sync android
cd android
./gradlew bundleRelease

从项目根目录: release 没有 .aab签名配置,

安装 发布 APK 在设备上安装一个./gradlew assembleRelease发布APK( app/build/outputs/apk/release/. An .aab 是Google Play上传格式,而不是您手动安装的内容。 npx cap run android 请在本地调试中测试原生插件(摄像头、推送、文件、计费、身份验证)。

R8错误不会在 android/debug会话中显示。

  • app/build/outputs/mapping/release/mapping.txt
  • app/build/outputs/mapping/release/configuration.txt
  • 在上述Gradle命令之后(您现在位于 r8.json ),确认R8是否已运行:

Those release 文件夹是默认的Capacitor变体。 通过产品风味,映射在变体名下(例如,variantName:"flavorName")。mapping/freeRelease/这些 apk/<flavor>/release/ 文件夹是默认的__CAPGO_KEEP_0__变体。 apk/free/release/).

If mapping.txt 您缺少了什么,可能是进入了错误的变体文件夹,CI已构建 debug,或者R8已运行 -dontobfuscate。请重新检查 minifyEnabled true 在 release 和保持规则不禁用混淆

步骤5 — 保持崩溃报告可读

上下文:关于Capgo页面。角色:UI标签。见于:关于.astro页面。消息键`about_how_step_label`(关于如何步骤标签) mapping.txt 混淆的堆栈跟踪在没有映射文件的情况下是无用的。保持

  • 每个Play版本: Play控制台:测试和发布→应用包浏览器→下载→资产 mapping.txt ,然后上传
  • Firebase Crashlytics / Sentry: 将相同的映射作为 CI 的一部分上传。

Android Studio / AGP 经常将映射嵌入到 .aab.

第 6 步 — 上传并重新检查 Play

上下文: 关于 Capgo 页面。角色: UI 标签。位置: about.astro 页面。消息键 `about_how_step_label` (关于如何步骤标签)。 .aab 上传新的

  1. 到内部测试跟踪(不需要刷新分数)。打开: 测试和发布 → 应用程序包浏览器
  2. 为该版本
  3. DEX 大小加上混淆 / 优化 / 缩小百分比 监控和改进 → Android 重要指标

您需要 25% 在每个 三个指标中,不仅仅是混淆。启用 R8 后, proguard-android-optimize.txt 通常会将一个 Capacitor 应用从单位数字混淆率提升到所有三个指标的 25% 以上。

仅限 Google Play 仅限 强制执行

25% 的底线,当 DEX 大于 10 MB 时,对于应用程序(50 MB 对于游戏)。即使低于该底线,修复它仍然值得:更小的 DEX、更少的内存、更快的启动。

如果您仍然低于 25%

  1. Open 打开 R8 配置分析器 assembleRelease 然后写入 configanalyzer.html 紧接着 mapping.txt. 在 AGP 9.2 及之前版本中,跳过该 HTML 文件并使用 mapping.txt,APK 分析器和 Play 应用程序包浏览器。
  2. 按冻结应用程序的百分比排序保留规则。无法编辑的库消费者规则是正常的。应用级别 -keep class com.foo.** { *; } 不是。
  3. 打开 .aab 文件,并切换脱冻名(需要 .dex 包仍然巨大且可读的包是需要停止全面保留的包。 mapping.txt更新仍然引用
  4. 的插件。该文件在 AGP 9 中阻止优化,并且在旧版插件中是一个红旗。 proguard-android.txt不要通过缩小 DEX 来修复低分数

不要通过减少DEX大小来“修复”低分数 minifyEnabled false 并希望他uristic变化。 Play 想要缩小、优化, 并且 混淆。

这并不会取代

  • JavaScript 压缩 在 vite.config.ts 这不会移动这个指标。
  • Capgo 实时更新 将 HTML/JS/CSS 发送。它们不会重建 DEX。商店二进制文件中启用 R8 后,您仍然可以通过无线电发送 JS 修复。混淆检查本身需要一个本机 Play 上传。
  • 16 KB 页面大小 这是一个单独的 Play 本机要求。请参见 Android 16 KB 页面大小.

如果您已经使用 Capgo 构建, android/app/build.gradle 在仓库中进行更改 GitHub Android 应用程序构建动作__CAPGO_KEEP_0__ Actions Android builds :工作流程必须汇编发布

,而不是调试。

启用 R8 会破坏我的 Capacitor 插件吗?

会启用R8破坏我的Capacitor插件吗? narrow 只为崩溃的包保留规则。如果插件未维护, Capgo 咨询 可以 fork 并保持它构建。

Does npx cap run 证明我通过了检查吗?

不。该命令使用一个带有 R8 关闭的 debug 构建。使用 bundleRelease / 一个签名的 Play 上传。

我们已经设置 minifyEnabled true 仍然看到 3%。为什么?

查找 -dontobfuscate, proguard-android.txt, android.enableR8.fullMode=false, 并且 -keep 规则。确认 CI 上传了最小化的 AAB,而不是一个旧的 artifact。

我们是否需要 ProGuard 代替 R8?

不需要 ProGuard,R8 是 Android Gradle Plugin 缩小器。它读取 ProGuard 风格规则文件。Google 的 Play 文档允许任何缩小器;R8 是应用程序应该使用的 Capacitor。

检查清单

  • release { minifyEnabled true; shrinkResources true }
  • proguard-android-optimize.txt (不 proguard-android.txt)
  • 不 -dontobfuscate / -dontoptimize / 全局 -keep class **
  • Capacitor 3.2.3+ 所有插件消费者规则都适用
  • 发布构建产生 mapping.txt
  • 原生插件在发布安装中测试
  • 新 .aab 上载; 映射附加在 App Bundle 浏览器中
  • 混淆、优化和缩小各自为 25%+

这是整个Play控制台警告:Capacitor 左 R8 离开,Play 开始评分 DEX,且一行发布 Gradle 变更加上一个商店上传即可修复。

继续修复Google Play混淆率低于25%的应用程序Capacitor

如果您正在使用 修复Google Play混淆率低于25%的应用程序Capacitor 来规划Android商店发布,连接它到 Capgo 本机构建 为发布应用程序包 Capgo CI/CD 为上传管道 CI/CD集成 上下文:Capgo Builder / 本机云构建产品页面。角色:短UI标签或导航项。消息键`native_build_feature_ci_cd`(Native Build Feature Ci Cd)。 自动 Capacitor Android 构建与 GitHub 动作 对于自主托管管道,以及 Capgo 咨询 如果一个插件在启用 R8 后会破坏。

Capacitor 应用的即时更新

当 web 层 bug 活跃时,通过 Capgo 发布修复,而不是等待几天的应用商店审批。用户在后台接收更新,而原生变化仍然在正常审批路径中。

最新博客文章

Capgo 为您提供创建真正专业的移动应用所需的最佳见解。