【朝花夕拾】Android性能篇之(四)Apk打包

前言

? ? ? ?原文:【朝花夕拾】Android性能篇之(四)Apk打包

? ? ? ? APK枯饿,即Android Package择卦,是將android程序和資源整合在一起捐名,形成的一個.apk文件纽甘。相信所有的Android程序員是在IDE的幫助下勉躺,完成打包輕而易舉疹味,但對打包流程真正清楚的可能并不多谎柄。本章的內(nèi)容比較簡單觉鼻,也是非晨剐ǎ基礎(chǔ)的內(nèi)容棋凳,但是對理解android應(yīng)用的結(jié)構(gòu)卻有很大的幫助。筆者寫這篇文章的目的连躏,一方面是為了彌補這方面的盲點剩岳,回顧和梳理apk打包方面的理論知識點;第二方面入热,是為了給后續(xù)寫Android虛擬機知識做鋪墊拍棕,進而去研究android的性能優(yōu)化,這也是把這篇文章放到Android性能優(yōu)化系列文章當(dāng)中的原因勺良;第三方面绰播,也是為了方便讀者理解Android虛擬機的相關(guān)內(nèi)容。

? ? ? ?對于在IDE尚困,如Android Studio上操作打包的過程蠢箩,本文不做演示事甜,對于更深入的源碼分析谬泌,也不在本文討論之列,出于前面說到的原因逻谦,本文只簡單闡述其打包流程呵萨,本文主要內(nèi)容如下:


一、apk構(gòu)建流程圖

? ? ? ?以下截圖為Google官方提供的詳細(xì)的apk構(gòu)建過程圖跨跨,其中包含了各個環(huán)節(jié)所用到的工具和中間相關(guān)的文件潮峦。

? ? ? ? ? ? ? ? ? ? ? ? ?apk構(gòu)建過程(綠色部分為對應(yīng)環(huán)節(jié)工具,藍色部分為相關(guān)文件)


二勇婴、構(gòu)建過程中所用工具

? ? ? ? 如下截圖展示了apk構(gòu)建過程中所使用的部分工具忱嘹,這些工具大部分都在sdk/build-tools/文件夾下:

? ? ? ? ? ? ? ? ? ? 代碼混淆所用工具

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?打包所用工具所在的jar包

三、apk打包流程詳解

? ? ? ?依據(jù)如上的流程圖和工具圖耕渴,下面咱們按照流程順序?qū)ζ溥M行講解拘悦。

1、aapt打包資源

? ? ? 工具:aapt(Android Asset Package Tool Android資源打包工具)

? ? ? 工具路徑:sdkpath/build-tools/版本號/aapt.exe和aapt2.exe

? ? ? 輸入:Android資源文件橱脸、AndroidManifest.xml

? ? ? 輸出: R.java類础米、二進制的resource.arsc分苇,res文件夾(包括二進制的xml、沒被改變的圖片和res/raw文件)屁桑、二進制的AndroidManifest.xml文件医寿、沒有改變的assets文件夾。

? ? ? ? Android的資源文件包含了兩類:1)assets類資源蘑斧。該類資源放在工程目錄的assets根目錄下靖秩,存放一些原始文件,這些文件不會被編譯為二進制文件竖瘾,而是被原封不動地打包在apk文件中沟突,同樣也不能通過資源ID來查找,不保存在R文件中捕传。2)res類資源惠拭,10種目錄。這類資源保存在工程目錄中的res目錄下庸论,包含了animator(屬性動畫資源)职辅、anim(補間動畫資源)、color(對象顏色狀態(tài)選擇資源)葡公、drawable(xml或Bitmap文件的圖像資源)罐农、layout(布局文件資源)条霜、menu(程序菜單資源)催什、mipmap(圖標(biāo)資源,推薦閱讀:drawable與mipmap的區(qū)別)宰睡、raw(不被編譯成二進制文件的資源蒲凶,注意和assets資源的區(qū)別,推薦閱讀:assets和raw的區(qū)別)拆内、values(6種不同的值:數(shù)組arrays.xml旋圆、顏色值colors.xml、尺寸dimens.xml麸恍、字符串strings.xml和樣式值styles.xml)灵巧、xml(描述應(yīng)用程序配置信息的資源)。

? ? ? ?如下截圖展示了R.java的內(nèi)容抹沪,其中包含了各種靜態(tài)內(nèi)部類刻肄,分別對應(yīng)了某種資源的類型。

