packageScope で指定されたパッケージを最適化する(試験運用版)

packageScope で R8 を使用すると、特定のパッケージを最適化できます。これは、まだ R8 を使用していないアプリ向けのオプションの最初のステップとして設計されており、すでに R8 を使用しているアプリには推奨されません。

packageScope を使用するかどうかを検討する

アプリですでに R8 を使用している場合は、packageScope を使用しないでください。パフォーマンスとアプリサイズの点で最適ではない構成になります。代わりに、改善された keep ルールを使用してアプリの R8 構成を強化するか、互換モードを使用している場合は R8 のフルモードに移行します。

まだ R8 を使用していないが、R8 を採用しているアプリは、packageScope を使用して移行を段階的に管理できます。R8 はアプリの動作を変更する可能性のある強力な最適化を適用するため、AndroidX や Kotlin など、最適化しても安全な特定のパッケージに最適化の範囲を限定することで、リスクを最小限に抑えながらパフォーマンスの向上を実現できます。アプリが安定したら、これらの最適化をコードベースと依存関係の残りの部分に段階的に拡大し、各段階で安定性をテストできます。

前提条件

R8 で packageScope を使用するには、次の要件を満たす必要があります。

  • Android Gradle プラグイン 9.0 以降。
  • 互換モードではなく、フルモードの R8。

最適化を構成する

packageScope を使用して最適化を有効にするには、次の操作を行います。

最適化するライブラリを選択する

最適化するライブラリを特定します。AndroidX と Kotlin のライブラリ androidx.**kotlin.**kotlinx.** は、R8 との互換性が確保された安定版のライブラリであるため、これらのライブラリから始めることをおすすめします。

packageScope で R8 を使用するためのサポートを有効化

プロジェクトの gradle.properties ファイルに以下を追加します。

android.r8.gradual.support=true

最適化ブロックを設定する

モジュール レベルの build.gradle.kts(または build.gradle)ファイルで、リリース ビルド構成に optimization ブロックを追加します。このブロック内で packageScope を使用して、最適化する特定のパッケージをリストします。build.gradle.kts ファイルで、パッケージ リストを setOf() でラップします。

Kotlin

android {
    buildTypes {
        release {
            optimization {
                enable = true
                packageScope = setOf("androidx.**","kotlin.**", "kotlinx.**")
            }
        }
    }
}

Groovy

android {
    buildTypes {
        release {
            optimization {
                enable = true
                packageScope = ["androidx.**", "kotlin.**", "kotlinx.**"]
            }
        }
    }
}

最適化をテストする

packageScope 宣言を適用または更新した後、アプリを徹底的にテストし、予期しないクラッシュや動作の変更が発生していないことを確認してください。

指定したパッケージの最適化からアプリ全体の最適化への移行

最適化のメリットを最大限に高めるには、packageScope の使用からアプリ全体での R8 の使用に徐々に移行することをおすすめします。このプロセスでは、最適化の対象範囲を段階的に拡大します。

  1. 安定版ライブラリから始める。まず、R8 の最適化と互換性のある、広く使用されている安定したライブラリのみを packageScope リストに含めます。AndroidX ライブラリと Kotlin ライブラリの androidx.**kotlin.**kotlinx.** から始めます。
  2. パッケージを段階的に追加するpackageScope に新しいパッケージ接頭辞を段階的に追加します。
    1. 依存関係を評価する。アプリのライブラリを確認します。packageScope リストに追加するのに適した候補には、公式の Google ライブラリ(com.google.** など)や、OkHttpokhttp3.**okio.** など)のような堅牢なライブラリがあります。重いリフレクション、シリアル化、ネイティブ コード呼び出し(JNI)を伴わないライブラリを優先します。
    2. パッケージ サイズに基づいて優先順位を付けますAndroid Studio の APK Analyzer を使用して、アプリのサイズに最も影響している要素を特定します。
      1. R8 をオフにしてリリース AAB または APK をビルドします。
      2. アナライザで開き、dex ファイルを調べます。
      3. パッケージをサイズで並べ替えます。パッケージが大きいほど、最適化による費用対効果(ROI)が高くなります。これらのライブラリに広すぎる保持ルールがない限り、最初にこれらのライブラリをターゲットにすると、プロセスの早い段階でサイズを大幅に削減できます。詳細については、ライブラリを賢く選択するをご覧ください。
  3. 動作の変更を確認します。新しいパッケージ プレフィックスを追加するたびに、包括的なテストを実施して、回帰や予期しない動作を検出して解決します。
  4. アプリ パッケージは最後に追加します。アプリ パッケージでリフレクションをあまり使用しない場合は、アプリ パッケージを packageScope に含め、必要に応じて保持ルールを段階的に追加します。アプリ パッケージでリフレクションを多用する場合は、パッケージを packageScope に含め、必要なパッケージのパッケージ全体の保持ルールを追加します。保持ルールを繰り返し処理して、ルールを絞り込みます。
  5. アプリ全体で R8 を使用するように移行します。アプリの依存関係の大部分が packageScope 宣言に含まれ、アプリが安定したら、packageScope を削除して、アプリ全体をフルモードで最適化します。