2011年6月23日

Building and decode Android apk


Android 的程式安裝檔在編譯的過程中會打包成副檔名apk的檔案,其中包含足夠的資訊及資料以便可以在實體裝置或模擬器上使用。Android apk 檔其實就是個 zip 壓縮檔,所以只要在副檔名最後加上 .zip 使它變成一個 zip 壓縮檔即可開啟。主要有五個部分﹕


(1)META-INF 裏面放了簽名及憑證

(2)res 顧名思義,就是資源檔。如圖片、layout設定。

(3)AndroidManifest.xml 記錄應用程式的目的、權限等說明。

(4)classes.dex 由.class檔轉成Dalvik byte code

(5)resoures.arsc 多國字串

下圖是由Android developers抓來的,可以說明apk的組成要素:

Build Process
下圖可以清楚表明怎麼去編譯apk,綠色圈圈代表的是工具,其中apkbuilder 在 Android 3.0 SDK己經改為com.android.sdklib.build.ApkBuilder






Decode process
若要一般的資訊,aapt 工具就可以達到,如想查看某個apk的AndroidManifest.xml
$ aapt dump xmltree SpareParts.apk AndroidManifest.xml
N: android=http://schemas.android.com/apk/res/android
  E: manifest (line=17)
    A: android:versionCode(0x0101021b)=(type 0x10)0x7
    A: android:versionName(0x0101021c)="2.1-update1" (Raw: "2.1-update1")
    A: package="com.android.spare_parts" (Raw: "com.android.spare_parts")
    E: uses-sdk (line=0)
      A: android:minSdkVersion(0x0101020c)=(type 0x10)0x7
      A: android:targetSdkVersion(0x01010270)=(type 0x10)0x7
    E: uses-permission (line=19)
      A: android:name(0x01010003)="android.permission.SET_ANIMATION_SCALE" (Raw: "android.permission.SET_ANIMATION_SCALE")
    E: uses-permission (line=20)
      A: android:name(0x01010003)="android.permission.CHANGE_CONFIGURATION" (Raw: "android.permission.CHANGE_CONFIGURATION")
    E: uses-permission (line=21)
      A: android:name(0x01010003)="android.permission.WRITE_SETTINGS" (Raw: "android.permission.WRITE_SETTINGS")
    E: application (line=23)
      A: android:label(0x01010001)=@0x7f060000
      A: android:icon(0x01010002)=@0x7f020000
      E: activity (line=26)
        A: android:name(0x01010003)="SpareParts" (Raw: "SpareParts")
        E: intent-filter (line=27)
          E: action (line=28)
            A: android:name(0x01010003)="android.intent.action.MAIN" (Raw: "android.intent.action.MAIN")
          E: category (line=29)
            A: android:name(0x01010003)="android.intent.category.DEFAULT" (Raw: "android.intent.category.DEFAULT")
          E: category (line=30)
            A: android:name(0x01010003)="android.intent.category.LAUNCHER" (Raw: "android.intent.category.LAUNCHER")




apktool是一套反編譯apk,同時又可以修改後再編譯回去先前所說apk五大組成部分。它會把classes.dex拆解成數個.smali檔,其本上己經可以一窺原始檔一二。
dex2jar 可以把.dex轉成.jar,再利用jd-guiJAD就可以直接看java檔。
以下為Setting.apk轉成java code。



Reference:
http://developer.android.com/guide/developing/building/index.html#detailed-build

沒有留言: