メインコンテンツへスキップ

Capacitor アプリで Google Play の難読化率が25%未満になる問題を修正

R8を有効化し、未使用DEXを縮小してリリース用App Bundleを配布すれば、Capacitor AndroidアプリでGoogle Playの25%難読化チェックをパスできます。

Capgo ブログ用グラフィック: Capacitor アプリで Google Play の難読化率を 25% 未満に修正。Android vitals カードには 3% の難読化が表示され、R8 minifyEnabled が 25% に達している様子。

Play ConsoleがCapacitor Androidアプリに対して以下の理由で警告を出しています: アプリの最適化が基準を下回っています、多くの場合 難読化 残ってしまいます 3%. Googleは少なくとも 25% 難読化、最適化、およびコードの縮小を求めています。強制適用は 2027年2月から開始され、対応できない場合は露出度や公開オプションが制限される可能性があります。

Android vitalsでの警告表示は以下の通りです:

Google Play ConsoleのAndroid vitalsにおける警告。アプリの最適化しきい値である25%に対し、難読化が3%に留まっており、2027年2月までの修正が求められている状態。

これはネイティブAndroidのDEXに関する問題です。Vue、React、またはAngularのbundleの問題ではありません。 Capgo Live Updateもこのスコアには影響しません。Android Gradleのrelease buildで修正を行い、新しいApp Bundleをuploadしてください。

Googleの測定対象

Google Playが検査する DEX は、Android App Bundle内のコンパイル済みJavaおよびKotlin(Capacitor、プラグイン、AndroidXを含む)です。2027年2月より、 10 MB を超えるDEXを持つアプリは、次の3項目すべてを 25% 満たす必要があります:

メトリクス 意味 スコアが低くなる一般的な Capacitor の原因
難読化 クラス、フィールド、メソッド名を短い名前にリネーム minifyEnabled 依然として false
最適化 R8はバイトコードのインライン化、マージ、書き換えを行います デフォルト proguard-android.txt を含みます -dontoptimize
縮小 未使用のクラスとメソッドを削除 Resource/code の shrinking は一度も有効化されていません

Playは読み取ります r8.json Android Gradle Plugin 8.10以降の最新パッチでビルドした場合です。それ以外は mapping.txt、次にDEXヒューリスティックを使用します。minifyをオフにしてリリースした Capacitor アプリにはマッピングファイルがほとんどないため、Playは読める名前を認識し、数%の難読化(多くはすでに難読化済みのライブラリAARの残り)として報告します。これは 3% vitals スコアと一致します。

公式ポリシー: Play Consoleのテクニカル品質要件. 実装の詳細: DEX code の最適化 と R8によるアプリの最適化を有効にする.

Capacitor アプリがこのチェックに失敗する理由

Capacitor のAndroidテンプレートは、依然としてリリースビルドを出力します なしで 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"
        )
    }
}

重要なポイントは3つです:

  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。Release-onlyにすれば、ローカル実行は高速なまま、スタックトレースも読みやすく保てます。

ステップ 2 — R8 full modeを無効にしない

開く android/gradle.properties 存在する場合は、この行を削除してください:

android.enableR8.fullMode=false

AGP 8+ではすでにfull modeが有効です。このフラグを残すと最適化が制限されます。

次も検索してください: android/app/proguard-rules.pro (およびその他の追加 -include ファイル) 用:

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

これらのルールを残しておくと、設定を切り替えた後もPlayストアのスコアが低くなってしまいます。 minifyEnabledドキュメント化された一時的な理由がない限り、削除してください。

ステップ 3 — アプリ全体ではなく Capacitor プラグインを保持する

R8はリフレクションのメタデータを使用します。Capacitor プラグインはアノテーションによって検出されるため、keepルールが必要です。 通常、これらを自分で追加することはありません。 Capacitor 3.2.3 以降、 @capacitor/android が配信されます。 ProGuardのコンシューマー・ルール 以下のものを保持します:

  • @CapacitorPlugin クラス: @PluginMethod、権限およびActivityのコールバック
  • を継承しているクラス com.getcapacitor.Plugin
  • レガシーな @NativePlugin およびCordovaプラグインのクラス

Capacitor 6/7/8のラインを維持して、それらのconsumerルールが適用されるようにしてください。

追加のルールを以下に記述します: 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 ** { *; }

