Proguardを使ったアプリのapkを逆コンパイルしてソースを読んでみる。
unzip Hello.apk wget https://dex2jar.googlecode.com/files/dex2jar-0.0.9.15.zip unzip dex2jar-0.0.9.15.zip
classes.dexをjarに変換する。
./dex2jar.sh ~/Hello/classes.dex
面倒なのでJava Decompilerのツールでjarをそのまま開く。
■比較
定数は以下のように展開されて削除されている。
private static final int HELLO_ID = 1;
// nothing
staticでなければ残るが変数名は変えられる。
public final int HELLO_CODE = 1;
public final int rk = 1;
ギャラリーから取得したuriをパス表記にする以下のメソッドは
protected String convertMediaUriToPath(Uri uri) { String [] proj = {MediaStore.Images.Media.DATA}; Cursor cursor = getContentResolver().query(uri, proj, null, null, null); if (cursor != null) {// prevent from NullPointerException of the stack trace int index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); String path = cursor.getString(index); cursor.close(); return path; } return null; }
以下のようにメソッド名が簡潔になり、変数名も簡略化される。Proguardを使わなくても定数は展開される。
protected String a(Uri paramUri) { String[] arrayOfString = { "_data" }; Cursor localCursor = getContentResolver().query(paramUri, arrayOfString, null, null, null); String str = null; if (localCursor != null) { int i = localCursor.getColumnIndexOrThrow("_data"); localCursor.moveToFirst(); str = localCursor.getString(i); localCursor.close(); } return str; }
以下のようにActivityのクラス名は変わらない。
public class HelloActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) {
public class HelloActivity extends Activity { protected void onCreate(Bundle savedInstanceState) {
これはProguardの設定に以下のような記述があるからである。
vim ~/android-sdk-mac_x86/tools/proguard/proguard-android.txt
# We want to keep methods in Activity that could be used in the XML attribute onClick -keepclassmembers class * extends android.app.Activity { public void *(android.view.View); }
その他にもproguard-android.txtには、manifestファイルに記述するクラスはクラス名が変更されないような記述が書いてある。