資源合并
如果項目引入了android support包,又或許依賴于其它第三方aar庫,那構建前會將aar解壓并與本地資源合并,這里的資源主要包括assets目錄,res目錄及Androidmanifest.xml。
當第三方依賴中的assets或res文件與本地文件有沖突時,會優先選用本地文件。但res/values略有不同,此目錄下的strings.xml、color.xml、styles.xml等文件會被整合到一個叫values.xml的文件中去,后與各第三方依賴中的values.xml進行內容上的合并,不會像res其它子目錄文件一樣直接舍棄第三方沖突文件。
Androidmanifest.xml的合并相比來說則要復雜一些,除了第三方依賴中的manifest,項目還可以在不同目錄下分別擁有manifest文件。構建過程中,會根據manifest中元素、屬性及賦值來生成一個manifest文件,并應用于后續的打包過程。gradle為不同的manifest賦予了不同的優先級,其順序如下:
buildType 設置 > productFlavor 設置 > src/main > dependency&library
XML元素及屬性的沖突會根據以下規則進行解決:

當然也會有一些例外的:
uses-feature android:required與uses-library android:required默認為true,根據or規則合并;
如未指定uses-sdk,minSdkVersion跟targetSdkVersion將被設置為1。而沖突時會使用高優化級的設置;
若library的minSdkVersion高于src/main的設置,則會引發error,但可通過overrideLibrary解決。若未指定targetSdkVersion,則其值與minSdkVersion一致;
若library的targetSdkVersion低于src/main的設置,需要添加一些額外的權限保證library能正常運行;
manifest元素只與子manifest元素合并;
intent-filter元素在合并中不會被改變,只會被添加到其父節點中去;
沖突發生時,可通過合并沖突標記進行解決,需要引入android tools命名空間,詳情請參閱官方文檔。另外,manifest在對文件進行合并后,還會根據build.gradle的設置覆蓋相關屬性。
AAPT打包
資源合并后,即進入到編譯階段,先會把項目資源中的xml編譯成二進制并生成R.java及資源索引表resources.arsc,其流程如下:

由圖可見,assets是不需要做任何處理的,res/raw只需分配id后與assets一起直接打包到應用程序中;基于下述原因,其它xml文件則會被編譯成二進制。
編譯過程中,會把xml中的字符串進行收集去重,形成字符串資源池,元素中用到字符串的地方將被替換成相應的索引。另外,標簽屬性/ 主站蜘蛛池模板: 巨野县| 察隅县| 汉寿县| 乌拉特中旗| 吐鲁番市| 青川县| 舒城县| 阳东县| 临潭县| 临沧市| 揭西县| 奉化市| 太仓市| 呼伦贝尔市| 元氏县| 凤翔县| 阳春市| 青铜峡市| 九寨沟县| 恩平市| 邮箱| 沅江市| 德昌县| 景泰县| 嘉祥县| 高唐县| 巫山县| 泾阳县| 安岳县| 馆陶县| 平陆县| 尤溪县| 夏津县| 常州市| 合水县| 叙永县| 贺兰县| 兰坪| 来安县| 永宁县| 阿合奇县|