特定のkeepルールを適用してもサードパーティ製プラグインがクラッシュし続ける場合は、プラグインを更新するか、以下からメンテナンスされている代替案を検討してください: Capgo プラグインディレクトリ、または Capgo コンサルティング パッチを当てるには。

公式 Capacitor のノート: ProGuard の使用.

ステップ 4 — 本番用リリース bundle のビルド

デバッグ用 APK では難読化率が ~0% と表示されます。Play ストアが評価するのはアップロードしたものだけです。

プロジェクトルートから:

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

なしでは release これらのタスクは成功しますが、署名なしの .aabファイルが出力されます。Play ストアへアップロードする前に Android Studio で署名してください。

以下の リリース APK を デバイスにインストール (./gradlew assembleRelease、次にAPKは app/build/outputs/apk/release/)。AABは .aab Playへのアップロード用フォーマットであり、サイドロードするものではありません。ネイティブプラグイン(camera、push、file、billing、auth)を実際に動かしてください。R8のバグは npx cap run android デバッグセッションでは発生しません。

上記のGradleコマンドを実行した後(現在は android/にいます)、R8が実際に実行されたか確認してください:

  • app/build/outputs/mapping/release/mapping.txt
  • app/build/outputs/mapping/release/configuration.txt
  • AGP 8.10以降の最新パッチでは、 r8.json App Bundle内にあります。

それらの release フォルダはデフォルトの Capacitor バリアントです。product flavorsを使う場合、マッピングはバリアント名(mapping/freeRelease/)の下にあります。APKは apk/<flavor>/release/ (例: apk/free/release/).

もし mapping.txt が不足しています。CIでビルドされた際、異なるバリアントのフォルダを参照している可能性があります。 debug, または R8 が以下の設定で実行されました: -dontobfuscateを再確認してください。 minifyEnabled true で release また、keep rules によって難読化が無効化されていないことも確認してください。

ステップ 5 — クラッシュレポートの可読性を維持する

難読化されたスタックトレースは、mappingファイルがなければ役に立ちません。 mapping.txt 各Playバージョンごとに保存してください:

  • Play Console: テストとリリース → App bundle explorer → ダウンロード → アセット、その後 upload してください mapping.txt まだアタッチされていない場合。
  • Firebase Crashlytics / Sentry: 同じ mapping を CI の一環としてアップロードしてください。

Android Studio / AGP は、多くの場合 mapping を以下に埋め込みます: .aab。初回の最適化アップロード後も、Assets タブを必ず確認してください。

ステップ 6 — アップロードして Play を再確認

新しい .aab を内部テストトラックにアップロードします(スコアの更新に本番環境は不要です)。以下を開いてください:

  1. テストとリリース → App bundle explorer そのバージョンの
  2. DEX サイズと、難読化 / 最適化 / shrinking の割合
  3. モニタリングと改善 → Android vitals Play が分析する対象が新しいバージョンになった後

必要です 各指標で25%以上 難読化だけでなく、3つの指標すべてにおいて。R8を有効にすると、 proguard-android-optimize.txt Capacitor アプリは通常、難読化率が1桁から、3つの指標すべてで25%を大きく超えるレベルまで向上します。

Playストアのみ 強制されます DEXサイズが10 MBを超えるアプリ(ゲームは50 MB)の場合、25%の最低ラインが適用されます。この基準を下回っていても、改善する価値は十分にあります。DEXが小さくなり、メモリ消費が抑えられ、起動も高速化するためです。

まだ25%に達していない場合

R8は有効ですが、Playストア(またはローカルの解析ツール)でスコアが低いままです。多くの場合、広すぎるkeepルールが原因です。

  1. 開く R8設定アナライザー Android Gradle Pluginが9.3以降の場合 — assembleRelease を書き込みます configanalyzer.html の横にある mapping.txt。AGP 9.2以前では、そのHTMLファイルは無視して、代わりに mapping.txt、APK Analyzer、またはPlayのApp bundle explorerを使用してください。
  2. keepルールを、アプリのどの程度を固定するかでソートします。編集できないライブラリ消費者のルールは正常です。アプリレベルの -keep class com.foo.** { *; } は異常です。
  3. 次を開きます: .aab Android StudioのAPK Analyzerで、サイズの大きい .dex ファイルを選択し、難読化解除された名前の表示を切り替えます( mapping.txtが必要です)。サイズが大きく、読みやすいままのパッケージは、一括でkeepするのを止めるべき対象です。
  4. 参照が残っているプラグインを更新する proguard-android.txt。そのファイルはAGP 9での最適化を妨げ、古いプラグインではレッドフラグとなります。

