Android 打包流程詳解

Android 打包流程詳解(待寫)

序言

每次點擊一下Android Studio上的運行以后,就默默的等待程序運行起來硬贯。有時候出現(xiàn)問題百度一下板惑,然后修修改改運行起來就可以了龙致。但是作為一個安卓開發(fā)人員绩脆,我們應(yīng)該去深層次的去理解apk的打包流程以及打包中是如何去做處理的。否則的話暇藏,什么構(gòu)建優(yōu)化硕盹,什么插樁技術(shù),什么hook叨咖,一切都是免談的瘩例。就像我們之前的一篇Android的inflate源碼詳解中,就涉及到了通過AssetManager類調(diào)用Native方法完成對 resources.arsc 文件的解析甸各。當時我們也沒有進行深入的探究這個 resources.arsc 里面到底有什么垛贤?又是如何生成的?。那么今天我們就把這部分的知識也都整理一下趣倾。

匯總圖

我們先上一張apk的最詳細的打包流程圖聘惦。

  1. 打包資源文件,生成R.java文件
  2. 處理aidl文件儒恋,生成Java文件
  3. 將項目源代碼編譯生成class文件
  4. 將所有的calss文件善绎,生成classes.dex文件
  5. 打包生成APK文件
  6. 對APK進行簽名
  7. 對簽名之后的APK文件進行對其處理。

各階段分析

整體的流程圖就是這樣了诫尽,聽著很簡單禀酱。但是其實每一步都有很多東西需要我們?nèi)ヌ幚淼摹6矣袝r候我們的一些技術(shù)可以應(yīng)用到這些打包的過程中牧嫉。

打包資源文件剂跟,生成R.java文件

使用aapt命令來打包AndroidManifest.xml文件和其他資源文件,生成R.java酣藻、Resources.arsc和res文件曹洽。

具體流程:

編譯res和assets目錄下的資源并生成resources.arsc文件,resources.arsc文件包含了資源的ID信息

調(diào)用ResourceTable.cpp文件中的parseAndAddEntry方法根據(jù)ID信息生成R.java文件辽剧。

對res目錄下的xml文件進行編譯送淆,這樣處理過的xml文件就被簡單“加密”了

生成的文件:
  • res目錄。這里生成的res文件都是轉(zhuǎn)化為二進制xml文件的
    • 包括了animator
    • anim
    • color
    • drawable里面的xml文件
    • layout布局文件
    • menu菜單布局文件
    • values文件
    • xml應(yīng)用配置文件
  • R.java文件
    • R.java文件包含了編寫代碼時候用的資源的ID值怕轿。
  • resources.arsc文件
    • resources.arsc這個文件記錄了所有的應(yīng)用程序資源目錄的信息偷崩,包括每一個資源名稱辟拷、類型、值环凿、ID以及所配置的維度信息。是一個資源索引表放吩,在給定資源ID和設(shè)備配置信息的情況下能快速找到資源智听。

知識點:

  1. 這一步里面處理的資源,在應(yīng)用層都是通過ID來進行訪問的在【Android的inflate源碼詳解】中渡紫,我們獲取布局就是使用的資源id到推。
  2. xml之所以編譯成二進制,是因為里面都是各種字符惕澎,不利于快速遍歷莉测。編譯成二進制文件,用數(shù)字替換各種符號唧喉,一方面能快速訪問捣卤,另一方面也能減少大小。
  3. 有時候我們的布局文件寫錯了八孝,程序報無法找到R文件的原因也可以理解了董朝,因為這一步資源文件有問題,文件ID生成失敗干跛,肯定就沒辦法找到R文件了子姜。
  4. apk運行時會根據(jù)設(shè)備的不同屬性(如屏幕密度)尋址,resource.arsc就是通過相同的ID楼入,根據(jù)不同的配置索引找到最佳資源
  5. aapt打包走的是單線程哥捕、流水式任務(wù)從上到下構(gòu)建。所以代碼量越多嘉熊,資源量越多遥赚,構(gòu)建過程越慢

處理aidl,生成Java文件

aidl(Android Interface Definition Language阐肤,Android接口描述語言)鸽捻,位于android-sdk/platform-tools目錄下。aidl工具解析接口定義文件然后生成相應(yīng)的Java代碼接口供程序調(diào)用泽腮。如果項目沒用到aidl則跳過這一步御蒲。

aidl文件很多時候都是跨進行來使用的。

編譯項目源代碼诊赊,生成class文件

