跳过主要内容

Fix Google Play Obfuscation Below 25% in Capacitor Apps

通过启用R8、压缩未使用的DEX和发布Release App Bundle来在Capacitor安卓应用中通过谷歌Play的25%混淆率检查

文章来源

马丁·多纳迪厄

作者

瓦莱里娅

审阅者

乔丹

编辑

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

Google Play控制台现在会标记CapacitorAndroid应用 应用优化率低于我们的阈值经常伴有 混淆 混淆率一直停滞不前 3%。Google希望至少 25% 混淆、优化和压缩 强制执行将于2027年2月开始,如果无法解决,可能会影响可见性和发布选项。

在 Android vitals 中,警告的外观如下:

Google Play Console 中的 Android vitals 警告显示,混淆率为 3%,低于 25% 的应用优化阈值,修复日期为 2027 年 2 月

这是一个本机 Android DEX 问题。它与您的 Vue、React 或 Angular 包无关。 Capgo 实时更新也不会改变此分数。您需要在 Android Gradle 发布构建中修复它,然后上传一个新的 App Bundle。

Google Play 评估的内容是

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

指标 它的含义 典型的Capacitor导致低分的原因
混淆 类、字段和方法名称重命名为短名称 minifyEnabled 仍然 false
优化 R8将字节码内联、合并和重写 默认 proguard-android.txt 包含 -dontoptimize
压缩 Unused classes and methods removed Resource/code shrinking never turned on

Play reads r8.json when you build with the latest patch of Android Gradle Plugin 8.10 or higher. Otherwise it uses mapping.txt, then DEX heuristics. A Capacitor app shipped with minification off has almost no mapping file, so Play sees readable names and reports a few percent obfuscation (often leftover from already-obfuscated library AARs). That matches a 3% vitals score.

Official policy: Play Console technical quality requirements. Implementation detail: DEX code optimization and enable app optimization with R8.

Why 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 中的默认设置 . debug 构建应该保持这种方式。发布构建如果要发布到 Play 应该不这样您的 JavaScript 已经被 Vite 或 webpack 进行了压缩。Play 不会计算此项。只有原生 DEX 名称、未使用的原生 __CAPGO_KEEP_0__ 和 R8 优化才会计算

Your JavaScript is already minified by Vite or webpack. Play does not count that. Only native DEX names, unused native code, and R8 optimizations count.

打开

(Groovy 是 __CAPGO_KEEP_0__ 默认值) 并更改发布 android/app/build.gradle (Groovy is the Capacitor default) and change the android-template/app/build.gradle block:

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

If the module uses Kotlin DSL (build.gradle.kts):

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

Three details matter:

  1. minifyEnabled true 是实际运行 R8 (压缩 + 混淆 + 优化) 的东西。
  2. shrinkResources true 移除未使用的 Android 资源。它需要 minification。
  3. 对于这个 R8 配置,请使用 proguard-android-optimize.txt. proguard-android.txt ships -dontoptimize,它阻止了 R8 优化,并且 AGP 9 不支持。Play 允许任何压缩器;Capacitor 应用程序应该使用 R8 的优化默认值。请参阅 Capacitor Plugin AGP 9 Build Error Fix 如果一个插件仍然引用旧文件。

不要设置 minifyEnabled true on 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 — 保留 __CAPGO_KEEP_0__ 插件,而不是整个应用

R8 使用反射元数据。Capacitor 插件是通过注解发现的,因此需要保留规则。

R8 uses reflection metadata. Capacitor plugins are discovered by annotations, so they need keep rules. 您通常不会自己添加它们。 自 Capacitor 3.2.3 以来 @capacitor/android 运输 消费者 ProGuard 规则 保留:

  • @CapacitorPlugin@PluginMethod, 权限和活动回调
  • 扩展 com.getcapacitor.Plugin
  • Legacy @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 plugin directory__CAPGO_KEEP_0__ Capgo Consulting ,或请

Capacitor 咨询.

修复它。

官方

__CAPGO_KEEP_0__

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

没有签名配置 release 这些任务仍然成功,但会生成未签名的 .aab在 Android Studio 中签名它,然后上传到 Play Store。

在设备上安装一个 在设备上安装一个 ,然后在./gradlew assembleRelease是一个 Play 上传格式,而不是你手动安装的。 app/build/outputs/apk/release/在本地测试 native 插件(摄像头、推送、文件、计费、身份验证)。R8 的 bug 在 .aab debug 会话中不会显示。 npx cap run android 在上述 Gradle 命令之后(你现在在

),确认 R8 已经运行: android/protectedTokens

  • app/build/outputs/mapping/release/mapping.txt
  • app/build/outputs/mapping/release/configuration.txt
  • 在 AGP 8.10 或更高版本的最新补丁中 r8.json 在应用程序包中

这些 release 文件夹是默认的 Capacitor 变体。使用产品风味,映射在变体名称下(mapping/freeRelease/APK 位于 apk/<flavor>/release/ 例如 apk/free/release/).

