この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
アプリのリリースをするときに、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の概要と有効にする方法でした。
次回は具体的にリバースエンジニアリングして、どのように変換されているのかみてみます。