Android打包詳解

這里寫圖片描述
這里寫圖片描述

第一步:打包資源文件,生成R.java文件。
【輸入】Resource文件(就是工程中res中的文件)爷抓、Assets文件(相當于另外一種資源,這種資源Android系統(tǒng)并不像對res中的文件那樣優(yōu)化它)阻塑、AndroidManifest.xml文件(包名就是從這里讀取的蓝撇,因為生成R.java文件需要包名)、Android基礎類庫(Android.jar文件)
【工具】aapt工具
【輸出】打包好的資源(bin目錄中的resources.ap_文件)陈莽、R.java文件(gen目錄中)
打包資源的工具aapt渤昌,大部分文本格式的XML資源文件會被編譯成二進制格式的XML資源文件,除了assets和res/raw資源被原裝不動地打包進APK之外走搁,其它的資源都會被編譯或者處理独柑。 。
生成過程主要是調(diào)用了aapt源碼目錄下的Resource.cpp文件中的buildResource()函數(shù)私植,該函數(shù)首先檢查AndroidManifest.xml的合法性忌栅,然后對res目錄下的資源子目錄進行處理,處理的函數(shù)為makeFileResource()曲稼,處理的內(nèi)容包括資源文件名的合法性檢查索绪,向資源表table添加條目等,處理完后調(diào)用compileResourceFile()函數(shù)編譯res與asserts目錄下的資源并生成resources.arsc文件贫悄,compileResourceFile()函數(shù)位于aapt源碼目錄的ResourceTable.cpp文件中瑞驱,該函數(shù)最后會調(diào)用parseAndAddEntry()函數(shù)生成R.java文件,完成資源編譯后清女,接下來調(diào)用compileXmlfile()函數(shù)對res目錄的子目錄下的xml文件分別進行編譯钱烟,這樣處理過的xml文件就簡單的被“加密”了,最后將所有的資源與編譯生成的resorces.arsc文件以及“加密”過的AndroidManifest.xml文件打包壓縮成resources.ap_文件(使用Ant工具命令行編譯則會生成與build.xml中“project name”指定的屬性同名的ap_文件)嫡丙。
關于這一步更詳細的流程可閱讀http://blog.csdn.net/luoshengyang/article/details/8744683

第二步:處理aidl文件拴袭,生成相應的java文件。
【輸入】源碼文件曙博、aidl文件拥刻、framework.aidl文件
【工具】aidl工具
【輸出】對應的.java文件
對于沒有使用到aidl的android工程,這一步可以跳過父泳。aidl工具解析接口定義文件并生成相應的java代碼供程序調(diào)用般哼。

第三步:編譯工程源代碼吴汪,生成下相應的class文件。
【輸入】源碼文件(包括R.java和AIDL生成的.java文件)蒸眠、庫文件(.jar文件)
【工具】javac工具
【輸出】.class文件
這一步調(diào)用了javac編譯工程src目錄下所有的java源文件漾橙,生成的class文件位于工程的bin\classes目錄下,上圖假定編譯工程源代碼時程序是基于android SDK開發(fā)的楞卡,實際開發(fā)過程中霜运,也有可能會使用android NDK來編譯native代碼,因此蒋腮,如果可能的話淘捡,這一步還需要使用android NDK編譯C/C++代碼,當然池摧,編譯C/C++代碼的步驟也可以提前到第一步或第二步焦除。

第四步:轉(zhuǎn)換所有的class文件,生成classes.dex文件作彤。
【輸入】 .class文件(包括Aidl生成.class文件膘魄,R生成的.class文件,源文件生成的.class文件)竭讳,庫文件(.jar文件)
【工具】javac工具
【輸出】.dex文件
前面多次提到瓣距,android系統(tǒng)dalvik虛擬機的可執(zhí)行文件為dex格式,程序運行所需的classes.dex文件就是在這一步生成的代咸,使用的工具為dx,dx工具主要的工作是將java字節(jié)碼轉(zhuǎn)換為dalvik字節(jié)碼成黄、壓縮常量池呐芥、消除冗余信息等。