如果 mapping.txt 缺失,您位于错误的变体文件夹中,CI 组装 debug或 R8 使用 -dontobfuscate重新检查 minifyEnabled true 和确保保持规则不会禁用混淆。 release

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

混淆的堆栈跟踪没有映射文件是无用的。保持 mapping.txt 每个 Play 版本:

  • Play 控制台: 测试和发布 → 应用程序包浏览器 → 下载 → 资产,然后上传 mapping.txt 如果它尚未附加
  • Firebase Crashlytics / Sentry: 将相同的映射作为 CI 一部分上传。

Android Studio / AGP 经常将映射嵌入到 .aab.仍然在 Assets 选项卡上验证后第一次优化上传。

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

上传新的 .aab 到一个内部测试跟踪(不需要刷新分数的生产环境). 打开:

  1. 测试和发布 → 应用程序包浏览器 为该版本
  2. DEX大小加上混淆/优化/压缩百分比
  3. 监控和改进 → Android vitals 新版本发布后,Play分析的是

您需要 25%在每个 三个指标中,不仅仅是混淆。启用R8通常会将__CAPGO_KEEP_0__应用从单位数字混淆率提升到所有三个指标的25%以上。 proguard-android-optimize.txt usually jumps a Capacitor app from single-digit obfuscation to well above 25% on all three.

强制执行 25% on each of the three metrics, not only obfuscation. Enabling R8 with 当DEX超过10MB时,应用程序的25%阈值(游戏为50MB)。即使低于该阈值,修复它仍然值得:DEX更小,占用内存更少,启动速度更快。

如果您仍然低于25%

R8已启用,但Play(或本地分析器)仍显示弱分数。广泛保留规则是通常遗留的规则。

  1. 打开 R8配置分析器 如果您的Android Gradle插件版本为9.3或更高—— assembleRelease 然后写入 configanalyzer.html 紧接着 mapping.txt . 在AGP 9.2及更早版本中,跳过该HTML文件并使用 mapping.txtAPK分析器,以及Play的应用程序包浏览器。
  2. 按冻结应用程序的比例排序保留规则。无法编辑的库消费者规则是正常的。应用级别 -keep class com.foo.** { *; } 是不是的。
  3. 打开 Android Studio APK Analyzer .aab 在 Android Studio APK Analyzer 中选择大型 .dex 文件,切换脱混淆名称(需要 mapping.txt保持包大小巨大且可读的包是需要优化的包
  4. 更新仍然引用 proguard-android.txt的插件。该文件在 AGP 9 中阻止了优化,并且在旧版插件中是一个红旗

不要通过 minifyEnabled false 和盲目地依赖算法来修复低分数。Play 期望的优化是 和混淆 这并不能代替

JavaScript 压缩

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

如果您已经使用 Capgo 构建, 则更改 android/app/build.gradle 在仓库中。下一个云构建会捕获 R8。您不需要不同的 Play pipeline,只需使用 minification 生成的发布二进制文件。同样,如果您保留 GitHub Actions Android 构建必须组装工作流程 发布不是调试

常见问题

Will enabling R8 break my Capacitor plugins?

It can, if a plugin uses reflection and ships no consumer keep rules. Core Capacitor already keeps plugin classes. Test a release build. Add a Capgo 咨询 能证明我已经通过检查吗? Capgo __CAPGO_KEEP_0__

__CAPGO_KEEP_0__ npx cap run __CAPGO_KEEP_0__

No. That command uses a debug build with R8 off. Use bundleRelease / a signed Play upload.

We already set minifyEnabled true and still see 3%. 为什么?

-dontobfuscate, proguard-android.txt, android.enableR8.fullMode=false-keep 规则。确认 CI 已经上传了最小化的 AAB 文件,而不是旧的 artifact。

我们需要使用 ProGuard 代替 R8 吗?

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

检查清单

  • release { minifyEnabled true; shrinkResources true }
  • proguard-android-optimize.txt (不是 proguard-android.txt)
  • No -dontobfuscate / -dontoptimize / app-wide -keep class **
  • Capacitor 3.2.3+ so plugin consumer rules apply
  • Release build produces mapping.txt
  • Native plugins tested on a release install
  • New .aab 已上传; 在 App bundle explorer 中附加映射
  • 混淆、优化和缩小各自达到 25%+

那就是整个 Play Console 警告:Capacitor 左 R8 离开,Play 开始评分 DEX,且一行 release Gradle 更改加上一个商店上传即可修复。

继续从 Fix Google Play Obfuscation Below 25% in Capacitor Apps 中

如果您正在使用 Fix Google Play Obfuscation Below 25% in Capacitor Apps 来规划 Android 商店发布,连接它 Capgo 原生构建 __CAPGO_KEEP_0__ 构建 Capgo CI/CD __CAPGO_KEEP_0__ CI/CD CI/CD 集成 __CAPGO_KEEP_0__ 构建 Automatic Capacitor Android build with GitHub actions __CAPGO_KEEP_0__ 咨询 Capgo Consulting 马丁·多纳迪尤

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

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

来自马丁的专业支持

立即开始

最新博客文章

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