Java Compiler階段厚满。項目中所有的Java代碼,R.java和.aidl生成的文件碧磅,都會通過Java編譯器(javac)編譯成.class文件碘箍,生成的class文件位于工程中的bin/classes目錄下遵馆。

這個地方是我們能夠進行操作的地方,在AOP切面編程中丰榴,可以使用Aspect技術(shù)來實現(xiàn)對于通用邏輯的處理货邓。比如點擊事件、日志打印等四濒。

將所有的class文件换况,生成classes.dex文件

這里會將我們工程中生成的class以及第三方的class文件通過dx工具生成classess.dex文件,因為我們的dex文件會有65535的方法數(shù)的限制盗蟆,所以如果方法數(shù)超過了戈二,會打包成多個dex文件。

dx工具主要工作是將Java字節(jié)碼轉(zhuǎn)成Dalvik字節(jié)碼喳资、壓縮常量池觉吭、消除冗余信息等。

打包生成APK文件

所有沒有編譯的資源(如images仆邓、assets目錄下的資源)鲜滩;編譯過的資源(resources.arsc以及二進制xml文件)、.dex文件通過apkbuilder工具打包到最終的.apk文件中节值。

對于未編譯過的文件绒北,打包時會直接打包到APP中,對于這一類資源的訪問察署,應(yīng)用層代碼需要通過文件名對其進行訪問闷游。

調(diào)用流程:

先以resources.arsc文件為基礎(chǔ)生成一個apk

調(diào)用ApkBuilderMain.java中的addSourceFolder方法添加工程資源,處理包括res和assets目錄中的文件贴汪,添加完資源后調(diào)用addResourceFromJar方法往apk中寫入依賴庫

調(diào)用addNativeLibraries方法添加工程libs目錄下的nativey庫

調(diào)用sealApk關(guān)閉Apk文件脐往。

只是點:

  1. 3.0之前用apkbuilder腳本,3.0之后用
  2. apkbuilder腳本也是調(diào)用的sdklib的ApkBuilderMain.java類

對APK進行簽名

apk生成以后扳埂,必須要進行簽名才可以被安裝业簿。在開發(fā)過程中使用的是debug.keystore。

簽名后的APK文件對其

通過zipalign進行文件的對其操作阳懂。對其的過程是將apk包中的所有資源文件距離文件起始偏移調(diào)整為4字節(jié)的整數(shù)倍梅尤。內(nèi)存對于硬件文件的讀取是按照4字節(jié)的整數(shù)倍來進行讀取的,這樣調(diào)整以后岩调,內(nèi)存訪問apk的資源文件時巷燥,就可以整頁的讀取,從而減少運行時內(nèi)存的使用号枕。如果每個資源的開始位置都是上一個資源之后的 4*n字節(jié)缰揪,那么訪問下一個資源就不用遍歷,直接跳到4*n字節(jié)處判斷是不是一個新的資源即可葱淳。

本文由 開了肯 發(fā)布钝腺!

同步公眾號[開了肯]

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末抛姑,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子艳狐,更是在濱河造成了極大的恐慌定硝,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件毫目,死亡現(xiàn)場離奇詭異蔬啡,居然都是意外死亡,警方通過查閱死者的電腦和手機蒜茴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門星爪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來浆西,“玉大人粉私,你說我怎么就攤上這事〗悖” “怎么了诺核?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長久信。 經(jīng)常有香客問我窖杀,道長,這世上最難降的妖魔是什么裙士? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任入客,我火速辦了婚禮,結(jié)果婚禮上腿椎,老公的妹妹穿的比我還像新娘桌硫。我一直安慰自己,他們只是感情好啃炸,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布铆隘。 她就那樣靜靜地躺著,像睡著了一般南用。 火紅的嫁衣襯著肌膚如雪膀钠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天裹虫,我揣著相機與錄音肿嘲,去河邊找鬼。 笑死筑公,一個胖子當著我的面吹牛睦刃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播十酣,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼涩拙,長吁一口氣:“原來是場噩夢啊……” “哼际长!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起兴泥,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤工育,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后搓彻,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體如绸,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年旭贬,在試婚紗的時候發(fā)現(xiàn)自己被綠了怔接。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡稀轨,死狀恐怖扼脐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情奋刽,我是刑警寧澤瓦侮,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站佣谐,受9級特大地震影響肚吏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜狭魂,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一罚攀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧雌澄,春花似錦斋泄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至任柜,卻和暖如春卒废,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背宙地。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工摔认, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人宅粥。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓参袱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子抹蚀,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355