Android apk ファイルの解析
まず
Android 端末を USB デバッグ有効にして
PCとつなげます
adb shell pm list packages -f
でインストールしているアプリのパッケージをみることができるので
この出力結果を元に apk ファイルをPCに抜きだします
ちなみに、大量にインストールしていると
見分けるのが大変なので
grep コマンドをパイプで使うと簡単に見れます
例えば、パッケージ名に developapp とあるなら
adb shell pm list packages -f | grep developapp
とします
この developapp をパッケージ名の一部に変更すれば見つけやすくなります
PCへの抜きだしは adb pull でできるので
今回はGallery を開くアプリを抜き出すので
adb shell pm list packages -f | grep galle
で目星をつけて、結果として出力された
package:/data/app/net.developapp.opengallery-1.apk=net.developapp.opengallery package:/data/app/net.developapp.exifgallery-1.apk=net.developapp.exifgallery package:/system/app/GalleryGoogle.apk=com.google.android.gallery3d
から
net.developapp.opengallery-1.apk=net.developapp.opengallery
を抜き出すことにします
adb pull /data/app/net.developapp.opengallery-1.apk
まずは
Android Manifest.xml の中身を見るには
aapt コマンドを使います
このコマンドの場所は
パスを通していないのなら
android-sdk-linux/build-tools/
の中
ネットで検索すると
17.0.0
とかあるけど
ls コマンドで調べてみたら
drwxrwxr-x 11 snowpool snowpool 4096 5月 14 2014 ./ drwxr-x--- 13 snowpool snowpool 4096 5月 14 2014 ../ drwxrwxr-x 4 snowpool snowpool 4096 11月 26 2013 17.0.0/ drwxrwxr-x 4 snowpool snowpool 4096 11月 26 2013 18.0.1/ drwxrwxr-x 4 snowpool snowpool 4096 11月 26 2013 18.1.0/ drwxrwxr-x 4 snowpool snowpool 4096 11月 26 2013 18.1.1/ drwxrwxr-x 4 snowpool snowpool 4096 3月 17 2014 19.0.0/ drwxrwxr-x 4 snowpool snowpool 4096 3月 17 2014 19.0.1/ drwxrwxr-x 4 snowpool snowpool 4096 3月 17 2014 19.0.2/ drwxrwxr-x 4 snowpool snowpool 4096 3月 17 2014 19.0.3/ drwxrwxr-x 4 snowpool snowpool 4096 5月 14 2014 19.1.0/
とバージョンごとに分かれている模様
とりあえず、今回は最新っぽい 19.1.0 を使って見ます
android-sdk-linux/build-tools/19.1.0/aapt l -a net.developapp.opengallery-1.apk
これで端末にAndroidManifest.xml の情報がでてきます
とはいってもソースコードがでるわけではないので注意
AndroidManifest.xml に燗する情報は
Android manifest:
とかかれているところから下の部分
今回は以下のようなかんじ
Android manifest: N: android=http://schemas.android.com/apk/res/android E: manifest (line=2) A: android:versionCode(0x0101021b)=(type 0x10)0x1 A: android:versionName(0x0101021c)="1.0" (Raw: "1.0") A: package="net.developapp.opengallery" (Raw: "net.developapp.opengallery") E: uses-sdk (line=7) A: android:minSdkVersion(0x0101020c)=(type 0x10)0x11 A: android:targetSdkVersion(0x01010270)=(type 0x10)0x11 E: application (line=11) A: android:theme(0x01010000)=@0x7f060001 A: android:label(0x01010001)=@0x7f050000 A: android:icon(0x01010002)=@0x7f020000 A: android:debuggable(0x0101000f)=(type 0x12)0xffffffff A: android:allowBackup(0x01010280)=(type 0x12)0xffffffff E: activity (line=16) A: android:label(0x01010001)=@0x7f050000 A: android:name(0x01010003)="net.developapp.opengallery.MainActivity" (Raw: "net.developapp.opengallery.MainActivity") E: intent-filter (line=19) E: action (line=20) A: android:name(0x01010003)="android.intent.action.MAIN" (Raw: "android.intent.action.MAIN") E: category (line=22) A: android:name(0x01010003)="android.intent.category.LAUNCHER" (Raw: "android.intent.category.LAUNCHER")
次に apk ファイルのソースコードをみる方法
これは apk ファイルは zip形式ファイルなので
拡張子を apk から zip に変更すれば中身をみれる
cp net.developapp.opengallery-1.apk net.developapp.opengallery-1.zip
としてファイルをコピーして zip 形式に変更
解凍するとファイルが広がるので
mkdir apk cp net.developapp.opengallery-1.zip apk/ cd apk unzip net.developapp.opengallery-1.zip apk/
とすると解凍したときにわかりやすい
ファイル一覧をみたいので
drwxrwxr-x 4 snowpool snowpool 4096 1月 30 21:35 ./ drwx------ 83 snowpool snowpool 69632 1月 30 21:34 ../ -rw-rw-r-- 1 snowpool snowpool 1708 1月 14 20:50 AndroidManifest.xml drwxrwxr-x 2 snowpool snowpool 4096 1月 30 21:35 META-INF/ -rw-rw-r-- 1 snowpool snowpool 714684 1月 14 20:50 classes.dex -rw-r--r-- 1 snowpool snowpool 289161 1月 30 21:35 net.developapp.opengallery-1.zip drwxrwxr-x 8 snowpool snowpool 4096 1月 30 21:35 res/ -rw-rw-r-- 1 snowpool snowpool 3424 1月 14 20:49 resources.arsc
この中にある classes.dex
がプログラムの本体
画像などのリソースファイルについては
res フォルダの中にあります
注意点としては
これらのxmlファイルはバイナリファイルになっているためテキストファイルのようにソースをみることができません
これを解析するツールがGoogle から提供されているので
これをダウンロード
https://code.google.com/p/dex2jar/
今回は
dex2jar-0.0.9.15.zip
をダウンロードして解凍
Ubuntu なら
unzip dex2jar-0.0.9.15.zip
これで
dex2jar-0.0.9.15 の中に
dex2jar.sh
があるので、これを使って
classes.dex を jar に変換する
~/dex2jar-0.0.9.15/dex2jar.sh classes.dex
で
classes_dex2jar.jar
が作製される
この jar ファイルを逆コンパイルした状態で閲覧するには
jd-gui を使います
http://jd.benow.ca/
からダウンロード可能で
windows
mac
Linux
どれでも対応しています
今回は Linux 対応版をダウンロード
tar zxvf jd-gui-0.3.5.linux.i686.tar.gz
で解凍します
解凍すると
jd-gui*
があるので
./jd-gui
で起動
あとは
ソースコードをみたい jar ファイルをドラッグ&ドロップするとソースコードをみることができます