Android APK打包流程備忘

前言

APK文件的組成部分及apk打包流程是Android開發(fā)中的基礎(chǔ)知識點(diǎn),做一個簡單的記錄。

一、APK組成部分

apk文件是Android應(yīng)用包文件格式,其本質(zhì)是一個壓縮文件。將apk文件拖動到Android Studio中即可查看里面的內(nèi)容,如下圖:

apk包目錄.JPG

從上圖中可以看到apk包里的幾個重要組成部分:

  1. lib:lib文件夾里面存放動態(tài)鏈接庫,這些內(nèi)容不需要在做apk打包時一系列壓縮處理。

  2. META-INF:是簽名文件夾,用來保證apk包的完整性和系統(tǒng)的安全性。

  3. res:資源文件夾,包括圖片,字符串等。

  4. AndroidManifest.xml文件:AndroidManifest.xml文件是Android工程中的必備文件,是位于項(xiàng)目根目錄的全局配置文件,文件中聲明了應(yīng)用的名稱,權(quán)限,以及四大組件的聲明等等信息。

  5. classes.dex文件:dex文件是Android平臺上的可執(zhí)行文件,是Android虛擬機(jī)Dalvik支持的字節(jié)碼文件。如果工程分包則會存在多個dex文件。

  6. resources.arsc:編譯后的二進(jìn)制資源文件的索引(apk文件的資源表索引)。

二、打包流程概述

打包流程的經(jīng)典流程圖如下:

Android打包流程.JPG

其中七個橢圓形內(nèi)容對應(yīng)了打包流程中的七個重要步驟,也對應(yīng)著打包中的七個重要工具,具體如下:

工具名稱 功能
aapt 資源打包工具,生成R文件
AIDL Android接口定義語言轉(zhuǎn)變?yōu)?java文件
javaC 轉(zhuǎn)變.java文件為class文件
dex 轉(zhuǎn)變class文件為.dex文件
apkbuilder 生成apk包
JarSigner .jar文件的簽名工具
zipalign 字節(jié)碼對齊工具

三、打包流程詳細(xì)介紹

對上面七個重要的打包流程進(jìn)一步說明。

1. aapt

aapt打包資源文件,生成R.java文件,resources.arsc等文件。

R.java文件和resources.arsc文件都是res資源的清單文件,但是兩者并不完全一樣。

  1. R.java文件中包含的是資源文件的id值,id值并不重復(fù)。主要用于代碼中引用資源ID。
  1. resources.arsc文件則會對res中的資源文件進(jìn)行處理,在apk運(yùn)行時獲取正確分辨率的資源。

aapt在打包資源文件之前會檢測AndroidManifest.xml文件的合法性,對res目錄下的資源目錄進(jìn)行掃描合法性,因此資源命名有問題時會在編譯階段就會直接報(bào)錯。

需要注意的是xml文件會被編譯為二進(jìn)制的,因此我們并不能直接打開apk包中的xml文件。

2.AIDL

AIDL是Android接口定義語言,是Android進(jìn)程間通訊的一種實(shí)現(xiàn)方式。

此步驟中會對aidl文件進(jìn)行處理,生成java文件。

3. javaC生成class文件

通過javaCompiler對java文件進(jìn)行編譯,生成class文件。

如果配置代碼混淆,此步驟中就會進(jìn)行混淆編譯。

4. dex

dx工具將class文件轉(zhuǎn)變?yōu)锳ndroid系統(tǒng)Dalvik虛擬機(jī)可執(zhí)行的Dex文件。

5. apkbuilder

將classes.dex,res文件夾等所有文件打包成apk文件。

6. apk簽名

生成APK包之后還需要進(jìn)行簽名處理,Release簽名需要我們自己去進(jìn)行配置。

常用的簽名方式有兩種:jarsigner和apksigner。

  1. 如果是使用apksigner,則需要在簽名前對apk包進(jìn)行Zipalign整理
  1. 使用jarsigner則需要在簽名后對apk包進(jìn)行Zipalign對齊整理。

7. APK文件對齊處理

Zipalign是Android平臺上APK文件對齊的整理工具,能夠?qū)PK中未壓縮的數(shù)據(jù)進(jìn)行4字節(jié)對齊。

需要注意的是根據(jù)采用簽名方式的不同,對齊處理的先后順序有所區(qū)別。

4字節(jié)對齊之后,就可以使用mmap函數(shù)(內(nèi)存映射)讀取文件,可以向讀取內(nèi)存一樣對文件進(jìn)行操作。

如果沒有4字節(jié)對齊,就必須顯式的讀取,這樣比較緩慢并且會耗費(fèi)額外的內(nèi)存。

總結(jié)

APK打包流程備忘。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容