【Android Studio】ProGuardとは?アプリの圧縮と難読化
この記事からわかること
- Android Studio StudioのProGuardとは?
- アプリの圧縮と難読化
- proguard-rules.proファイルの使い方
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
環境
- Android Studio:Koala
- Kotlin:1.9.0
公式リファレンス:Shrink, obfuscate, and optimize your app
ProGuardとは?
「ProGuard」とはAndroidアプリのコードを縮小、難読化、最適化するための機能です。具体的にはリリースビルドをビルドする際に自動で処理が走るようになっており不要なコードの削除やクラス名の短縮化などアプリの容量が軽くなるような処理を実行してくれます。
- コード/リソース圧縮:アプリ内・ライブラリ内から未使用のコード(クラスやメソッドなど)やリソースを検出し削除する
- 最適化:パフォーマンス向上のためコードの冗長性を排除(使用されていないelse文など)
- 難読化:クラスとメンバーの名前を短縮しサイズを縮小する
設定自体はAndroid Studioの標準ビルドシステムである「Gradle」から設定することが可能になっています。ProGuardはデフォルトではOFFになっています。これはビルド時に色々な処理が走るためプロジェクトのビルド時間が増加してしまう点と適切に保持するコードをカスタマイズしないと必要なコードまで削除されてしまい予期せぬバグを引き起こす可能性があるからです。
ProGuardを有効にする
ProGuardを有効にするには「build.gradle(Module)」のbuildTypes
内の環境変数ごとに設定することができる設定でminifyEnabled
をtrue
にします。Android Studioで新規プロジェクトを作成するとデフォルトでも明示的にfalse
が指定されているのでそれを変更すればOKです。
buildTypes {
release {
// ProGuard(コードの縮小、最適化、難読化)を有効にするフラグ
minifyEnabled true
// リソースの縮小を有効にするフラグ
shrinkResources true
// ProGuard ルール ファイル
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
minifyEnabled
をtrue
にする場合は必ず「debuggable false」を指定したビルド変数を使用しなければならないことだけ注意してください。
設定ルールファイル
ProGuardの細かい挙動を制御するために専用の設定ルールファイルを使用してカスタマイズすることが可能です。専用ルールファイルは「proguard-rules.pro」としてデフォルトで用意されています。コンパイル時にこのファイルを読み込み、設定ファイル「proguard-android-optimize.txt」が自動生成されます。
特定のクラスを対象外にする
ProGuardで特定のクラスをコード削除や難読化の対象外に設定するにはkeep
オプションを使用します。
-keep public class com.example.myapp.MyClass
keep関連のオプションは他にも以下のような種類があります。
オプション | 詳細 |
---|---|
keep | クラスとクラスメンバを削除、難読化しない |
keepnames | クラスとクラスメンバを難読化しない |
keepclassmembers | クラスメンバを削除、難読化しな |
keepclassmembernames | クラスメンバを難読化しない |
keepclasseswithmembers | クラスメンバが存在した場合のクラスとクラスメンバを削除しない |
keepclasseswithmembernames | クラスメンバが存在した場合のクラスとクラスメンバを難読化しない |
ライブラリのProGuard
ライブラリを導入している場合はライブラリのREADMEやリファレンスなどに「proguard-rules.pro」に設定する内容を記述していたりするものをあるのでコピペして使用すればOKです。
例:Crashlytics ダッシュボードで読み取り可能なクラッシュ レポートを取得する
-keepattributes SourceFile,LineNumberTable # Keep file names and line numbers.
-keep public class * extends java.lang.Exception # Optional: Keep custom exceptions.
例えばFirebase Crashlyticsであれば難読化してしまうとクラッシュレポートが正しく表示されなくなってしまうので上記のようなルールを反映させておく必要があるようです。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。