第五步:打包生成apk奋岁。
【輸入】打包后的資源文件思瘟、打包后類文件(.dex文件)、libs文件(包括.so文件闻伶,當然很多工程都沒有這樣的文件滨攻,如果你不使用C/C++開發(fā)的話)
【工具】apkbuilder工具
【輸出】未簽名的.apk文件
打包工具為apkbuilder,apkbuilder為一個腳本文件蓝翰,實際調(diào)用的是android-sdk\tools\lib\sdklib.jar文件中的com.android.sdklib.build.ApkBuilderMain類光绕。它的代碼實現(xiàn)位于android系統(tǒng)源碼的sdk\sdkmanager\libs\sdklib\src\com\android\sdklib\build\ApkBuilderMain.java文件,代碼構建了一個ApkBuilder類畜份,然后以包含resources.arsc的文件為基礎生成apk文件诞帐,這個文件一般為ap_結尾,接著調(diào)用addSourceFolder()函數(shù)添加工程資源爆雹,addSourceFolder()會調(diào)用processFileForResource()函數(shù)往apk文件中添加資源停蕉,處理的內(nèi)容包括res目錄與asserts目錄中的文件愕鼓,添加完資源后調(diào)用addResourceFromJar()函數(shù)往apk文件中寫入依賴庫,接著調(diào)用addNativeLibraries()函數(shù)添加工程libs目錄下的Native庫(通過android NDK編譯生成的so或bin文件)慧起,最后調(diào)用sealApk()關閉apk文件菇晃。

第六步:對apk文件進行簽名。
【輸入】未簽名的.apk文件
【工具】jarsigner
【輸出】簽名的.apk文件
android的應用程序需要簽名才能在android設備上安裝蚓挤,簽名apk文件有兩種情況:一種是在調(diào)試程序時進行簽名磺送,使用eclipse開發(fā)android程序時,在編譯調(diào)試程序時會自己使用一個debug.keystore對apk進行簽名屈尼;另一種是打包發(fā)布時對程序進行簽名册着,這種情況下需要提供一個符合android開發(fā)文檔中要求的簽名文件。簽名的方法也分兩種:一種是使用jdk中提供的jarsigner工具簽名脾歧;另一種是使用android源碼中提供的signapk工具甲捏,它的代碼位于android系統(tǒng)源碼build\tools\signapk目錄下。

第七步:對簽名后的apk文件進行對齊處理鞭执。
【輸入】簽名后的.apk文件
【工具】zipalign工具
【輸出】對齊后的.apk文件
這一步需要使用的工具為zipalign司顿,它位于android-sdk\tools目錄,源碼位于android系統(tǒng)源碼的build\tools\zipalign目錄兄纺,它的主要工作是將spk包進行對齊處理大溜,使spk包中的所有資源文件距離文件起始偏移為4字節(jié)整數(shù)倍,這樣通過內(nèi)存映射訪問apk文件時速度會更快估脆,驗證apk文件是否對齊過的工作由ZipAlign.cpp文件的verify()函數(shù)完成钦奋,處理對齊的工作則由process()函數(shù)完成。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子逐虚,更是在濱河造成了極大的恐慌岛琼,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機富寿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锣夹,“玉大人页徐,你說我怎么就攤上這事∫迹” “怎么了泞坦?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長砖顷。 經(jīng)常有香客問我贰锁,道長赃梧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任豌熄,我火速辦了婚禮授嘀,結果婚禮上,老公的妹妹穿的比我還像新娘锣险。我一直安慰自己蹄皱,他們只是感情好,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布芯肤。 她就那樣靜靜地躺著巷折,像睡著了一般。 火紅的嫁衣襯著肌膚如雪崖咨。 梳的紋絲不亂的頭發(fā)上锻拘,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天,我揣著相機與錄音击蹲,去河邊找鬼署拟。 笑死,一個胖子當著我的面吹牛歌豺,可吹牛的內(nèi)容都是我干的推穷。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼类咧,長吁一口氣:“原來是場噩夢啊……” “哼馒铃!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起痕惋,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤骗露,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后血巍,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡珊随,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年述寡,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叶洞。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡鲫凶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出衩辟,到底是詐尸還是另有隱情螟炫,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布艺晴,位于F島的核電站昼钻,受9級特大地震影響掸屡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜然评,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一仅财、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧碗淌,春花似錦盏求、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至纳像,卻和暖如春荆烈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背爹耗。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工耙考, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人潭兽。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓倦始,卻偏偏與公主長得像,于是被迫代替她去往敵國和親山卦。 傳聞我的和親對象是個殘疾皇子鞋邑,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,127評論 25 707
  • Android插件化基礎的主要內(nèi)容包括 Android插件化基礎1-----加載SD上APKAndroid插件化基...
    隔壁老李頭閱讀 7,109評論 13 48
  • [TOC] 打包流程 前言 我們每一個產(chǎn)品中一般都是由一位同事來負責打包工作的,其他同學一般是不需要關心具體的流程...
    鐘金寶閱讀 1,633評論 0 5
  • 一.APK相關 1.1 APK文件結構 我們簡單把上面的內(nèi)容分析一下: AndroidManifest.xml:清...
    小強大草莓閱讀 3,299評論 0 1
  • 生活中的向往是人的主調(diào)账蓉, 敞開心飛去暢游快樂枚碗, 美好的景色襯托出一個人的心靈, 不管怎樣穿戴她的美都展現(xiàn)出她的實力...
    雨林中的紅葉58閱讀 144評論 0 1