Android Proguard再再入門 – ① –
アプリのリリースをするときに、Proguardをかけて、アプリの難読化、不必要なコードを削除などをします。 しかし、よくわからないエラーに遭遇したり、OSSなどのライブラリを使うとき、keepほげほげというおまじないをいれたりっと つまづくポイントが多いです。 なるべく噛み砕いて、具体的な例を出しながら説明をします。
Proguardって?
Proguard http://proguard.sourceforge.net/
Creating more compact code, for smaller code archives, faster transfer across networks, faster loading, and smaller memory footprints. Making programs and libraries harder to reverse-engineer. Listing dead code, so it can be removed from the source code. Retargeting and preverifying existing class files for Java 6 or higher, to take full advantage of their faster class loading.
ざっくり。 - コードを最適化 - リバースエンジニアリングをしにくくする - デットコードを削除(結果に影響しないコードの削除)
具体的に何をしてるのかというと
- クラス名、メソッド、メンバー変数などをaとかbとかに置換して読みにくくする。
- どこでも使用されていないクラス、メソッド、メンバー変数などを削除する
結果として、apkのサイズも小さくなります。
余談:Androidは65kのメソッド数までなので、
プロガードをかけると不必要なメソッドは削除されるので、超えてしまった時にも効果があります。
サンプルで使うソース
サンプルコードは、Android StudioのNew Projectから、emptyで作ったプロジェクトで説明する。
MainActivity
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
app/build.gradle
apply plugin: 'com.android.application' android { compileSdkVersion 23 buildToolsVersion "23.0.3" defaultConfig { applicationId "com.example.proguard.sample" minSdkVersion 15 targetSdkVersion 23 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.4.0' }
実際にやってみる
- minifyEnabled false + minifyEnabled true
Proguardのon/off設定はこれだけです。
プロガードの設定は
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
getDefaultProguardFile('proguard-android.txt')は、android_sdk_path/tools/proguard/proguard-android.txt
にあります。
次回
今回は、Proguardの概要と有効にする方法でした。
次回は具体的にリバースエンジニアリングして、どのように変換されているのかみてみます。