DEXを縮小して低いスコアを「修正」しないでください。 minifyEnabled false ヒューリスティックが変わると期待するのもやめましょう。Playが求めているのは、サイズ削減、最適化、 と 難読化です。

これで代替できないもの

  • JavaScriptのミニファイ における vite.config.ts この指標は変わりません。
  • Capgo Live Updates HTML/JS/CSSを配信しても、DEXは再構築されません。ストア配布用バイナリでR8が有効になった後も、JSの修正はOTAで配信できます。ただし、難読化チェック自体にはPlayへのネイティブアップロードが1回必要です。
  • 16 KBページサイズ は、別のPlayネイティブ要件です。詳細は Android 16 KB ページサイズ.

すでに以下を使用して Android をビルドしている場合、 Capgo のビルドを android/app/build.gradle in the repo. The next cloud build picks up R8. You do not need a different Play pipeline, only a release binary produced with minification on. Same idea if you keep GitHub Android ビルドのアクション: ワークフローは assemble を実行するように設定してください。 リリースdebug ではなく、

よくある質問

R8 を有効にすると Capacitor プラグインが壊れますか?

プラグインが reflection を使用しており、consumer keep rules が提供されていない場合は、壊れる可能性があります。コアの Capacitor はすでにプラグインクラスを保持しています。リリースビルドでテストを行い、 絞り込む クラッシュするパッケージにだけkeepルールを残してください。プラグインがメンテナンスされていない場合は、 Capgo コンサルティング フォークしてビルドを維持できます。

これで npx cap run チェックを通過したことが証明できますか?

いいえ。そのコマンドはR8をオフにしたデバッグビルドを使用しています。代わりに bundleRelease / 署名済みのPlayアップロード用ビルドを使用してください。

すでに設定済みですが、 minifyEnabled true まだ3%発生しています。なぜですか?

を検索し、 -dontobfuscate, proguard-android.txt, android.enableR8.fullMode=false、そして一律の -keep ルール。CIが古いアーティファクトではなく、難読化済みのAABをアップロードしたか確認してください。

R8ではなくProGuardを使う必要がありますか?

いいえ。R8はAndroid Gradle Pluginのシュリンカーです。ProGuard形式のルールファイルを読み込みます。Google Playのドキュメントではどのシュリンカーも許可されていますが、Capacitor アプリにはR8の使用を推奨します。

チェックリスト

  • release { minifyEnabled true; shrinkResources true }
  • proguard-android-optimize.txt (非 proguard-android.txt)
  • いいえ -dontobfuscate / -dontoptimize / アプリ全体 -keep class **
  • Capacitor 3.2.3以降を使用し、プラグイン利用者のルールを適用
  • リリースビルドの生成物 mapping.txt
  • リリース版のインストールでテスト済みのNativeプラグイン
  • 新機能 .aab アップロード済み。マッピングファイルはApp bundle explorerに添付されています
  • 難読化、最適化、コード削減がそれぞれ25%未満

Play Consoleの警告内容はこれだけです:Capacitor でR8をオフにしていたため、PlayがDEXのスコア判定を開始しました。Gradleのリリース設定を1行変更してストアにアップロードするだけで解決します。

Capacitor アプリにおける「Google Playの難読化率が25%未満」の修正方法から

使用している場合 Capacitor アプリで Google Play の難読化率が25%未満になる問題を修正 Androidストアのリリース計画を立て、以下と連携させましょう: Capgo Native Build App Bundleのリリース用、 Capgo での CI/CD 設定 アップロードパイプライン用、 CI/CD 連携 実装の詳細については、 GitHub actions による Capacitor Android ビルドの自動化 セルフホストのパイプライン用、および Capgo コンサルティング R8を有効にした後にプラグインが動作しなくなった場合。

Capacitor アプリ向けの Live Updates

Web レイヤーのバグが本番で発生したら、App Store の審査を何日も待たずに Capgo で修正を配信しましょう。ネイティブの変更は通常の審査フローに残したまま、ユーザーはバックグラウンドでアップデートを受け取れます。

最新のブログ記事

Capgoは、真にプロフェッショナルなモバイルアプリを作るために必要な最高のインサイトを提供します。