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

这是一个本机 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:
minifyEnabled true是实际运行 R8 (压缩 + 混淆 + 优化) 的东西。shrinkResources true移除未使用的 Android 资源。它需要 minification。- 对于这个 R8 配置,请使用
proguard-android-optimize.txt.proguard-android.txtships-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.txtapp/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 到一个内部测试跟踪(不需要刷新分数的生产环境). 打开:
- 测试和发布 → 应用程序包浏览器 为该版本
- DEX大小加上混淆/优化/压缩百分比
- 监控和改进 → 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(或本地分析器)仍显示弱分数。广泛保留规则是通常遗留的规则。
- 打开 R8配置分析器 如果您的Android Gradle插件版本为9.3或更高——
assembleRelease然后写入configanalyzer.html紧接着mapping.txt. 在AGP 9.2及更早版本中,跳过该HTML文件并使用mapping.txtAPK分析器,以及Play的应用程序包浏览器。 - 按冻结应用程序的比例排序保留规则。无法编辑的库消费者规则是正常的。应用级别
-keep class com.foo.** { *; }是不是的。 - 打开 Android Studio APK Analyzer
.aab在 Android Studio APK Analyzer 中选择大型.dex文件,切换脱混淆名称(需要mapping.txt保持包大小巨大且可读的包是需要优化的包 - 更新仍然引用
proguard-android.txt的插件。该文件在 AGP 9 中阻止了优化,并且在旧版插件中是一个红旗
不要通过 minifyEnabled false 和盲目地依赖算法来修复低分数。Play 期望的优化是 和混淆 这并不能代替
JavaScript 压缩
- and 在
vite.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 马丁·多纳迪尤