Quantcast
Channel: @blog.justoneplanet.info
Viewing all articles
Browse latest Browse all 46

apkからソースを読んでみる

$
0
0

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ファイルに記述するクラスはクラス名が変更されないような記述が書いてある。


Viewing all articles
Browse latest Browse all 46

Trending Articles