Android構(gòu)建過程——資源合并打包

Android構(gòu)建會經(jīng)歷資源合并打包少漆、源碼編譯僧诚、dex生成及打包簽名等步驟扯俱。
本文對資源合并打包進(jìn)行一下小的總結(jié)

資源合并

資源合并.png

上面一圖總結(jié)了在構(gòu)建過程中的資源合并情況脖律。

  1. 資源合并包括本地與第三方庫的assets目錄些膨、res目錄蟀俊、Androidmanifest.xml
  2. 對于assets目錄res目錄res/values文件夾除外)的資源合并一旦發(fā)生沖突订雾,會優(yōu)先使用本地資源肢预。
  3. 對于res/values文件夾,會進(jìn)行內(nèi)容上的合并洼哎,后合并的會覆蓋有沖突的前面資源烫映,而且合并先后順序無法確定。
  4. 對于Androidmanifest.xml噩峦,我們的apk最終只會包含一個AndroidManifest.xml锭沟,但是因為我們的main source setbuild variants和引入的第三方依賴都可能存在Manifest文件识补,這時候就需要做合并族淮。如果一個低優(yōu)先級的xml結(jié)點(diǎn)不能匹配任何高優(yōu)先級的結(jié)點(diǎn)就會被加入到高優(yōu)先級的Manifest文件里,如果匹配上了則會進(jìn)行合并,如果該結(jié)點(diǎn)下的存在相同屬性在不同文件里具有不同的值時則會報錯需要在較高優(yōu)先級的manifest文件里添加合并規(guī)則標(biāo)識瞧筛。(Androidmanifest.xml的優(yōu)先級:buildType 設(shè)置 > productFlavor 設(shè)置 > src/main > dependency&library
  5. 合并規(guī)則標(biāo)識
  • merge:默認(rèn)合并操作厉熟。
  • remove:移除指定的低優(yōu)先級的屬性
  • remove-All:移除相同節(jié)點(diǎn)類型下所有低優(yōu)先級的屬性
  • replace:高優(yōu)先級替換低優(yōu)先級Manifest文件中的屬性
  1. 另外,manifest在對文件進(jìn)行合并后较幌,還會根據(jù)build.gradle的設(shè)置覆蓋相關(guān)屬性揍瑟。

舉個例子,下面代碼進(jìn)行合并乍炉,最后的 label 是 app_name绢片;allowBackup 是 true。

<!--src/main的Androidmanifest.xml-->
<application
        android:name="MyApplication"
        android:icon="@drawable/ic_launcher"
        android:allowBackup="true"
        android:label="@string/app_name"
        <!-- 合并規(guī)則標(biāo)識 -->
        tools:replace="android:allowBackup,android:label">
</application>
<!--dependency&library的Androidmanifest.xml-->
<application
        android:name="MyApplication"
        android:icon="@drawable/ic_launcher"
        android:allowBackup="false"
        android:label="@string/app_name222">
</application>

下面代碼向Manifest文件注入build變量值

<!--Gradle文件-->
android {
    productFlavors {
        free {
            <!--manifestPlaceholders 相當(dāng)于占位符的意思岛琼,會替換覆蓋Manifest文件對應(yīng)的屬性-->
            manifestPlaceholders = [ activityLabel:"freeName"]
        }
        pro {
            manifestPlaceholders = [ activityLabel:"proName" ]
        }
   }
}

<!--Manifest文件-->
<activity android:name=".MainActivity" android:label="${activityLabel}" >

AAPT打包

通過AAPTAndroid Asset Packaging Tool)處理后底循,會輸出2個文件:

  • 一個為為app.ap,實(shí)際上為一個壓縮包槐瑞,包含了assets熙涤、resAndroidmanifest.xmlresources.arsc困檩。
  • 一個R.java祠挫,為項目各資源分配了不同的id,id為4字節(jié)無符號(8位)整數(shù)悼沿,最高字節(jié)表示package id等舔,次高字節(jié)表示type id,后2字節(jié)表示資源在當(dāng)前類型中出現(xiàn)的序號糟趾,如R.string.appname=0x7f07006b中的0x7f代表當(dāng)前正在編譯的資源包慌植,0x07代表string類型,0x006b代表app_name在string類型中出現(xiàn)的序號义郑。(這里package id為插件化的資源合并提供了可操作的地方)

assets是不需要做任何處理的蝶柿,res/raw只需分配id后與assets一起直接打包到應(yīng)用程序中;基于下述原因魔慷,其它xml文件則會被編譯成二進(jìn)制只锭。

  • 編譯過程中,會把xml中的所有的字符串進(jìn)行收集去重院尔,形成字符串資源池,元素中用到字符串的地方將被替換成相應(yīng)的索引喉誊,進(jìn)一步減少文件大小邀摆。(字符串變成了整數(shù)值的索引,相同字符串引用同一個索引)
  • 二進(jìn)制格式的xml把標(biāo)簽屬性/値轉(zhuǎn)換為相應(yīng)的索引后伍茄,避免了字符串解析栋盹,從而提高了解析速度。
字符串被替換成相應(yīng)的索引

資源索引表resources.arsc記錄了從資源id到文件路徑的轉(zhuǎn)換關(guān)系敷矫,當(dāng)應(yīng)用通過Resources類獲取res文件資源時例获,會先從resources.arsc中拿到文件路徑汉额,然后通過AssetManager進(jìn)行訪問。

  • Android資源管理框架實(shí)際就是由AssetManager和Resources兩個類來實(shí)現(xiàn)的榨汤。
  • Resources類可以根據(jù)ID來查找資源蠕搜。
  • AssetManager類根據(jù)文件名來查找資源。
資源尋找過程
resources.arsc

再補(bǔ)上一張官方圖總結(jié)總結(jié)應(yīng)用程序資源的編譯收壕、打包以及查找過程

Paste_Image.png

參考文章:

  1. Android構(gòu)建過程分析
  2. Android應(yīng)用程序資源的查找過程分析
  3. Android應(yīng)用程序資源的編譯和打包過程分析
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末妓灌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蜜宪,更是在濱河造成了極大的恐慌虫埂,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件圃验,死亡現(xiàn)場離奇詭異掉伏,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)澳窑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進(jìn)店門岖免,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人照捡,你說我怎么就攤上這事颅湘。” “怎么了栗精?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵闯参,是天一觀的道長。 經(jīng)常有香客問我悲立,道長鹿寨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任薪夕,我火速辦了婚禮脚草,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘原献。我一直安慰自己馏慨,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布姑隅。 她就那樣靜靜地躺著写隶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪讲仰。 梳的紋絲不亂的頭發(fā)上慕趴,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼冕房。 笑死躏啰,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的耙册。 我是一名探鬼主播给僵,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼觅玻!你這毒婦竟也來了想际?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤溪厘,失蹤者是張志新(化名)和其女友劉穎胡本,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體畸悬,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡侧甫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蹋宦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片披粟。...
    茶點(diǎn)故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖冷冗,靈堂內(nèi)的尸體忽然破棺而出守屉,到底是詐尸還是另有隱情,我是刑警寧澤蒿辙,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布拇泛,位于F島的核電站,受9級特大地震影響思灌,放射性物質(zhì)發(fā)生泄漏俺叭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一泰偿、第九天 我趴在偏房一處隱蔽的房頂上張望熄守。 院中可真熱鬧,春花似錦耗跛、人聲如沸裕照。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽牍氛。三九已至,卻和暖如春烟阐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工蜒茄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留唉擂,地道東北人。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓檀葛,卻偏偏與公主長得像玩祟,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子屿聋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評論 2 355

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