code小生,一個專注 Android 領域的技術平臺 公眾號回復 Android 加入我的安卓技術群
一、APK編譯打包生成過程第一步:打包資源文件,生成R.java文件【輸入】Resource文件(就是工程中res中的文件)、Assets文件(相當于另外一種資源,這種資源Android系統(tǒng)并不像對res中的文件那樣優(yōu)化它)、AndroidManifest.xml文件(包名就是從這里讀取的,因為生成R.java文件需要包名)、Android基礎類庫(Android.jar文件) 【輸出】打包好的資源(一般在Android工程的bin目錄可以看到一個叫resources.ap_的文件就是它了)、R.java文件(在gen目錄中,大家應該很熟悉了) 【工具】aapt工具,它的路徑在${ANDROID_SDK_HOME}/platform-tools/aapt(如果你使用的是Windows系統(tǒng),按慣例路徑應該這樣寫:%ANDROID_SDK_HOME%\platform-tools\aapt.exe,下同)。 第二步:處理AIDL文件,生成對應的.java文件(當然,有很多工程沒有用到AIDL,那這個過程就可以省了)【輸入】源碼文件、aidl文件、framework.aidl文件 【輸出】對應的.java文件 【工具】aidl工具 第三步:編譯Java文件,生成對應的.class文件【輸入】源碼文件(包括R.java和AIDL生成的.java文件)、庫文件(.jar文件) 【輸出】.class文件 【工具】javac工具 第四步:把.class文件轉化成Davik VM支持的.dex文件【輸入】 .class文件(包括Aidl生成.class文件,R生成的.class文件,源文件生成的.class文件),庫文件(.jar文件) 【輸出】.dex文件 【工具】javac工具 第五步:打包生成未簽名的.apk文件【輸入】打包后的資源文件、打包后類文件(.dex文件)、libs文件(包括.so文件,當然很多工程都沒有這樣的文件,如果你不使用C/C++開發(fā)的話) 【輸出】未簽名的.apk文件 【工具】apkbuilder工具 第六步:對未簽名.apk文件進行簽名【輸入】未簽名的.apk文件 【輸出】簽名的.apk文件 【工具】jarsigner 第七步:對簽名后的.apk文件進行對齊處理(不進行對齊處理是不能發(fā)布到 Google Market 的)【輸入】簽名后的.apk文件 【輸出】對齊后的.apk文件 【工具】zipalign工具 二、名詞解釋雖然 Android 程序由 Java 編寫,但是不是運行在 Java 虛擬機上,而是運行在 Dalvik 虛擬機上。 傳統(tǒng)的 Java 程序經(jīng)過編譯,生成 Java 字節(jié)碼保存在 class 文件中,Java 虛擬機通過解碼 class 文件中的內(nèi)容來運行程序。而 Dalvik 虛擬機運行的是 Dalvik 字節(jié)碼,所有的 Dalvik 字節(jié)碼由 Java 字節(jié)碼轉換而來,并被打包到一個 DEX 可執(zhí)行文件中。Dalvik 虛擬機通過解釋 DEX 文件來執(zhí)行這些字節(jié)碼。 class 文件是 Java 文件編譯后生成的可以執(zhí)行的 Java 字節(jié)碼文件,是 Java 虛擬機的可執(zhí)行文件。 dex 文件是 Android 字節(jié)碼文件(機器語言),是 Dalvik 虛擬機可執(zhí)行文件,對比 class 文件由 Java 虛擬機執(zhí)行。(目標程序) smali文件(語言) 是將 Android 字節(jié)碼用可閱讀的字符串形式表現(xiàn)出來的一種語言,可以稱之為 Android 字節(jié)碼的反匯編語言。使用 baksmali或 apktool 可以將 Android 應用程序包(apk 或 jar)反匯編為 smali 代碼。文件里面存放的是 smali 匯編代碼。(匯編代碼) 反匯編就是輸入二進制文件或可執(zhí)行文件輸出匯編代碼的過程,反編譯通常是輸出高級語言。 逆向過程 方法一、APK 解壓生成 dex 文件,用 dex2jar 得到 jar 文件,用 jd-gui 查看 jar 文件源代碼。 方法二、用 Apktool 反編譯 APK 得到 smali 文件,修改 smali 代碼,重新打包成 APK。 學好 smali 這門匯編語言是逆向的基礎。 分享技術我是認真的 |
|
來自: 西北望msm66g9f > 《編程》