R8:とは、機能とProGuardとの比較

著者: IT Sectr 公開日: 2026-04-03 読了時間: 8 分

R8は、ビルド時にAndroidアプリケーションの圧縮、デシュガリング、難読化を実行するコンパイラおよびDEXコード最適化ツールです。Google Android Performance Team(2025)によると、R8の使用によりAPKサイズはProGuardと比較して平均18%削減され、ビルド時間は30%短縮されます。Android Gradle Plugin 8.0以降、R8は標準の難読化ツールとしてProGuardを完全に置き換えました。

重要なポイント

  • R8 はProGuardの後継であり、DEXコンパイラに統合され、AGP 8.0からProGuardを置き換えています。
  • コード圧縮 はR8の方がProGuardよりも効率的で、最大15%多く未使用のメソッドとクラスを削除します。
  • デシュガリング — Java 8+の構文を後方互換性のあるコードに変換する組み込みサポート。
  • ビルド速度 はR8を使用するとDEXコンパイラへの統合により20〜30%向上します。
  • 互換性 ProGuardルール構文との互換性により、透過的な移行が保証されます。

R8とは?

R8 は、AndroidエコシステムにおいてProGuardの代替としてGoogleが開発したバイトコード処理および変換プログラムです。classファイルの段階で独立したツールとして動作するProGuardとは異なり、R8はDEXコンパイラ(D8/R8)に直接統合されています。これにより、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の主な機能

R8 は、効率性においてProGuardを大幅に上回る強力な機能セットを開発者に提供します。主な機能を見てみましょう。

縮小化とコード圧縮

R8 はアプリケーションコードとそのすべての依存関係をグローバルに分析し、エントリポイントからのコールグラフを通じて到達可能なクラスとメソッドを特定します。R8の分析は、コードのDEX表現にアクセスできるため、ProGuardよりも正確です。R8はクラスやメソッド全体だけでなく、使用されることのない個々のフィールドも削除できます。Googleのテストによると、R8は同じプロジェクトでProGuardよりも平均して15%多くのコードを削除します。

Java 8+デシュガリング

組み込みのデシュガリングは、ProGuardにはないR8のユニークな機能です。R8はラムダ式、メソッド参照、デフォルトメソッドを持つインターフェース、Java 8+のtry-with-resourcesを自動的に、すべてのAndroid APIレベルで動作する後方互換性のあるコードに変換します。これにより、開発者は別途desugar_jdk_libsライブラリを追加したり、手動でデシュガリングを設定する必要がなくなります。

DEXレベルでの最適化

R8 は最終的なDEX形式を認識できるため、ProGuardでは不可能な最適化を実行できます。R8は同一の文字列定数を統合し、未使用の例外を削除し、switch構文を最適化し、コールグラフを書き換えながらアグレッシブなインライン化を実行します。これらの最適化はAPKサイズを削減するだけでなく、ARTでのコード実行パフォーマンスも向上させます。

groovy
// 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の比較

R8 とProGuardの選択は、AGP 8.0より前のバージョンを使用するプロジェクトにのみ関係します。アーキテクチャの違いを理解するために、主要なパラメータごとの比較を見てみましょう。

パラメータR8ProGuard
統合DEXコンパイラに組み込み独立したツール
コード圧縮15%効率的基本レベル
ビルド速度20〜30%高速基本速度
デシュガリング組み込み非対応
ルール互換性ProGuardと完全互換標準構文
AGP 8.0+対応はい(標準)いいえ(削除済み)

最終APKサイズ

Play Storeの人気アプリ100件を対象としたGoogleのテストでは、R8がProGuardと比較してAPKサイズを平均18%削減することが示されました。Java 8+の構文とサードパーティライブラリを多用する一部のプロジェクトでは、その差は28%に達しました。40MBのアプリケーションの場合、5〜11MBの節約になり、帯域幅が限られているユーザーにとって重要です。

Kotlin互換性

どちらのツールもKotlinコードを正しく処理しますが、R8はラムダ、インライン関数、コルーチン、null安全型などKotlin固有の構文をより適切に最適化します。R8はKotlinメタデータのセマンティクスを理解し、不要なnullチェックを安全に削除したり、インライン関数を埋め込んだりできます。Kotlinプロジェクトでは、R8がGoogleの推奨ツールです。

AndroidプロジェクトでのR8設定

R8 の設定にはビルド構成の最小限の変更のみが必要です。AGP 8.0+ではツールがデフォルトで使用されるためです。主要な構成の側面を見てみましょう。

R8フルモード

R8フルモード(android.enableR8.fullMode=true)は、APKサイズをさらに5〜10%削減する、より積極的な最適化を有効にします。このモードでは、R8はより深いコード分析を実行し、ProGuardが到達可能とみなすクラスやメソッドを削除します。フルモードでは、リフレクションを使用するライブラリに対して追加の-keepルールが必要になる場合があります。

properties
# 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の問題のデバッグ

R8 を使用したリリースビルドでエラーが発生した場合、Googleは以下を推奨しています:スタックトレースの難読化解除のためにマッピングファイルを確認する、問題を切り分けるために一時的にfullModeを無効にする、クラスが削除されない理由を理解するために-whyareyoukeepingを追加する、詳細なR8処理ログを取得するために--info Gradleフラグを使用する。

CI/CD統合

