背景/概要
Androidのライブラリモジュールを作成するとconsumer-rules.pro
とproguard-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.pro
もproguard-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
はアプリの最適化ができるが、危険性もありそう。