apk即Android安裝包,通過(guò)將APK文件直接傳到Android模擬器或Android手機(jī)中執(zhí)行即可安裝。安卓Android的軟件安裝包以.apk為文件擴(kuò)展名,其文件格式是標(biāo)準(zhǔn)的.zip文件,可以通過(guò)WinZIP、winrar等壓縮文件工具直接打開(kāi),或是在.apk文件名上添加.zip后綴,即可查看封裝在其中的具體文件內(nèi)容,包括程序、圖片、配置文件等。apk文件和sis一樣,把a(bǔ)ndroid sdk編譯的工程打包成一個(gè)安裝程序文件,格式為apk。 APK文件其實(shí)是zip格式,但后綴名被修改為apk,通過(guò)UnZip解壓后,可以看到Dex文件,Dex是Dalvik VM executes的全稱,即Android Dalvik執(zhí)行程序,并非Java ME的字節(jié)碼而是Dalvik字節(jié)碼。Android在運(yùn)行一個(gè)程序時(shí)首先需要UnZip,然后類似Symbian那樣直接,和Windows Mobile中的PE文件有區(qū)別。
創(chuàng)新互聯(lián)建站溝通電話:028-86922220,為您提供成都網(wǎng)站建設(shè)網(wǎng)頁(yè)設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù),創(chuàng)新互聯(lián)建站網(wǎng)頁(yè)制作領(lǐng)域10多年,包括人造霧等多個(gè)領(lǐng)域擁有多年設(shè)計(jì)經(jīng)驗(yàn),選擇創(chuàng)新互聯(lián)建站,為企業(yè)錦上添花。
上面 主要分析到APK的copy過(guò)程,這里我們開(kāi)始分析APK的加載過(guò)程。直接看之前流程進(jìn)行到下一步的 processPendingInstall() 方法:
installPackagesLI() 可以支持單包和多包加載,加載主要分為4個(gè)階段:
執(zhí)行完2-2的 scanPackageTrackLI() 之后Pms的兩大核心數(shù)據(jù)結(jié)構(gòu)都已經(jīng)準(zhǔn)備好了,一個(gè)是代表掃描結(jié)果的final ArrayMapString, PackageParser.Package mPackages = new ArrayMap();中的PackageParser.Package,另外一個(gè)是mSettings.mPackages的PackageSetting 數(shù)據(jù)結(jié)構(gòu),這兩個(gè)結(jié)構(gòu)PackageParser.Package代表掃描結(jié)果,為靜態(tài)數(shù)據(jù),掃描完成后就不會(huì)發(fā)生變化。PackageSetting用于存儲(chǔ)安裝應(yīng)用的動(dòng)態(tài)數(shù)據(jù),如權(quán)限授予情況等。PackageParser.Package由于是靜態(tài)數(shù)據(jù),掃描apk就可以獲取。PackageSetting生成之后會(huì)被記錄到文件中,以后每次系統(tǒng)啟動(dòng)都會(huì)重新加載。
apk 是Android Package的簡(jiǎn)寫, 在平時(shí)的開(kāi)發(fā)過(guò)程中,通過(guò)點(diǎn)擊 Run app 按鈕 或者 在命令行中輸入
這樣Android Studio就會(huì)啟動(dòng)構(gòu)建流程,最終輸出一個(gè)我們想要的APK。
直達(dá)官網(wǎng)介紹
對(duì)于小白來(lái)說(shuō),上面一張圖已經(jīng)可以解釋apk的構(gòu)建過(guò)程了,不過(guò)對(duì)于Andoid開(kāi)發(fā)者而言還需要了解一些更詳細(xì)的構(gòu)建過(guò)程。
詳細(xì)的對(duì)應(yīng)步驟 和 使用工具如下:
資源文件(res文件夾下的文件)通過(guò) AAPT(Android Asset Packaging Tool)打包生成R.java類(資源索引表)、.arsc資源文件 和res文件。
resources.arsc 是一個(gè)App的資源索引表,通過(guò)R.java 文件 和 resources.arsc 可以定位到資源的內(nèi)存地址,resources.arsc文件的作用是通過(guò)一樣的ID,根據(jù)不同的配置索引到最佳的資源顯示在UI中。
AIDL (Android Interface Definition Language), 是Android接口定義語(yǔ)言,是Android提供的IPC (Inter Process Communication,進(jìn)程間通信)的一種獨(dú)特實(shí)現(xiàn)。
如果有aidl文件,這個(gè)階段會(huì)生成對(duì)應(yīng)的Java接口文件。
R.java文件、工程源碼文件、aidl.java文件, 在這一步通過(guò)javac生成.class文件。
源碼.class文件和第三方j(luò)ar或者library通過(guò)dx工具打包成dex文件
Android系統(tǒng)的Dalvik虛擬機(jī)的可執(zhí)行文件為DEX格式,所以這里會(huì)將上一步中生成的.class文件 和 引用的第三方j(luò)ar等過(guò)程中的.class 一起通過(guò)dx工具打包成dex文件
apkbuilder工具會(huì)將所有沒(méi)有編譯的資源、.arsc資源、.dex文件打包到一個(gè)完成apk文件中
tips:
apksigner工具會(huì)對(duì)未簽名的apk驗(yàn)證簽名。得到一個(gè)簽名后的apk(signed.apk)
apksigner 是google 退出的V2簽名方式
Jarsigner 是之前一直使用的V1簽名方式
可以通過(guò)在命令行中輸入apksigner --help來(lái)獲取詳情信息,如果沒(méi)有特殊需求,使用下面命令即可完成簽名
release mode 下使用 aipalign進(jìn)行align,即對(duì)簽名后的apk進(jìn)行對(duì)齊處理
所謂對(duì)齊,主要過(guò)程是將APK包中所有的資源文件距離文件起始偏移為4字節(jié)整數(shù)倍,這樣通過(guò)內(nèi)存映射訪問(wèn)apk文件時(shí)的速度會(huì)更快。對(duì)齊的作用主要是為了減少運(yùn)行時(shí)內(nèi)存的使用。
zipalign是一個(gè)android平臺(tái)上整理APK文件的工具,它對(duì)apk中未壓縮的數(shù)據(jù)進(jìn)行4字節(jié)對(duì)齊,對(duì)齊后就可以使用mmap函數(shù)讀取文件,可以像讀取內(nèi)存一樣對(duì)普通文件進(jìn)行操作。如果沒(méi)有4字節(jié)對(duì)齊,就必須顯式的讀取,這樣比較緩慢并且會(huì)耗費(fèi)額外的內(nèi)存。
參考文章:
Android-Studio配置構(gòu)建
淺談Android打包流程
apk打包流程
END!
APK文件的組成部分及apk打包流程是Android開(kāi)發(fā)中的基礎(chǔ)知識(shí)點(diǎn),做一個(gè)簡(jiǎn)單的記錄。
apk文件是Android應(yīng)用包文件格式,其本質(zhì)是一個(gè)壓縮文件。將apk文件拖動(dòng)到Android Studio中即可查看里面的內(nèi)容,如下圖:
從上圖中可以看到apk包里的幾個(gè)重要組成部分:
打包流程的經(jīng)典流程圖如下:
其中七個(gè)橢圓形內(nèi)容對(duì)應(yīng)了打包流程中的七個(gè)重要步驟,也對(duì)應(yīng)著打包中的七個(gè)重要工具,具體如下:
對(duì)上面七個(gè)重要的打包流程進(jìn)一步說(shuō)明。
aapt打包資源文件,生成R.java文件,resources.arsc等文件。
aapt在打包資源文件之前會(huì)檢測(cè) AndroidManifest.xml 文件的合法性,對(duì)res目錄下的資源目錄進(jìn)行掃描合法性,因此資源命名有問(wèn)題時(shí)會(huì)在編譯階段就會(huì)直接報(bào)錯(cuò)。
需要注意的是xml文件會(huì)被編譯為二進(jìn)制的,因此我們并不能直接打開(kāi)apk包中的xml文件。
AIDL是Android接口定義語(yǔ)言,是Android進(jìn)程間通訊的一種實(shí)現(xiàn)方式。
此步驟中會(huì)對(duì)aidl文件進(jìn)行處理,生成java文件。
通過(guò)javaCompiler對(duì)java文件進(jìn)行編譯,生成class文件。
dx工具將class文件轉(zhuǎn)變?yōu)锳ndroid系統(tǒng)Dalvik虛擬機(jī)可執(zhí)行的Dex文件。
將classes.dex,res文件夾等所有文件打包成apk文件。
生成APK包之后還需要進(jìn)行簽名處理,Release簽名需要我們自己去進(jìn)行配置。
常用的簽名方式有兩種:jarsigner和apksigner。
Zipalign是Android平臺(tái)上APK文件對(duì)齊的整理工具,能夠?qū)PK中未壓縮的數(shù)據(jù)進(jìn)行4字節(jié)對(duì)齊。
需要注意的是根據(jù)采用簽名方式的不同,對(duì)齊處理的先后順序有所區(qū)別。
APK打包流程備忘。