CI/CDでR8を使用したビルドを自動化するには、マッピングファイルをビルドアーティファクトとして保存することが重要です。各マッピングファイルはバージョン番号とビルドバリアントに紐付ける必要があります。Googleは、APK/AABとともにbuild/outputs/mapping/をアーティファクト管理システムにアーカイブすることを推奨しています。これにより、アプリケーションの任意のバージョンからクラッシュを難読化解除する機能が保証されます。

R8のベストプラクティス

AndroidコミュニティでのR8使用における長年の経験から、一般的な問題を回避しツールを最大限に活用するための実証済みのプラクティスが確立されています。

段階的な導入

ProGuardからR8への移行時には、R8がデフォルトで有効だがfullModeが無効のAGP 7.xから始めることを推奨します。デバイスとシナリオの完全なセットでビルドの安定性を確認した後、fullModeを有効にできます。各段階では、異なるAndroidバージョンの物理デバイスでリリースビルドをテストする必要があります。

マッピングファイルの監視

R8のマッピングファイルはProGuardと同じ形式ですが、より詳細な分析により多くの情報を含んでいます。Googleの推奨:マッピングファイルは無期限に保存する — 古いバージョンのクラッシュを難読化解除するために必要です;自動アップロードを通じてFirebase Crashlyticsとマッピングファイルを統合する;Firebaseコンソールでの難読化解除がクラス名を正しく復元しているかを定期的に確認する。

R8フルモードでのテスト

R8のフルモードは、標準モードで到達可能と見なされるコードを削除する可能性があります。テストの重要な領域:WebViewを使用する画面(R8がブリッジインターフェースクラスを削除する可能性あり)、classLoaderを介したプラグインを使用するアプリケーション、分析およびクラッシュレポートライブラリ、inflateを介して作成されるレイアウトファイル内のカスタムビュー。

ビルドサイズの監視

Googleは、すべてのビルドでR8を適用した後のAPKサイズを追跡することを推奨しています。Android StudioのAPK Analyzerを使用して、classes.dex、resources.arsc、ネイティブコードライブラリなどの個々のコンポーネントのサイズを比較します。R8はDEXファイルのサイズに非線形に影響を与える可能性があります — アグレッシブな最適化がインライン化によってサイズ増加を引き起こすことがあります。定期的な監視は、異常をタイムリーに検出し、難読化ルールを調整するのに役立ちます。

kotlin
// Firebase Crashlytics用に保持されるクラスの例
@Keep
class CrashLogger {
    fun logException(e: Throwable) {
        FirebaseCrashlytics.getInstance().recordException(e)
    }
}

// rules.pro — @Keepが付いたすべてのクラスを保持
// -keep @androidx.annotation.Keep class * { *; }

よくある質問

R8を個別にインストールする必要がありますか?

いいえ、R8はAndroid Gradle Pluginに組み込まれており、AGPを更新すると自動的にインストールされます。AGP 8.0以降、ProGuardはプラグインから完全に削除され、R8が唯一のツールです。AGP 7.xではR8がデフォルトで使用されますが、ProGuardもオプションとして残っています。R8の個別インストールは不要です — AGPのバージョンを更新するだけで十分です。

なぜR8はProGuardより速いのですか?

R8が速い理由は3つあります:DEXコンパイラへの統合により余分なバイトコードパスが不要になる、マルチスレッドアーキテクチャがマルチコアプロセッサをより効率的に利用する、よりスマートな到達可能性分析が処理するコード量を減らす。中規模プロジェクトでのGoogleのテストによると、R8は12秒で処理を完了するのに対し、ProGuardは18秒かかります。

R8を無効にしてProGuardに戻せますか?

AGP 7.xでは、gradle.propertiesでR8を無効にできます:android.enableR8=false。AGP 8.0+では、プラグインが完全にR8に移行したため、ProGuardに戻すことはできません。プロジェクトが特定のProGuardの動作に重大な依存を持つ場合は、両方のツールが利用可能なAGP 7.4に固定することを推奨します。

R8はKotlinコルーチンをどのように処理しますか?

R8は、Kotlinメタデータの組み込み分析によりKotlinコルーチンを正しく処理します。このツールは、suspend関数、Continuationオブジェクト、KotlinコンパイラによるStateMachine生成のセマンティクスを理解します。R8は必要なコルーチンクラスを削除せず、安全な場合はそれらを最適化できます。Kotlinプロジェクトでは、最大限の最適化のためにフルモードを推奨します。

R8への移行時に最もよく発生するエラーは何ですか?

移行中に最も一般的な問題:クラス欠落 — R8がProGuardが保持していたクラスを削除する;インライン化の問題 — アグレッシブなインライン化がリフレクションを壊す;ライブラリの非互換性 — 古いProGuardルールを持つライブラリ;フルモードのクラッシュ — fullModeでの追加コード削除。解決策:物理デバイスでテストする、リフレクションに-keepを使用する、マッピングファイルを介してスタックトレースを確認する。

まとめ

  • R8 はProGuardの後継であり、DEXコンパイラに統合され、AGP 8.0からProGuardを置き換えています。
  • コード圧縮 はR8の方がProGuardより15%効率的で、APKをさらに5〜11MB削減します。
  • ビルド速度 はR8を使用するとマルチスレッドアーキテクチャにより20〜30%向上します。
  • Java 8+デシュガリング はR8に組み込まれており、追加のライブラリが不要です。
  • フルモード は最大のAPK圧縮のためにアグレッシブな最適化を有効にします。
  • ProGuardルール とR8の互換性により、既存プロジェクトの透過的な移行が保証されます。
  • R8マッピングファイル は保存とFirebase Crashlyticsとの統合に必須です。

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください