proguard-rules.proとconsumer-rules.pro

背景/概要

Androidのライブラリモジュールを作成するとconsumer-rules.proproguard-rules.proも作成されますが、その役割を「難読化」という表面的なことしか知らずにいました。

このままではプロのAndroidエンジニアとは名乗れない気がしたので、ちゃんと調べようと思います。

本記事はその調査ログです。

アプリ難読化

「proguard」でググると、1件目には「アプリの圧縮、難読化、最適化」というAndroid Developersの記事が出てきました。

まずはそれを読み、難読化の概要を知りました。

難読化に関する要点

  • アプリサイズを小さくするアプローチの1つが難読化。
  • 難読化によりクラスとメンバーの名前を短くし、DEXファイルのサイズを小さくする。
  • Android Studioで新しいプロジェクトを作成する場合、難読化はデフォルトでは有効にならない。

▼サンプルコード:リリースビルド時に難読化を有効にする

// build.gradle.kts
android {
    buildTypes {
        getByName("release") {
            // リリースビルド時だけ、コードの圧縮、難読化、最適化を有効にする。
            isMinifyEnabled = true

            // AGPによって実行されるリソースの圧縮を有効にする。
            isShrinkResources = true

            // AGP同梱のデフォルトProGuardルールファイルを読み込む。
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
    }
    ...
}

proguard-rules.pro

R8の構成ファイルの章にはproguard-rules.proの説明がありました。

モジュール内のProGuardルールを記載するファイルなのは分かりましたが、保持するコードのカスタマイズの章で紹介された-keepルール以外の詳しい説明はなく、ProGuardマニュアルがリンクされていました。

consumer-rules.pro

consumer-rules.proproguard-rules.proと同じくProGuardルールを記載するファイルだと思いますが、「アプリの圧縮、難読化、最適化」には記載がありませんでした。

改めて「consumer-rules.pro」でググると「Android ライブラリの作成」 がヒットしました。 そしてライブラリ モジュールの開発に関する考慮事項の章に詳細がありました。

要点

  • consumerProguardFilesを利用することでAARファイルにProGuard構成ファイルを埋める
  • AARを生成しないマルチモジュールビルドにライブラリモジュールが含まれている場合は、ライブラリを使用するアプリモジュールでのみコード圧縮を実行する

つまりは、AARを生成しないマルチモジュールビルドにライブラリモジュールのconsumer-rules.proは不要そうです。

▼サンプルコード:AARファイルにProGuard構成ファイルを埋め込む

// build.gradle.kts
android {
    defaultConfig {
        consumerProguardFiles("consumer-rules.pro")
    }
    ...
}

proguard-android-optimize.txt vs proguard-android.text

どちらもAGP同梱のデフォルトProGuardルールファイルです。

proguard-android-optimize.txtの文頭のコメントを見ると、「最適化したくない場合は、この設定ファイルの代わりにproguard-android.txtを使い」という記載があるので、最適化の有無が異なるようです。

R8の構成ファイルの章ではproguard-android-optimize.txtの使用がおすすめされていますが、使用されているルールが悪いと指摘しているものもあるので、積極的には利用したくありません。(参考

まとめ

  • proguard-rules.proはモジュール内のProGuardルールを記載するファイル。
  • consumerProguardFiles("consumer-rules.pro")でAARファイルにProGuard構成ファイルを埋め込める。
  • proguard-android-optimize.txtはアプリの最適化ができるが、危険性もありそう。