Android Proguard再再入門 – ① –

この記事は公開されてから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の概要と有効にする方法でした。

次回は具体的にリバースエンジニアリングして、どのように変換されているのかみてみます。