Android APK編譯打包過程

一、概覽

  • APK是AndroidPackage的縮寫,即Android安裝包蕾久,將其發(fā)送至Android手機(jī)或模擬器中執(zhí)行即可安裝,下圖展示了我們?nèi)粘i_發(fā)中從點(diǎn)擊運(yùn)行Android Project到應(yīng)用在設(shè)備上啟動所經(jīng)歷的大體過程:

    運(yùn)行Android Project的大體過程
  • APK是zip格式文件拌夏,但后綴名被修改為apk僧著,通過UnZip解壓后,可以看到其包含如下文件:

    APK目錄結(jié)構(gòu)
    • resources.arsc:該文件是包含配置信息的資源查詢表障簿,起著連接代碼與資源的作用盹愚。Dex 文件中的 R.class 僅包含資源 id,AssetManager 會利用 id 到 arsc 表中查詢與當(dāng)前設(shè)備信息最匹配的資源文件路徑(或資源內(nèi)容)站故。

    • AndroidManifest.xml:Project中AndroidManifest.xml編譯后得到的二進(jìn)制xml文件

    • META-INF:應(yīng)用簽名信息皆怕,該目錄在應(yīng)用簽名后生成,用于校驗(yàn)資源文件是否被篡改西篓,防止二次打包時資源文件被替換愈腾,主要包括下面三個文件:

      • CERT.RSA:保存公鑰、加密算法及其私鑰加密后的內(nèi)容岂津。
      • MANIFEST.MF:摘要文件虱黄,包含APK內(nèi)所有文件的路徑及其 SHA1/SHA256 值。
      • CERT.SF:對摘要的簽名文件吮成,包含APK內(nèi)所有文件的路徑橱乱,及其在 MANIFEST.MF 中對應(yīng)信息的 SHA1/SHA256 值辜梳。
    • res:Project中res目錄下(除了 values)資源文件編譯后得到的二進(jìn)制xml文件,這些文件路徑同時會體現(xiàn)在 resources.arsc 中泳叠。

    • classes.dex:Dex是DalvikVM executes的縮寫作瞄,即Android Dalvik可執(zhí)行程序。APK 中可能包含一個或多個 classes.dex 文件危纫,應(yīng)用程序內(nèi)的 Java/Kotlin 源碼最終會以 dalvik 字節(jié)碼的方式存在于 classes.dex 文件中

    • lib:native libraries粉洼,即源碼工程 jni 目錄下的 so 文件,二級目錄必須為 NDK支持的 ABI叶摄。因?yàn)楸卷?xiàng)目為新建項(xiàng)目,沒有l(wèi)ibs目錄安拟,所以解壓APK也沒有l(wèi)ib

    • assets:與 res/ 資源目錄不同蛤吓,assets/ 下的資源文件不會在 resources.arsc 中生成查詢條目,且 assets/ 下的資源目錄可完全自定義糠赦,業(yè)務(wù)代碼獲取 assets 資源和 res 資源的方式也完全不同会傲。因?yàn)楸卷?xiàng)目為新建項(xiàng)目,沒有assets目錄拙泽,所以解壓APK也沒有assets

二淌山、具體過程

APK編譯打包的具體過程
  • 在APK編譯打包過程中,用到了以下工具顾瞻,這些工具大部分位于Android SDK的build-tools目錄下:

    • aapt:全稱Android Asset Packaging Tool泼疑,即Android資源打包工具

    • aidl:將.aidl文件轉(zhuǎn)換為.java文件的工具

    • Java Compiler:java編譯器,將.java文件轉(zhuǎn)換為.class文件的工具荷荤,運(yùn)行命令javac

    • dex:將.class文件轉(zhuǎn)換為Davik VM能識別的.dex文件的工具退渗,運(yùn)行命令dx

    • apkbuilder:生成APK的工具

    • Jarsigner:.jar文件的簽名工具

    • zipalign:字節(jié)碼對齊工具

  • Android Project編譯打包主要分為如下7個步驟:

    1. aapt過程:使用aapt/aapt2打包res目錄資源文件,生成R.java蕴纳、resources.arsc和res目錄会油。

      • R.java保存了res目錄下所有資源的id,數(shù)據(jù)類型都是整型古毛,我們在程序中都是通過使用Android API依據(jù)R文件中的資源id來獲取對應(yīng)資源

        R文件結(jié)構(gòu)
    2. aidl生成Java文件:AIDL是Android Interface Definition Language的縮寫翻翩,是Android跨進(jìn)程通訊的一種方式,該階段會檢索Project中所有的aidl文件稻薇,并轉(zhuǎn)換為對應(yīng)的Java文件嫂冻。

    3. javac編譯:使用JDK里的javac編譯Project src目錄下的Java源文件、R.java以及aidl生成的Java文件塞椎,并生成.class文件絮吵。

    4. 生成DEX文件:通過dx工具將.class文件轉(zhuǎn)換為classes.dex,目前的gradle multi-dex編譯方式會生成classes2.dex ... classesN.dex忱屑。

    5. 打包生成APK:使用apkBuilder將resources.arsc蹬敲、res目錄暇昂、AndroidManifest.xml、assets目錄伴嗡、dex文件打包成初始APK急波,具體邏輯是在com.android.sdklib.build.ApkBuilder中實(shí)現(xiàn)的。

    6. 簽名apk文件:使用apksigner為APK添加簽名信息

    7. zipalign優(yōu)化簽名包:使用zipalign工具對簽名包進(jìn)行內(nèi)存對齊操作瘪校,即優(yōu)化安裝包的結(jié)構(gòu)澄暮。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市阱扬,隨后出現(xiàn)的幾起案子泣懊,更是在濱河造成了極大的恐慌,老刑警劉巖麻惶,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件馍刮,死亡現(xiàn)場離奇詭異,居然都是意外死亡窃蹋,警方通過查閱死者的電腦和手機(jī)卡啰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來警没,“玉大人匈辱,你說我怎么就攤上這事∩奔#” “怎么了亡脸?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長树酪。 經(jīng)常有香客問我梗掰,道長,這世上最難降的妖魔是什么嗅回? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任及穗,我火速辦了婚禮,結(jié)果婚禮上绵载,老公的妹妹穿的比我還像新娘埂陆。我一直安慰自己,他們只是感情好娃豹,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布焚虱。 她就那樣靜靜地躺著,像睡著了一般懂版。 火紅的嫁衣襯著肌膚如雪鹃栽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天躯畴,我揣著相機(jī)與錄音民鼓,去河邊找鬼薇芝。 笑死,一個胖子當(dāng)著我的面吹牛丰嘉,可吹牛的內(nèi)容都是我干的夯到。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼饮亏,長吁一口氣:“原來是場噩夢啊……” “哼耍贾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起路幸,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤荐开,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后简肴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晃听,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年着帽,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片移层。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡仍翰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出观话,到底是詐尸還是另有隱情予借,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布频蛔,位于F島的核電站灵迫,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏晦溪。R本人自食惡果不足惜瀑粥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望三圆。 院中可真熱鬧狞换,春花似錦、人聲如沸舟肉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽路媚。三九已至黄琼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間整慎,已是汗流浹背脏款。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工围苫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人弛矛。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓够吩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親丈氓。 傳聞我的和親對象是個殘疾皇子周循,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容