Android打包的完整流程

概況來看流程如下:

(aapt aidl javaCompiler dex apkBuilder jarSigner zipAligin)

  1. aapt階段 生成R.java、resources.arsc(資源索引表)和res文件
  2. aidl階段 生成Java接口文件
  3. javaCompiler階段 生成.class文件
  4. dex階段 將.class文件和第三方庫(kù)中的.class處理生成classes.dex
  5. apkBuilder階段 將classes.dex、resources.arsc、res文件夾(res/raw資源被原裝不動(dòng)地打包進(jìn)APK之外,其它的資源都會(huì)被編譯或者處理)、Other Resources(assets文件夾)、AndroidManifest.xml打包成apk文件。
  6. jarSigner階段 對(duì)apk進(jìn)行(debug/release)簽名
  7. zipAligin階段 對(duì)簽名后的apk進(jìn)行對(duì)齊處理,使用時(shí)用mmap函數(shù),像讀取內(nèi)存一樣。

流程圖:

打包流程

詳細(xì)介紹

1. aapt階段

  1. 使用aapt來打包res資源文件,生成R.java、resources.arsc和res文件(二進(jìn)制 & 非二進(jìn)制如res/raw和pic保持原樣)
  2. res目錄有9種目錄
    --animator。這類資源以XML文件保存在res/animator目錄下,用來描述屬性動(dòng)畫。
    --anim。這類資源以XML文件保存在res/anim目錄下,用來描述補(bǔ)間動(dòng)畫。
    --color。這類資源以XML文件保存在res/color目錄下,用描述對(duì)象顏色狀態(tài)選擇子。
    --drawable。這類資源以XML或者Bitmap文件保存在res/drawable目錄下,用來描述可繪制對(duì)象。例如,我們可以在里面放置一些圖片(.png, .9.png, .jpg, .gif),來作為程序界面視圖的背景圖。注意,保存在這個(gè)目錄中的Bitmap文件在打包的過程中,可能會(huì)被優(yōu)化的。例如,一個(gè)不需要多于256色的真彩色PNG文件可能會(huì)被轉(zhuǎn)換成一個(gè)只有8位調(diào)色板的PNG面板,這樣就可以無損地壓縮圖片,以減少圖片所占用的內(nèi)存資源。
    --layout。這類資源以XML文件保存在res/layout目錄下,用來描述應(yīng)用程序界面布局。
    --menu。這類資源以XML文件保存在res/menu目錄下,用來描述應(yīng)用程序菜單。
    --raw。這類資源以任意格式的文件保存在res/raw目錄下,它們和assets類資源一樣,都是原裝不動(dòng)地打包在apk文件中的,不過它們會(huì)被賦予資源ID,這樣我們就可以在程序中通過ID來訪問它們。例如,假設(shè)在res/raw目錄下有一個(gè)名稱為filename的文件,并且它在編譯的過程,被賦予的資源ID為R.raw.filename,那么就可以使用以下代碼來訪問它:
Resources res = getResources();  
InputStream is = res .openRawResource(R.raw.filename);  

--values。這類資源以XML文件保存在res/values目錄下,用來描述一些簡(jiǎn)單值,例如,數(shù)組、顏色、尺寸、字符串和樣式值等,一般來說,這六種不同的值分別保存在名稱為arrays.xml、colors.xml、dimens.xml、strings.xml和styles.xml文件中。
--xml。這類資源以XML文件保存在res/xml目錄下,一般就是用來描述應(yīng)用程序的配置信息。

  1. R.java 文件
    自動(dòng)生成類似如下的java文件
public final class R {
    public static final class id {...}
}

R.java文件里面擁有很多個(gè)靜態(tài)內(nèi)部類,比如layout,string等。
每當(dāng)有這種資源添加時(shí),就在R.java文件中添加一條靜態(tài)內(nèi)部類里的靜態(tài)常量類成員,且所有成員都是int類型。

里面的資源可以有兩種方法引用:
1.在java程序中引用資源按照java的語法來引用即:R.resource_type.resource_ name注意:resource_name不需要文件的后綴名 2.在XML文件中引用資源格式:@[package:]type/name

  1. resources.arsc文件
    resources.arsc這個(gè)文件記錄了所有的應(yīng)用程序資源目錄的信息,包括每一個(gè)資源名稱、類型、值、ID以及所配置的維度信息。我們可以將這個(gè)resources.arsc文件想象成是一個(gè)資源索引表,這個(gè)資源索引表在給定資源ID和設(shè)備配置信息的情況下,能夠在應(yīng)用程序的資源目錄中快速地找到最匹配的資源。

2. aidl階段

AIDL (Android Interface Definition Language), Android接口定義語言,Android提供的IPC (Inter Process Communication,進(jìn)程間通信)的一種獨(dú)特實(shí)現(xiàn)。
這個(gè)階段處理.aidl文件,生成對(duì)應(yīng)的Java接口文件。

3. Java Compiler階段

通過Java Compiler編譯R.java、Java接口文件、Java源文件,生成.class文件。

4. dex階段

通過dex命令,將.class文件和第三方庫(kù)中的.class文件處理生成classes.dex。

5. apkBuilder階段

將classes.dex、resources.arsc、res文件夾(res/raw資源被原裝不動(dòng)地打包進(jìn)APK之外,其它的資源都會(huì)被編譯或者處理)、Other Resources(assets文件夾)、AndroidManifest.xml打包成apk文件。
注意:
res/raw和assets的相同點(diǎn):
1.兩者目錄下的文件在打包后會(huì)原封不動(dòng)的保存在apk包中,不會(huì)被編譯成二進(jìn)制。
res/raw和assets的不同點(diǎn):
1.res/raw中的文件會(huì)被映射到R.java文件中,訪問的時(shí)候直接使用資源ID即R.id.filename;assets文件夾下的文件不會(huì)被映射到R.java中,訪問的時(shí)候需要AssetManager類。
2.res/raw不可以有目錄結(jié)構(gòu),而assets則可以有目錄結(jié)構(gòu),也就是assets目錄下可以再建立文件夾

6. JarSigner階段

7. zipAlign階段

release mode 下使用 aipalign進(jìn)行align,即對(duì)簽名后的apk進(jìn)行對(duì)齊處理。
Zipalign是一個(gè)android平臺(tái)上整理APK文件的工具,它對(duì)apk中未壓縮的數(shù)據(jù)進(jìn)行4字節(jié)對(duì)齊,對(duì)齊后就可以使用mmap函數(shù)讀取文件,可以像讀取內(nèi)存一樣對(duì)普通文件進(jìn)行操作。如果沒有4字節(jié)對(duì)齊,就必須顯式的讀取,這樣比較緩慢并且會(huì)耗費(fèi)額外的內(nèi)存。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,565評(píng)論 6 539
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,115評(píng)論 3 423
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,577評(píng)論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,514評(píng)論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,234評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,621評(píng)論 1 326
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,641評(píng)論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,822評(píng)論 0 289
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,380評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,128評(píng)論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,319評(píng)論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,879評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,548評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,970評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,229評(píng)論 1 291
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,048評(píng)論 3 397
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,285評(píng)論 2 376

推薦閱讀更多精彩內(nèi)容