【Android Studio】ProGuardとは?アプリの圧縮と難読化

【Android Studio】ProGuardとは?アプリの圧縮と難読化

この記事からわかること

  • Android Studio StudioProGuardとは?
  • アプリ圧縮難読化
  • proguard-rules.proファイルの使い方

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

環境

公式リファレンス:Shrink, obfuscate, and optimize your app

ProGuardとは?

ProGuard」とはAndroidアプリのコードを縮小、難読化、最適化するための機能です。具体的にはリリースビルドをビルドする際に自動で処理が走るようになっており不要なコードの削除やクラス名の短縮化などアプリの容量が軽くなるような処理を実行してくれます。

設定自体はAndroid Studioの標準ビルドシステムである「Gradle」から設定することが可能になっています。ProGuardはデフォルトではOFFになっています。これはビルド時に色々な処理が走るためプロジェクトのビルド時間が増加してしまう点と適切に保持するコードをカスタマイズしないと必要なコードまで削除されてしまい予期せぬバグを引き起こす可能性があるからです。

ProGuardを有効にする

ProGuardを有効にするには「build.gradle(Module)」のbuildTypes内の環境変数ごとに設定することができる設定でminifyEnabledtrueにします。Android Studioで新規プロジェクトを作成するとデフォルトでも明示的にfalseが指定されているのでそれを変更すればOKです。

buildTypes {
    release {
        // ProGuard(コードの縮小、最適化、難読化)を有効にするフラグ
        minifyEnabled true
        // リソースの縮小を有効にするフラグ
        shrinkResources true
        // ProGuard ルール ファイル
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
}

minifyEnabledtrueにする場合は必ず「debuggable false」を指定したビルド変数を使用しなければならないことだけ注意してください。

設定ルールファイル

ProGuardの細かい挙動を制御するために専用の設定ルールファイルを使用してカスタマイズすることが可能です。専用ルールファイルは「proguard-rules.pro」としてデフォルトで用意されています。コンパイル時にこのファイルを読み込み、設定ファイル「proguard-android-optimize.txt」が自動生成されます。

【Android Studio】ProGuardとは?アプリの圧縮と難読化

特定のクラスを対象外にする

ProGuardで特定のクラスをコード削除や難読化の対象外に設定するにはkeepオプションを使用します。

-keep public class com.example.myapp.MyClass

keep関連のオプションは他にも以下のような種類があります。

オプション 詳細
keep クラスとクラスメンバを削除、難読化しない
keepnames クラスとクラスメンバを難読化しない
keepclassmembers クラスメンバを削除、難読化しな
keepclassmembernames クラスメンバを難読化しない
keepclasseswithmembers クラスメンバが存在した場合のクラスとクラスメンバを削除しない
keepclasseswithmembernames クラスメンバが存在した場合のクラスとクラスメンバを難読化しない

公式リファレンス:ProGuard マニュアル

ライブラリの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であれば難読化してしまうとクラッシュレポートが正しく表示されなくなってしまうので上記のようなルールを反映させておく必要があるようです。

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index