0x00 前言
通常一個團(tuán)隊(duì)都會有一個人專門負(fù)責(zé)打包,對于其他同學(xué)并不需要關(guān)注具體打包的細(xì)節(jié)。然而,我們存在的意義不是為了僅僅滿足工作的需求,而是要讓自己掌握的東西更多、不斷成長。
關(guān)于打包序列文字,我的計(jì)劃分成幾篇文章來介紹:
打包流程梳理
多渠道打包
多渠道快速打包
自動化構(gòu)建
本文介紹基本打包流程。
通常有2種打包方式:
Android Studio圖形界面 點(diǎn)擊run按鈕
命令行方式 gradlew assembleDebug, gradlew assembleRelease
方式1使用自動生成的debug keystore簽名;方式2如果是Release包使用release keystore簽名,如果是Debug包則使用debug keystore簽名。
下面講下從一堆源代碼到產(chǎn)生apk文件的過程。
0x01 基本流程

上圖是Android官方提供的打包簡略流程圖。清晰地展示了一個Android Project經(jīng)過編譯和打包后生成apk文件,然后再經(jīng)過簽名,就可以安裝到設(shè)備上。
我們將一個實(shí)際的apk文件后綴改為zip并解壓后,得到的內(nèi)容如下:

和上圖的描述一致。apk包內(nèi)容包括:
classes.dex…
resources.arsc
assets
res
AndroidManifest.xml
META-INF
其中:
res中圖片和raw文件下內(nèi)容保持原樣,res中其他xml文件內(nèi)容均轉(zhuǎn)化為二進(jìn)制形式;assets文件內(nèi)容保持原樣
res中的文件會被映射到R.java文件中,訪問的時候直接使用資源ID即R.id.filename;assets文件夾下的文件不會被映射到R.java中,訪問的時候需要AssetManager類
0x02 詳細(xì)流程
下面這張圖是官網(wǎng)提供的詳細(xì)流程圖。

我們可以將整個打包過程概括為以下幾步:
通過aapt打包res資源文件,生成R.java、resources.arsc和res文件(二進(jìn)制 & 非二進(jìn)制如res/raw和pic保持原樣)
處理.aidl文件,生成對應(yīng)的Java接口文件
通過Java Compiler編譯R.java、Java接口文件、Java源文件,生成.class文件
通過dex命令,將.class文件和第三方庫中的.class文件處理生成classes.dex
通過apkbuilder工具,將aapt生成的resources.arsc和res文件、assets文件和classes.dex一起打包生成apk
通過Jarsigner工具,對上面的apk進(jìn)行debug或release簽名
通過zipalign工具,將簽名后的apk進(jìn)行對齊處理。
以上步驟均為必須,否則不能在設(shè)備上安裝。
關(guān)于zipalign工具,根據(jù)名字就知道是個zip文件對齊的工具。使得apk中的資源文件偏離文件起始位置4個字節(jié),從而可以通過mmap()直接訪問,從而減少RAM占用。
更詳細(xì)的流程,可以看下圖。