? ? ? ? ? ? ? ? ? ? ? ? ? ? R.java結(jié)構(gòu)圖

? ? ? ?以R.string類為例融欧,其中展示了字符串名稱對應(yīng)的id值敏弃,就是對應(yīng)在res/values文件夾下,string字符串資源噪馏。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? R.string結(jié)構(gòu)圖

? ? ? 推薦閱讀:apk打包安裝過程

2麦到、aidl生成跨進程通信的java文件

? ? ? 工具:aidl(Android Interface Definition Language安卓接口定義語言)

? ? ? 工具路徑:sdkpath/build-tools/版本號/aidl.exe

? ? ? 輸入:aidl后綴的文件绿饵,位于工程項目src/main/aidl目錄下

? ? ? 輸出:可用于進程間通信的C/S端java代碼,位于build/generated/source/aidl

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?工程項目中的aidl原始文件

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?aidl工具處理后生成的java文件

3瓶颠、Java編譯源碼

? ? ? 工具:javac.exe

? ? ? 工具路徑:jdk/bin/javac.exe

? ? ? 輸入:java source文件夾拟赊、aapt中生成的R.java文件、aidl生成的java文件步清、BuildConfig.java文件

? ? ? 輸出:對于gradle編譯要门,生成的class文件保存在build/intermediates/classes里

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?BuildConfig.java和R.java文件

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 輸出的class文件

4、proguard代碼混淆

? ? ? ?完成javac編譯之后廓啊,一般還會對其進行代碼的混淆欢搜,其實就是類似于加密的功能,作用就是增加反編譯的難度谴轮,同時也將一些代碼的命名進行了縮短炒瘟,減少代碼占用的空間。推薦閱讀:Android代碼混淆零基礎(chǔ)入門第步。

? ? ? 工具:ProGuard

? ? ? 工具路徑:sdk/tools/proguard/bin/proguard.bat

? ? ? 輸入:被編譯過的class文件疮装、混淆配置文件proguard-rules.pro

? ? ? 輸出:被混淆過的.class文件、混淆前后映射文件

5粘都、將所有.class文件轉(zhuǎn)化為classes.dex文件

? ? ? 工具:dx.bat

? ? ? 工具路徑:sdkpath/build-tools/版本號/dx.bat

? ? ? 輸入:編譯后生成的所有.class文件廓推、第三方庫和.class文件

? ? ? 輸出:可以在Android虛擬機上使用的.dex文件

? ? ? ? 調(diào)用dx.bat將所有的class文件轉(zhuǎn)化為classes.dex文件,將二進制碼轉(zhuǎn)化為Android虛擬機(Android4.4以前虛擬機是Dalvik翩隧,4.4上是Dalvik和ART可以切換樊展、Android5.0及以后是ART)上的字節(jié)碼、生成常量池堆生、消除冗余數(shù)據(jù)等专缠。由于Android虛擬機是一種針對嵌入式設(shè)備而特殊設(shè)計的java虛擬機,所有dex文件與標(biāo)準(zhǔn)的class文件在結(jié)構(gòu)設(shè)計上有著很大的區(qū)別淑仆,當(dāng)javac將java程序編譯成class后涝婉,dx工具將所有的class文件整合到一個dex文件中,這樣做使得各個類能夠共享數(shù)據(jù)蔗怠,在一定程度上降低了容易墩弯,同時也使文結(jié)構(gòu)更加緊湊,實驗表明寞射,dex文件時傳統(tǒng)jar文件的50%左右渔工。class文件結(jié)構(gòu)和dex文件結(jié)構(gòu)比對如下(該部分還會在后文講Android虛擬機時提到):

? ? ? ? ? ? ? ? ? ? ?.class文件和.dex文件結(jié)構(gòu)對比圖

6、apkbuilder打包生成apk

? ? ? 工具:ApkBuilder類

? ? ? 工具路徑:sdkpath/tools/lib/sdklib_xxx.jar

? ? ? 輸入:上一步生成的classes.dex文件怠惶,aapt時生成的resources.arsc涨缚、被編譯后的res文件夾、AndroidManifest.xml,Other Resouces(assets文件夾)

輸出:.apk文件(Android Package)

7脓魏、對apk進行簽名

? ? ? 工具:apksigner.bat

? ? ? 工具路徑:sdkpath/build-tools/版本號/apksigner.bat

? ? ? 輸入:上一步中生成的.apk文件兰吟、簽名文件(Debug or Release Keystore)

