capacitor-android-dex-optimization
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseCapacitor Android: DEX Code Optimization
Capacitor Android:DEX 代码优化
Enable R8 in a Capacitor Android app and add the keep rules a Capacitor app needs so that the release build passes the Google Play DEX code optimization requirement without crashing at startup.
The Android project that generates sets , so R8 never runs and Google Play measures close to 0% obfuscation, optimization and shrinking. From February 2027, Google Play requires at least 25% in each category for apps with more than 10 MB of DEX code. Play reads the numbers from the file inside the app bundle for apps built with AGP 8.10 or newer.
npx cap add androidminifyEnabled falser8.json在 Capacitor Android 应用中启用 R8,并添加 Capacitor 应用所需的 keep 规则,使 release 构建能够通过 Google Play DEX 代码优化要求,同时避免启动时崩溃。
npx cap add androidminifyEnabledfalser8.jsonPrerequisites
前置条件
| Requirement | Version |
|---|---|
| Capacitor | 6+ |
| Android Gradle Plugin | 8.0+ (8.10+ for the |
| JDK | 17 for Capacitor 6 and 7, 21 for Capacitor 8 |
| installed, with a device or emulator connected for Step 5 |
The project must be a Capacitor app (not a plugin) with an existing directory.
android/| 要求 | 版本 |
|---|---|
| Capacitor | 6+ |
| Android Gradle Plugin | 8.0+(步骤 6 中检查 |
| JDK | Capacitor 6 和 7 使用 17,Capacitor 8 使用 21 |
| 已安装,并为步骤 5 连接设备或模拟器 |
项目必须是 Capacitor app(而不是 plugin),并且已有 目录。
android/Agent Behavior
Agent 行为
- Inspect before editing. Read the current Gradle and ProGuard configuration first (Step 1). Never overwrite existing rules in ; append to them.
android/app/proguard-rules.pro - Keep rules narrow. Never add or
-keep class com.getcapacitor.** { *; }. Broad rules block the optimization that Google Play measures.-dontobfuscatealready ships consumer rules for plugin classes and their annotated methods.@capacitor/android - Only release builds run R8. Debug builds never show whether the rules are complete. Every verification step uses a signed release build.
- Read before pasting it. A
missing_rules.txtrule is correct only for a class a plugin probes for at runtime (Step 4).-dontwarn
- 编辑前先检查。 首先读取当前的 Gradle 和 ProGuard 配置(步骤 1)。绝不覆盖 中已有的规则;应将新规则追加到其中。
android/app/proguard-rules.pro - keep 规则应尽量精确。 绝不添加 或
-keep class com.getcapacitor.** { *; }。宽泛规则会阻止 Google Play 所统计的大部分优化。-dontobfuscate已经提供 consumer rules,用于保留插件类及其带注解的方法。@capacitor/android - 只有 release 构建会运行 R8。 Debug 构建无法反映规则是否完整。每个验证步骤都应使用已签名的 release 构建。
- 粘贴前先读取 。 只有当插件会在运行时探测某个类时,对应的
missing_rules.txt规则才是正确的(步骤 4)。-dontwarn
Procedures
操作步骤
Step 1: Analyze the Project
步骤 1:分析项目
-
Verify the project is a Capacitor app:lists
package.jsonin@capacitor/androidand thedependenciesdirectory exists. Ifandroid/is missing, abort and inform the user.android/ -
Read theversion from
@capacitor/core. Record the major version.package.json -
Read the AGP version from:
android/build.gradlegroovyclasspath 'com.android.tools.build:gradle:8.13.2'If the major version is below 8, abort and direct the user to theskill first. Record whether the version is 8.10 or newer (this decides whether Step 6 applies).capacitor-app-upgrades -
Read thebuild type in
release. Record the values ofandroid/app/build.gradle,minifyEnabled(if present) and theshrinkResourcesline.proguardFiles -
Readand record every existing rule.
android/app/proguard-rules.pro -
Readand record whether
android/gradle.propertiesis set. If it is set toandroid.enableR8.fullMode, inform the user that the keep rule in Step 3 makes this setting unnecessary and offer to remove it, because full mode produces higher optimization numbers.false -
Inventory the installed Capacitor plugins from
package.json. Match these prefixes:dependencies@capacitor/*- and
@capawesome/*@capawesome-team/* @capacitor-community/*@capacitor-firebase/*@capacitor-mlkit/*@revenuecat/*- Any other package with in its
"capacitor"package.jsonarraykeywords
Record each plugin's package name. Step 3 uses this list.
-
验证项目是 Capacitor app:的
package.json中包含dependencies,并且存在@capacitor/android目录。如果缺少android/,则中止操作并告知用户。android/ -
从中读取
package.json版本。记录其主版本号。@capacitor/core -
从中读取 AGP 版本:
android/build.gradlegroovyclasspath 'com.android.tools.build:gradle:8.13.2'如果主版本低于 8,则中止操作,并首先引导用户使用skill。记录该版本是否为 8.10 或更高版本,这将决定步骤 6 是否适用。capacitor-app-upgrades -
读取中的
android/app/build.gradlebuild type。记录release、minifyEnabled(如果存在)以及shrinkResources行的值。proguardFiles -
读取,并记录每一条已有规则。
android/app/proguard-rules.pro -
读取,记录是否设置了
android/gradle.properties。如果设置为android.enableR8.fullMode,告知用户步骤 3 中的 keep 规则会使此设置变得不再必要,并主动询问是否将其移除,因为 full mode 能产生更高的优化数值。false -
根据的
package.json盘点已安装的 Capacitor 插件。匹配以下前缀:dependencies@capacitor/*- 和
@capawesome/*@capawesome-team/* @capacitor-community/*@capacitor-firebase/*@capacitor-mlkit/*@revenuecat/*- 任何其他 的
package.json数组中包含keywords的包capacitor
记录每个插件的 package name。步骤 3 会使用此列表。
Step 2: Enable R8
步骤 2:启用 R8
In , update the build type. Replace with and replace with :
android/app/build.gradlereleaseminifyEnabled falseminifyEnabled trueproguard-android.txtproguard-android-optimize.txtdiff
android {
buildTypes {
release {
- minifyEnabled false
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ minifyEnabled true
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}proguard-android.txt-dontoptimizeshrinkResources truecapacitor.config.tssmallIcon在 中更新 build type。将 替换为 ,并将 替换为 :
android/app/build.gradlereleaseminifyEnabled falseminifyEnabled trueproguard-android.txtproguard-android-optimize.txtdiff
android {
buildTypes {
release {
- minifyEnabled false
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ minifyEnabled true
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}proguard-android.txt-dontoptimizeshrinkResources truecapacitor.config.tssmallIconStep 3: Add Keep Rules
步骤 3:添加 Keep 规则
-
If the Capacitor version recorded in Step 1 is below 8.6.0, append the Capacitor annotation rule to. Skip this if the file already contains the exact rule or if the app is on Capacitor 8.6.0 or newer, which ships the rule in its consumer rules:
android/app/proguard-rules.prodiff+# Capacitor annotations: required below Capacitor 8.6.0 in R8 full mode (ionic-team/capacitor#8589) +-keep @interface com.getcapacitor.** { *; }R8 full mode (the default since AGP 8.0) strips annotations from classes that are not explicitly kept. Before Capacitor 8.6.0,kept the classes annotated with@capacitor/androidbut not the annotation types themselves. Without the rule, the build passes and the app crashes on startup with a@CapacitorPlugininNullPointerExceptionthe first time a plugin checks its permissions. The rule coverscom.getcapacitor.Plugin.getPermissionStates,@CapacitorPlugin,@Permission,@PermissionCallback,@ActivityCallbackand the legacy@PluginMethod.@NativePlugin -
For each plugin recorded in Step 1, look up its ProGuard rules and append them toif they are missing:
android/app/proguard-rules.pro- Read the plugin's README in and search for a
node_modules/<package>/README.md,ProguardorProGuardsection.R8 - For Capawesome, Capacitor Firebase, Capacitor MLKit and RevenueCat plugins, the skill ships a reference file per plugin in its
capacitor-pluginsdirectory with the same section.references/
Most plugins ship no rules of their own because the Capacitor consumer rules cover them. A plugin documents a rule only when it relies on reflection or serialization. Example for the Capawesome SQLite plugin:diff+# Capawesome plugins that rely on reflection +-keep class io.capawesome.capacitorjs.plugins.** { *; } - Read the plugin's README in
-
Do not add rules forclasses,
com.getcapacitor.**methods, Firebase or Play Services.@JavascriptInterfacedeclares its own consumer rules that keep every class annotated with@capacitor/androidtogether with its@CapacitorPlugin,@PluginMethodand@PermissionCallbackmethods. AGP's default rules keep@ActivityCallbackmethods, and the large SDKs ship consumer rules of their own.@JavascriptInterface
-
如果步骤 1 中记录的 Capacitor 版本低于 8.6.0,将 Capacitor 注解规则追加到。如果文件中已经包含完全相同的规则,或者应用使用的是 Capacitor 8.6.0 或更高版本,则跳过此步骤,因为后者的 consumer rules 已自带该规则:
android/app/proguard-rules.prodiff+# Capacitor annotations: required below Capacitor 8.6.0 in R8 full mode (ionic-team/capacitor#8589) +-keep @interface com.getcapacitor.** { *; }R8 full mode(自 AGP 8.0 起为默认值)会从未显式保留的类中移除注解。在 Capacitor 8.6.0 之前,会保留使用@capacitor/android标注的类,但不会保留注解类型本身。如果没有此规则,构建会通过,但当某个插件首次检查权限时,应用会在@CapacitorPlugin中因com.getcapacitor.Plugin.getPermissionStates而启动崩溃。该规则涵盖NullPointerException、@CapacitorPlugin、@Permission、@PermissionCallback、@ActivityCallback以及旧版的@PluginMethod。@NativePlugin -
对步骤 1 中记录的每个插件,查找其 ProGuard 规则;如果缺少规则,则将其追加到:
android/app/proguard-rules.pro- 读取插件的 ,搜索
node_modules/<package>/README.md、Proguard或ProGuard章节。R8 - 对于 Capawesome、Capacitor Firebase、Capacitor MLKit 和 RevenueCat 插件,skill 会在其
capacitor-plugins目录中为每个插件提供一个包含相同章节的参考文件。references/
大多数插件不会自带规则,因为 Capacitor consumer rules 已覆盖这些插件。只有当插件依赖反射或序列化时,其文档才会提供规则。以下是 Capawesome SQLite 插件的示例:diff+# Capawesome plugins that rely on reflection +-keep class io.capawesome.capacitorjs.plugins.** { *; } - 读取插件的
-
不要为类、
com.getcapacitor.**方法、Firebase 或 Play Services 添加规则。@JavascriptInterface声明了自己的 consumer rules,会保留每个使用@capacitor/android标注的类及其@CapacitorPlugin、@PluginMethod和@PermissionCallback方法。AGP 的默认规则会保留@ActivityCallback方法,这些大型 SDK 也各自提供了 consumer rules。@JavascriptInterface
Step 4: Build a Signed Release APK
步骤 4:构建已签名的 Release APK
Debug builds never run R8, and a release build has to be signed to install. Sign the local release build with the Android debug keystore through the properties that Android Studio injects into Gradle. This does not change :
build.gradlebash
cd android
./gradlew assembleRelease \
-Pandroid.injected.signing.store.file=$HOME/.android/debug.keystore \
-Pandroid.injected.signing.store.password=android \
-Pandroid.injected.signing.key.alias=androiddebugkey \
-Pandroid.injected.signing.key.password=androidIf does not exist, run any debug build once () to create it, then retry.
$HOME/.android/debug.keystore./gradlew assembleDebugIf the build fails with errors, R8 writes a ready-to-paste file to . Read each entry and decide per class:
Missing classandroid/app/build/outputs/mapping/release/missing_rules.txt| Case | Action |
|---|---|
The plugin compiles against the library as | Add the |
| The plugin calls the class unconditionally | Do not add |
Known optional backends:
diff
+# Optional SQLite backends that the Capawesome SQLite plugin probes for at runtime
+-dontwarn io.requery.android.database.**
+-dontwarn net.zetetic.database.**The Capawesome SQLite plugin compiles against both SQLCipher () and requery's () and bundles only the one selected in , so both lines are correct for that plugin.
net.zetetic.database.**sqlite-androidio.requery.android.database.**android/variables.gradle-dontwarnRebuild after every rule change until succeeds.
assembleReleaseDebug 构建从不运行 R8,而 release 构建必须签名后才能安装。通过 Android Studio 注入 Gradle 的 properties,使用 Android debug keystore 对本地 release 构建进行签名。这不会改动 :
build.gradlebash
cd android
./gradlew assembleRelease \
-Pandroid.injected.signing.store.file=$HOME/.android/debug.keystore \
-Pandroid.injected.signing.store.password=android \
-Pandroid.injected.signing.key.alias=androiddebugkey \
-Pandroid.injected.signing.key.password=android如果 不存在,请先运行一次任意 debug 构建()以创建它,然后重试。
$HOME/.android/debug.keystore./gradlew assembleDebug如果构建因 错误而失败,R8 会将可直接粘贴的文件写入 。读取每个条目,并按类进行判断:
Missing classandroid/app/build/outputs/mapping/release/missing_rules.txt| 情况 | 操作 |
|---|---|
插件以 | 将对应的 |
| 插件无条件调用该类 | 不要添加 |
已知可选后端:
diff
+# Optional SQLite backends that the Capawesome SQLite plugin probes for at runtime
+-dontwarn io.requery.android.database.**
+-dontwarn net.zetetic.database.**Capawesome SQLite 插件同时针对 SQLCipher()和 requery 的 ()进行编译,但只会将 中选定的一个打入包,因此该插件使用这两条 规则都是正确的。
net.zetetic.database.**sqlite-androidio.requery.android.database.**android/variables.gradle-dontwarn每次更改规则后都重新构建,直到 成功。
assembleReleaseStep 5: Verify on a Device
步骤 5:在设备上验证
-
Confirm a device or emulator is connected with. If none is connected, hand the following checks to the user with the exact commands.
adb devices -
Install the release APK:bash
adb install -r app/build/outputs/apk/release/app-release.apk -
Clear logcat, launch the app, and watch for the failure signatures while it starts:bash
adb logcat -c adb logcat | grep -E 'FATAL EXCEPTION|ClassNotFoundException|NoSuchMethodException|NullPointerException'The annotation crash from Step 3 appears within the first second. Afterwards, ask the user to run every flow that requests a permission or waits for another activity (camera, file picker, settings screen, sign-in) and watch logcat during each one. -
Openand confirm that the plugin classes recorded in Step 1 still appear under their original names. Search for the plugin's Android package, for example
android/app/build/outputs/mapping/release/mapping.txt. A renamed plugin class means a keep rule is missing. Tell the user to archiveio.capawesome.capacitorjs.pluginswith every release, since production stack traces need it.mapping.txt
-
使用确认已连接设备或模拟器。如果没有连接设备,则将以下检查和准确命令交给用户执行。
adb devices -
安装 release APK:bash
adb install -r app/build/outputs/apk/release/app-release.apk -
清空 logcat,启动应用,并在启动期间观察失败特征:bash
adb logcat -c adb logcat | grep -E 'FATAL EXCEPTION|ClassNotFoundException|NoSuchMethodException|NullPointerException'步骤 3 中提到的注解崩溃会在第一秒内出现。随后,请让用户运行每个需要请求权限或等待其他 activity 的流程,例如相机、文件选择器、设置界面和登录,并在每个流程运行期间监控 logcat。 -
打开,确认步骤 1 中记录的插件类仍以原始名称出现。搜索插件的 Android package,例如
android/app/build/outputs/mapping/release/mapping.txt。插件类被重命名意味着缺少相应的 keep 规则。告知用户每次发布都必须归档io.capawesome.capacitorjs.plugins,因为生产环境中的 stack trace 需要使用它进行还原。mapping.txt
Step 6: Read the Play Numbers Before Uploading
步骤 6:上传前读取 Play 数值
Skip this step if the AGP version recorded in Step 1 is below 8.10: older versions do not write , and Play computes the numbers itself.
r8.jsonBuild the app bundle with the same signing properties as Step 4 and read the R8 metadata from it:
bash
./gradlew bundleRelease \
-Pandroid.injected.signing.store.file=$HOME/.android/debug.keystore \
-Pandroid.injected.signing.store.password=android \
-Pandroid.injected.signing.key.alias=androiddebugkey \
-Pandroid.injected.signing.key.password=android
unzip -p app/build/outputs/bundle/release/app-release.aab BUNDLE-METADATA/com.android.tools/r8.jsonThe file reports the obfuscation, optimization and shrinking percentages that Play Console shows in the app bundle explorer for that upload. Each must be at least 25%. If a value is below 25%, search for broad rules (, , , ) and narrow them.
android/app/proguard-rules.pro-keep class **-dontobfuscate-dontoptimize-dontshrink如果步骤 1 中记录的 AGP 版本低于 8.10,则跳过此步骤:旧版本不会写入 ,而是由 Play 自行计算这些数值。
r8.json使用与步骤 4 相同的签名 properties 构建 app bundle,并从中读取 R8 元数据:
bash
./gradlew bundleRelease \
-Pandroid.injected.signing.store.file=$HOME/.android/debug.keystore \
-Pandroid.injected.signing.store.password=android \
-Pandroid.injected.signing.key.alias=androiddebugkey \
-Pandroid.injected.signing.key.password=android
unzip -p app/build/outputs/bundle/release/app-release.aab BUNDLE-METADATA/com.android.tools/r8.json该文件会报告 Play Console 的 app bundle explorer 针对本次上传所显示的混淆、优化和收缩百分比。每个百分比都必须至少达到 25%。如果某个值低于 25%,请在 中搜索宽泛规则(、、、),并将其收窄。
android/app/proguard-rules.pro-keep class **-dontobfuscate-dontoptimize-dontshrinkStep 7: Report
步骤 7:报告
Summarize for the user:
- The changes to and
android/app/build.gradle.android/app/proguard-rules.pro - Any rule added and why it is safe, and any missing dependency that was added instead.
-dontwarn - The three percentages from (if Step 6 ran).
r8.json - That must be archived per release. An Android App Bundle embeds it in
mapping.txt, so Play deobfuscates crash and ANR reports on its own. Only APK uploads need a manual upload in Play Console. The Firebase Crashlytics Gradle plugin uploads it automatically.BUNDLE-METADATA/ - That the release build is now a standing test target: rerun Step 5 before every upload and check again whenever a plugin is added.
missing_rules.txt
向用户总结以下内容:
- 对 和
android/app/build.gradle所做的更改。android/app/proguard-rules.pro - 添加了哪些 规则、这些规则为何安全,以及是否改为添加了缺失的依赖。
-dontwarn - 中的三个百分比(如果执行了步骤 6)。
r8.json - 每次发布都必须归档 。Android App Bundle 会将其嵌入
mapping.txt,因此 Play 会自动反混淆 crash 和 ANR 报告。只有上传 APK 时才需要在 Play Console 中手动上传。Firebase Crashlytics Gradle plugin 会自动上传该文件。BUNDLE-METADATA/ - Release 构建现在应作为固定测试目标:每次上传前都重新执行步骤 5,并在添加插件后再次检查 。
missing_rules.txt
Error Handling
错误处理
- App crashes on startup with at
NullPointerException: The app is on Capacitor below 8.6.0 and thecom.getcapacitor.Plugin.getPermissionStatesrule is missing from-keep @interface com.getcapacitor.** { *; }. Add it (Step 3) and rebuild, or upgrade to Capacitor 8.6.0, which ships the rule (ionic-team/capacitor#8646).android/app/proguard-rules.pro - Build fails with : Follow the
Missing class <name>decision table in Step 4.missing_rules.txt - Build fails because is not supported (AGP 9): Replace it with
proguard-android.txtas in Step 2.proguard-android-optimize.txt - A plugin method is not found at runtime () or a plugin class is renamed in
NoSuchMethodException: Add the plugin's documented keep rule from its README (Step 3, item 2). If the README has none, addmapping.txtfor that plugin only and report it to the user as a candidate for an upstream fix.-keep class <plugin Android package>.** { *; } - fails with
adb install: The release APK is unsigned. RerunINSTALL_PARSE_FAILED_NO_CERTIFICATESwith the fourassembleReleaseproperties from Step 4.-Pandroid.injected.signing.* - Permission checks return an empty result on Capacitor 8.5.2 or 8.5.3 without crashing: Capacitor 8.5.2 added a null check in that hides the crash but returns an empty permission map, and
getPermissionStates()still throws. The keep rule from Step 3 is still required on those versions.requestPermissions() - Resources missing at runtime after enabling : Resources referenced by name from JavaScript or
shrinkResourcesare invisible to the resource shrinker. List them incapacitor.config.tswithandroid/app/src/main/res/raw/keep.xml, or removetools:keep.shrinkResources true
- 应用启动时在 处发生
com.getcapacitor.Plugin.getPermissionStates崩溃:应用使用的 Capacitor 版本低于 8.6.0,并且NullPointerException中缺少android/app/proguard-rules.pro规则。添加该规则(步骤 3)并重新构建,或者升级到自带该规则的 Capacitor 8.6.0(ionic-team/capacitor#8646)。-keep @interface com.getcapacitor.** { *; } - 构建因 而失败:按照步骤 4 中
Missing class <name>的判断表处理。missing_rules.txt - 构建因不支持 而失败(AGP 9):按照步骤 2 的说明,将其替换为
proguard-android.txt。proguard-android-optimize.txt - 运行时找不到插件方法(),或插件类在
NoSuchMethodException中被重命名:从插件 README 中添加其明确记录的 keep 规则(步骤 3,第 2 项)。如果 README 中没有相应规则,则仅为该插件添加mapping.txt,并向用户说明这是一个可提交给上游修复的候选方案。-keep class <plugin Android package>.** { *; } - 因
adb install而失败:Release APK 未签名。使用步骤 4 中的四个INSTALL_PARSE_FAILED_NO_CERTIFICATESproperties 重新运行-Pandroid.injected.signing.*。assembleRelease - 在 Capacitor 8.5.2 或 8.5.3 上权限检查返回空结果,但没有发生崩溃:Capacitor 8.5.2 在 中添加了 null 检查,隐藏了崩溃但会返回空的权限 map,而
getPermissionStates()仍会抛出异常。这些版本仍然需要步骤 3 中的 keep 规则。requestPermissions() - 启用 后,运行时出现资源缺失:由 JavaScript 或
shrinkResources按名称引用的资源对资源收缩器不可见。使用capacitor.config.ts将这些资源列在tools:keep中,或者移除android/app/src/main/res/raw/keep.xml。shrinkResources true
Limitations
限制
- The skill verifies a local release build signed with the debug keystore. The Play Console numbers are only final for the bundle that is uploaded.
- Setting in
android.enableR8.fullMode=falsealso avoids the startup crash, but it lowers the optimization across the whole app and all its dependencies. The keep rule is the cheaper fix.android/gradle.properties - Capacitor 8.6.0 ships the annotation keep rule and a rule for and
@ActivityCallbackmethods on non-public base classes in its consumer rules. On 8.6.0 or newer, an existing@PermissionCallbackline in the app is redundant but harmless. Leave it in place.-keep @interface com.getcapacitor.** { *; }
- 该 skill 验证的是使用 debug keystore 签名的本地 release 构建。只有实际上传的 bundle 所对应的 Play Console 数值才是最终结果。
- 在 中设置
android/gradle.properties也能避免启动崩溃,但会降低整个应用及其所有依赖的优化程度。keep 规则是成本更低的修复方案。android.enableR8.fullMode=false - Capacitor 8.6.0 会在 consumer rules 中提供注解 keep 规则,以及针对非 public 基类上 和
@ActivityCallback方法的规则。在 8.6.0 或更高版本上,应用中已有的@PermissionCallback规则虽然多余,但无害。应将其保留。-keep @interface com.getcapacitor.** { *; }
Related Skills
相关 Skills
- — General Android troubleshooting and app configuration.
capacitor-app-development - — Per-plugin reference files, including the ProGuard rules a plugin documents.
capacitor-plugins - — Upgrade Capacitor and AGP to a version this skill supports.
capacitor-app-upgrades - — Capawesome Cloud runs the Gradle build as is, so a project with
capawesome-cloudproduces the minified app bundle with the mapping file embedded.minifyEnabled true
- — 常规 Android 故障排查和应用配置。
capacitor-app-development - — 按插件划分的参考文件,包括插件文档中记录的 ProGuard 规则。
capacitor-plugins - — 将 Capacitor 和 AGP 升级到此 skill 支持的版本。
capacitor-app-upgrades - — Capawesome Cloud 会按原样运行 Gradle 构建,因此启用了
capawesome-cloud的项目会生成压缩后的 app bundle,并在其中嵌入 mapping 文件。minifyEnabled true