Android再愛我一次(1)——APK打包流程
被xx跳動大佬使勁兒蹂躪了一把,趕緊回來總結總結
講道理,從來沒有關心過這個流程。平時直接IDE裡面builder APK,就能生
成自己所需要的東西了,但這背後的故事,你知道麼?
我們先偷一張圖:

image.png
1. 目標與原料
首先,看我們有什麼東西:
這裡所說的工程目錄並不是說工程結構,我們只考慮在打包過程中,需要分類的幾種資源。在使用AS寫程式碼中,我們一般會涉及一下幾種:
- 可二進位制的資原始檔
- 不可二進位制資原始檔(如raw,assets目錄中)
- aidl檔案
- java原始碼(.kt的大佬放過我)
- lib包與module依賴
接下來的步驟,就是將不同的資源分別處理
我們的目標是什麼呢,一個apk檔案。其實apk檔案是可以被解壓縮的,將字尾改為.zip即可解壓縮。我這裡演示一個未加固的apk檔案解壓

2. 分析圖中流程
1. aapt
aapt用來打包res資原始檔,生成R.java、resources.arsc和res檔案(二進位制 & 非二進位制如res/raw和pic保持原樣)
- res資原始檔有很多檔案:animator,anim,color,drawable,layout,menu,raw,value,xml。
-
R.java
大家肯定不會陌生,在編譯過程中,它會儲存已係列的整形索引來查詢引用目標檔案。大家都用過就不多解釋了:
- resources.arsc
這個檔案記錄了所有的應用程式資源目錄的資訊,包括每一個資源名稱、型別、值、ID以及所配置的維度資訊,即資源索引表。為什麼我們可以通過整形的Id值就能拿到想要的資源呢,靠的就是這個傢伙了。
2. aidl
aidl指令可以將aidl檔案生成對應的介面檔案,我們在程式碼中接觸過,不過多解釋了
3. java compile
通過Java Compiler編譯R.java, .interface、 .java,生成.class檔案。
4. dex
將.class檔案和第三方庫中的.class檔案處理生成dex檔案,如果使用了MutiDex,將生成多個dex包,比如我的專案。
5. apkBuilder
*.dex、resources.arsc、res資料夾(res/raw資源被原裝不動地打包進APK之外,其它的資源都會被編譯或者處理)、Other Resources(assets資料夾)、AndroidManifest.xml打包成apk檔案。
注意:
res/raw和assets的相同點:
兩者目錄下的檔案在打包後會原封不動的儲存在apk包中,不會被編譯成二進位制。
res/raw和assets的不同點:
1.res/raw中的檔案會被對映到R.java檔案中,訪問的時候直接使用R檔案的內部類的值即可;assets資料夾下的檔案不會被對映到R.java中,訪問的時候需要AssetManager,該類的例項可以直接在Context中使用,但其構造方法被標記了@hide。若需要初始化,需要利用反射。
2.res/raw不可以有目錄結構,而assets則可以有目錄結構,也就是assets目錄下可以再建立資料夾
6. JarSigner
簽名階段。
一個Android應用程式沒有經過數字簽名,是沒有辦法安裝到系統中的。我們直接執行的時候好像沒有簽名階段啊,其實為了方便我們開發除錯程式,IDE已經自動的使用debug金鑰為應用程式簽名。
用過加固的老哥們會說了,為什麼加固之後會要求重新簽名呢?
先甩一個連線,之後研究研究吧 ofollow,noindex">eofguo
7. zipalign
對壓縮包進行對其處理(不知道有什麼用)