R8は、ビルド時にAndroidアプリケーションの圧縮、デシュガリング、難読化を実行するコンパイラおよびDEXコード最適化ツールです。Google Android Performance Team(2025)によると、R8の使用によりAPKサイズはProGuardと比較して平均18%削減され、ビルド時間は30%短縮されます。Android Gradle Plugin 8.0以降、R8は標準の難読化ツールとしてProGuardを完全に置き換えました。
重要なポイント
R8 は、AndroidエコシステムにおいてProGuardの代替としてGoogleが開発したバイトコード処理および変換プログラムです。classファイルの段階で独立したツールとして動作するProGuardとは異なり、R8はDEXコンパイラ(D8/R8)に直接統合されています。これにより、R8はより深いレベルで分析と最適化を実行でき、外部ツールではアクセスできない領域にまで対応できます。
R8 は、classファイルまたはJARアーカイブ形式のJavaバイトコードを入力として受け取り、1回のパスで最適化されたDEXコードに変換します。組み込みのR8オプティマイザーは、単純なもの(定数のインライン化)から複雑なもの(フィールドレベルの精度での型到達可能性分析)まで、50種類以上のさまざまな変換を実行します。Googleによると、R8のアーキテクチャはマルチスレッド動作に特化して設計されており、高いビルド速度を実現しています。
R8 はGoogle I/O 2018で発表され、Android Gradle Plugin 3.4(2019)にProGuardのオプションの代替として初めて搭載されました。AGP 7.0ではR8がすべてのプロジェクトのデフォルトツールになり、AGP 8.0(2023)ではProGuardのサポートがプラグインから完全に削除されました。2025年現在、R8はGoogleが推奨するAndroid向けの唯一の公式難読化および最適化ツールです。
R8 は、効率性においてProGuardを大幅に上回る強力な機能セットを開発者に提供します。主な機能を見てみましょう。
R8 はアプリケーションコードとそのすべての依存関係をグローバルに分析し、エントリポイントからのコールグラフを通じて到達可能なクラスとメソッドを特定します。R8の分析は、コードのDEX表現にアクセスできるため、ProGuardよりも正確です。R8はクラスやメソッド全体だけでなく、使用されることのない個々のフィールドも削除できます。Googleのテストによると、R8は同じプロジェクトでProGuardよりも平均して15%多くのコードを削除します。
組み込みのデシュガリングは、ProGuardにはないR8のユニークな機能です。R8はラムダ式、メソッド参照、デフォルトメソッドを持つインターフェース、Java 8+のtry-with-resourcesを自動的に、すべてのAndroid APIレベルで動作する後方互換性のあるコードに変換します。これにより、開発者は別途desugar_jdk_libsライブラリを追加したり、手動でデシュガリングを設定する必要がなくなります。
R8 は最終的なDEX形式を認識できるため、ProGuardでは不可能な最適化を実行できます。R8は同一の文字列定数を統合し、未使用の例外を削除し、switch構文を最適化し、コールグラフを書き換えながらアグレッシブなインライン化を実行します。これらの最適化はAPKサイズを削減するだけでなく、ARTでのコード実行パフォーマンスも向上させます。
// build.gradleでR8を明示的に有効にする(AGP 8.0+ではオプション)
android {
compileSdk 34
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile(
'proguard-android-optimize.txt'
), 'proguard-rules.pro'
}
}
}
// gradle.properties — R8を強制的に有効にする
android.enableR8.fullMode=true
R8 とProGuardの選択は、AGP 8.0より前のバージョンを使用するプロジェクトにのみ関係します。アーキテクチャの違いを理解するために、主要なパラメータごとの比較を見てみましょう。
| パラメータ | R8 | ProGuard |
|---|---|---|
| 統合 | DEXコンパイラに組み込み | 独立したツール |
| コード圧縮 | 15%効率的 | 基本レベル |
| ビルド速度 | 20〜30%高速 | 基本速度 |
| デシュガリング | 組み込み | 非対応 |
| ルール互換性 | ProGuardと完全互換 | 標準構文 |
| AGP 8.0+対応 | はい(標準) | いいえ(削除済み) |
Play Storeの人気アプリ100件を対象としたGoogleのテストでは、R8がProGuardと比較してAPKサイズを平均18%削減することが示されました。Java 8+の構文とサードパーティライブラリを多用する一部のプロジェクトでは、その差は28%に達しました。40MBのアプリケーションの場合、5〜11MBの節約になり、帯域幅が限られているユーザーにとって重要です。
どちらのツールもKotlinコードを正しく処理しますが、R8はラムダ、インライン関数、コルーチン、null安全型などKotlin固有の構文をより適切に最適化します。R8はKotlinメタデータのセマンティクスを理解し、不要なnullチェックを安全に削除したり、インライン関数を埋め込んだりできます。Kotlinプロジェクトでは、R8がGoogleの推奨ツールです。
R8 の設定にはビルド構成の最小限の変更のみが必要です。AGP 8.0+ではツールがデフォルトで使用されるためです。主要な構成の側面を見てみましょう。
R8フルモード(android.enableR8.fullMode=true)は、APKサイズをさらに5〜10%削減する、より積極的な最適化を有効にします。このモードでは、R8はより深いコード分析を実行し、ProGuardが到達可能とみなすクラスやメソッドを削除します。フルモードでは、リフレクションを使用するライブラリに対して追加の-keepルールが必要になる場合があります。
# gradle.properties — R8フルモードを有効にする
android.enableR8.fullMode=true
# フルモードの追加ルール
-keep class com.example.reflection.** { *; }
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
R8 を使用したリリースビルドでエラーが発生した場合、Googleは以下を推奨しています:スタックトレースの難読化解除のためにマッピングファイルを確認する、問題を切り分けるために一時的にfullModeを無効にする、クラスが削除されない理由を理解するために-whyareyoukeepingを追加する、詳細なR8処理ログを取得するために--info Gradleフラグを使用する。
CI/CDでR8を使用したビルドを自動化するには、マッピングファイルをビルドアーティファクトとして保存することが重要です。各マッピングファイルはバージョン番号とビルドバリアントに紐付ける必要があります。Googleは、APK/AABとともにbuild/outputs/mapping/をアーティファクト管理システムにアーカイブすることを推奨しています。これにより、アプリケーションの任意のバージョンからクラッシュを難読化解除する機能が保証されます。
AndroidコミュニティでのR8使用における長年の経験から、一般的な問題を回避しツールを最大限に活用するための実証済みのプラクティスが確立されています。
ProGuardからR8への移行時には、R8がデフォルトで有効だがfullModeが無効のAGP 7.xから始めることを推奨します。デバイスとシナリオの完全なセットでビルドの安定性を確認した後、fullModeを有効にできます。各段階では、異なるAndroidバージョンの物理デバイスでリリースビルドをテストする必要があります。
R8のマッピングファイルはProGuardと同じ形式ですが、より詳細な分析により多くの情報を含んでいます。Googleの推奨:マッピングファイルは無期限に保存する — 古いバージョンのクラッシュを難読化解除するために必要です;自動アップロードを通じてFirebase Crashlyticsとマッピングファイルを統合する;Firebaseコンソールでの難読化解除がクラス名を正しく復元しているかを定期的に確認する。
R8のフルモードは、標準モードで到達可能と見なされるコードを削除する可能性があります。テストの重要な領域:WebViewを使用する画面(R8がブリッジインターフェースクラスを削除する可能性あり)、classLoaderを介したプラグインを使用するアプリケーション、分析およびクラッシュレポートライブラリ、inflateを介して作成されるレイアウトファイル内のカスタムビュー。
Googleは、すべてのビルドでR8を適用した後のAPKサイズを追跡することを推奨しています。Android StudioのAPK Analyzerを使用して、classes.dex、resources.arsc、ネイティブコードライブラリなどの個々のコンポーネントのサイズを比較します。R8はDEXファイルのサイズに非線形に影響を与える可能性があります — アグレッシブな最適化がインライン化によってサイズ増加を引き起こすことがあります。定期的な監視は、異常をタイムリーに検出し、難読化ルールを調整するのに役立ちます。
// Firebase Crashlytics用に保持されるクラスの例
@Keep
class CrashLogger {
fun logException(e: Throwable) {
FirebaseCrashlytics.getInstance().recordException(e)
}
}
// rules.pro — @Keepが付いたすべてのクラスを保持
// -keep @androidx.annotation.Keep class * { *; }
よくある質問
いいえ、R8はAndroid Gradle Pluginに組み込まれており、AGPを更新すると自動的にインストールされます。AGP 8.0以降、ProGuardはプラグインから完全に削除され、R8が唯一のツールです。AGP 7.xではR8がデフォルトで使用されますが、ProGuardもオプションとして残っています。R8の個別インストールは不要です — AGPのバージョンを更新するだけで十分です。
R8が速い理由は3つあります:DEXコンパイラへの統合により余分なバイトコードパスが不要になる、マルチスレッドアーキテクチャがマルチコアプロセッサをより効率的に利用する、よりスマートな到達可能性分析が処理するコード量を減らす。中規模プロジェクトでのGoogleのテストによると、R8は12秒で処理を完了するのに対し、ProGuardは18秒かかります。
AGP 7.xでは、gradle.propertiesでR8を無効にできます:android.enableR8=false。AGP 8.0+では、プラグインが完全にR8に移行したため、ProGuardに戻すことはできません。プロジェクトが特定のProGuardの動作に重大な依存を持つ場合は、両方のツールが利用可能なAGP 7.4に固定することを推奨します。
R8は、Kotlinメタデータの組み込み分析によりKotlinコルーチンを正しく処理します。このツールは、suspend関数、Continuationオブジェクト、KotlinコンパイラによるStateMachine生成のセマンティクスを理解します。R8は必要なコルーチンクラスを削除せず、安全な場合はそれらを最適化できます。Kotlinプロジェクトでは、最大限の最適化のためにフルモードを推奨します。
移行中に最も一般的な問題:クラス欠落 — R8がProGuardが保持していたクラスを削除する;インライン化の問題 — アグレッシブなインライン化がリフレクションを壊す;ライブラリの非互換性 — 古いProGuardルールを持つライブラリ;フルモードのクラッシュ — fullModeでの追加コード削除。解決策:物理デバイスでテストする、リフレクションに-keepを使用する、マッピングファイルを介してスタックトレースを確認する。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。