被xx跳動大佬使勁兒蹂躪了一把暇唾,趕緊回來總結(jié)總結(jié)
講道理欠窒,從來沒有關(guān)心過這個流程。平時直接IDE里面builder APK铸屉,就能生
成自己所需要的東西了钉蒲,但這背后的故事,你知道么彻坛?
我們先偷一張圖:
1. 目標(biāo)與原料
首先,看我們有什么東西:
這里所說的工程目錄并不是說工程結(jié)構(gòu)顷啼,我們只考慮在打包過程中,需要分類的幾種資源昌屉。在使用AS寫代碼中钙蒙,我們一般會涉及一下幾種:
- 可二進(jìn)制的資源文件
- 不可二進(jìn)制資源文件(如raw,assets目錄中)
- aidl文件
- java源代碼(.kt的大佬放過我)
- lib包與module依賴
接下來的步驟,就是將不同的資源分別處理
我們的目標(biāo)是什么呢间驮,一個apk文件躬厌。其實apk文件是可以被解壓縮的,將后綴改為.zip即可解壓縮竞帽。我這里演示一個未加固的apk文件解壓
2. 分析圖中流程
1. aapt
aapt用來打包res資源文件扛施,生成R.java、resources.arsc和res文件(二進(jìn)制 & 非二進(jìn)制如res/raw和pic保持原樣)
- res資源文件有很多文件:animator屹篓,anim疙渣,color,drawable堆巧,layout妄荔,menu泼菌,raw,value懦冰,xml灶轰。
-
R.java
大家肯定不會陌生,在編譯過程中刷钢,它會存儲已系列的整形索引來查找引用目標(biāo)文件笋颤。大家都用過就不多解釋了:
- resources.arsc
這個文件記錄了所有的應(yīng)用程序資源目錄的信息,包括每一個資源名稱内地、類型伴澄、值、ID以及所配置的維度信息阱缓,即資源索引表非凌。為什么我們可以通過整形的Id值就能拿到想要的資源呢,靠的就是這個家伙了荆针。
2. aidl
aidl指令可以將aidl文件生成對應(yīng)的接口文件敞嗡,我們在代碼中接觸過,不過多解釋了
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資源被原裝不動地打包進(jìn)APK之外吟宦,其它的資源都會被編譯或者處理)、Other Resources(assets文件夾)涩维、AndroidManifest.xml打包成apk文件殃姓。
注意:
res/raw和assets的相同點:
兩者目錄下的文件在打包后會原封不動的保存在apk包中,不會被編譯成二進(jìn)制激挪。
res/raw和assets的不同點:
1.res/raw中的文件會被映射到R.java文件中,訪問的時候直接使用R文件的內(nèi)部類的值即可锋叨;assets文件夾下的文件不會被映射到R.java中垄分,訪問的時候需要AssetManager,該類的實例可以直接在Context中使用娃磺,但其構(gòu)造方法被標(biāo)記了@hide薄湿。若需要初始化,需要利用反射。
2.res/raw不可以有目錄結(jié)構(gòu)豺瘤,而assets則可以有目錄結(jié)構(gòu)吆倦,也就是assets目錄下可以再建立文件夾
6. JarSigner
簽名階段。
一個Android應(yīng)用程序沒有經(jīng)過數(shù)字簽名坐求,是沒有辦法安裝到系統(tǒng)中的蚕泽。我們直接運行的時候好像沒有簽名階段啊,其實為了方便我們開發(fā)調(diào)試程序桥嗤,IDE已經(jīng)自動的使用debug密鑰為應(yīng)用程序簽名须妻。
用過加固的老哥們會說了,為什么加固之后會要求重新簽名呢泛领?
先甩一個連接荒吏,之后研究研究吧 eofguo
7. zipalign
對壓縮包進(jìn)行對其處理(不知道有什么用)