? ? ? 輸出:簽名后的.apk文件

? ? ? ?簽名是一個apk身份的證明,Android系統(tǒng)在安裝apk的時候茂翔,首先會檢驗apk的簽名混蔼,如果發(fā)現(xiàn)簽名文件不存在或者校驗簽名失敗,就會拒絕安裝珊燎。對一個apk文件簽名后惭嚣,apk文件根目錄下回增加META-INF目錄,該目錄下有三個文件:

? ? ? ? ? ? ? ?META-IINF文件夾結(jié)構(gòu)

? ? ? Android系統(tǒng)就是根據(jù)這三個文件的內(nèi)容對apk文件進行簽名驗證的:

? ? ? MANIFEST.MF中包含對apk中除了/META-INF文件夾外所有文件的簽名值悔政。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?MANIFEST.MF內(nèi)容截圖

? ? ? CERT.SF是對MANIFEST.MF文件整體簽名以及其中各個條目的簽名晚吞。一般地,如果是使用工具簽名谋国,還多包括一項槽地,就是對MANIFEST.MF頭部信息簽名。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?CERT.SF內(nèi)容截圖

? ? ? CERT.RSA包含用私鑰對CERT.SF的簽名以及包含公鑰信息的數(shù)字證書芦瘾。用一般的文本打開后捌蚊,會顯示亂碼。

          ? ? ? ? ? ? ? ? CETR.RSA內(nèi)容截圖

? ? ? 推薦閱讀:

? ? ? ?【Android簽名有什么用近弟?

? ? ? ?【Android簽名過程詳解

8缅糟、zipalign優(yōu)化

? ? ? 如果是在release mode下,還會對apk進行align祷愉,即對簽名后的apk進行對齊處理窗宦,這種方式是對apk進行整理和優(yōu)化。

? ? ? 工具:zipalign

? ? ? 工具路徑:sdkpath/build-tools/版本號/zipalign.exe

? ? ? 輸入:上一步中簽名后的apk文件

? ? ? 輸出:優(yōu)化后的apk文件


四谣辞、APK文件結(jié)構(gòu)

? ? ? ?一個apk解壓后迫摔,其典型的結(jié)構(gòu)如下所示沐扳,分別在apk打包流程中appt資源打包泥从、javac編譯、簽名階段所產(chǎn)生:

當(dāng)前系列內(nèi)容已完成如下篇章:

【朝花夕拾】Android性能篇之(一)序言及JVM篇

【朝花夕拾】Android性能篇之(二)Java內(nèi)存分配

【朝花夕拾】Android性能篇之(三)Java內(nèi)存回收

【朝花夕拾】Android性能篇之(四)Apk打包

【朝花夕拾】Android性能篇之(五)Android虛擬機

【朝花夕拾】Android性能篇之(六)Android進程管理機制

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末沪摄,一起剝皮案震驚了整個濱河市躯嫉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌杨拐,老刑警劉巖祈餐,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異哄陶,居然都是意外死亡帆阳,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門屋吨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜒谤,“玉大人山宾,你說我怎么就攤上這事△⒒眨” “怎么了资锰?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長阶祭。 經(jīng)常有香客問我绷杜,道長,這世上最難降的妖魔是什么濒募? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任鞭盟,我火速辦了婚禮,結(jié)果婚禮上瑰剃,老公的妹妹穿的比我還像新娘懊缺。我一直安慰自己,他們只是感情好培他,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布鹃两。 她就那樣靜靜地躺著,像睡著了一般舀凛。 火紅的嫁衣襯著肌膚如雪俊扳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天猛遍,我揣著相機與錄音馋记,去河邊找鬼。 笑死懊烤,一個胖子當(dāng)著我的面吹牛梯醒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播腌紧,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼茸习,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了壁肋?” 一聲冷哼從身側(cè)響起号胚,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎浸遗,沒想到半個月后猫胁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡跛锌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年弃秆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡菠赚,死狀恐怖盼樟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情锈至,我是刑警寧澤晨缴,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站峡捡,受9級特大地震影響击碗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜们拙,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一稍途、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧砚婆,春花似錦械拍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至埂奈,卻和暖如春迄损,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背账磺。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工芹敌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人垮抗。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓氏捞,卻偏偏與公主長得像,于是被迫代替她去往敵國和親冒版。 傳聞我的和親對象是個殘疾皇子液茎,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345