【Android】ProguardによるAPKの難読化

2019年3月15日

本稿ではProguardによるAPKの難読化について解説致します。

 

 

APKの難読化はなぜ必要なのか?

APK(アプリ)の難読化を行わないとAPKを入手したユーザが逆アセンブラをかけることにより、

ソースコード上のクラス名やメソッド名、簡単なクラス構造などが

露呈してしまいセキュリティ観点から好ましくありません。

これを防ぐためにAPKの難読化を行います。

 

ProguardでAPKの難読化を行う方法

Proguadと呼ばれる仕組みを利用してAPKの難読かを行います。

まずapp配下のbuld.gradleファイルに下記を記述します。

android {
   ...
 
    buildTypes {
        release {
            //デフォルトだと下記がfalseなのでtrueにします。
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'),
            'proguard-rules.pro'
        }
    }
  }

 

これによりbuildTypeがrelease(本番)の時のみProguardが有効になります!

 

難読化してはいけないクラスやメソッド名

先程のProguardの設定だけだとすべてのクラスやメソッドが難読化されてしまいますが、

実は難読化しているとアプリがエラーになってしまうものもあります。

下記が難読化するとエラーになるものです。

  • AndroidManifest.xmlに直接名前が書かれたActivityやServiceやBroadcastReceiverクラス
  • レイアウトファイルからonClickなどで呼ばれるメソッド名
  • レイアウト上に設置したカスタムビュー
  • WebViewなどでjavascriptから呼ばれるjavaのメソッド名
  • Java Native Interface
  • リフレクションから呼ばれるメソッド

 

上記のクラスやメソッド名を含まないように、proguard.txtでkeepオプションの後に

難読化したくないクラスをパッケージ名で記述します。

 

// MyClassのクラスとその中の全メソッドを難読化対象外にする
-keep class com.MyApp.myapp.MyClass { *; }
// MyClassのクラスのみを難読化対象外にする
-keep class com.MyApp.myapp.MyClass