Android收藏集Android知识Android开发

Android构建过程——资源合并打包

2017-03-30  本文已影响1842人  SamanLan

Android构建会经历资源合并打包、源码编译、dex生成及打包签名等步骤。
本文对资源合并打包进行一下小的总结

资源合并

资源合并.png

上面一图总结了在构建过程中的资源合并情况。

  1. 资源合并包括本地与第三方库的assets目录res目录Androidmanifest.xml
  2. 对于assets目录res目录res/values文件夹除外)的资源合并一旦发生冲突,会优先使用本地资源。
  3. 对于res/values文件夹,会进行内容上的合并,后合并的会覆盖有冲突的前面资源,而且合并先后顺序无法确定。
  4. 对于Androidmanifest.xml,我们的apk最终只会包含一个AndroidManifest.xml,但是因为我们的main source setbuild variants和引入的第三方依赖都可能存在Manifest文件,这时候就需要做合并。如果一个低优先级的xml结点不能匹配任何高优先级的结点就会被加入到高优先级的Manifest文件里,如果匹配上了则会进行合并,如果该结点下的存在相同属性在不同文件里具有不同的值时则会报错需要在较高优先级的manifest文件里添加合并规则标识。(Androidmanifest.xml的优先级:buildType 设置 > productFlavor 设置 > src/main > dependency&library
  5. 合并规则标识
  1. 另外,manifest在对文件进行合并后,还会根据build.gradle的设置覆盖相关属性。

举个例子,下面代码进行合并,最后的 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"
        <!-- 合并规则标识 -->
        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 相当于占位符的意思,会替换覆盖Manifest文件对应的属性-->
            manifestPlaceholders = [ activityLabel:"freeName"]
        }
        pro {
            manifestPlaceholders = [ activityLabel:"proName" ]
        }
   }
}

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

AAPT打包

通过AAPTAndroid Asset Packaging Tool)处理后,会输出2个文件:

assets是不需要做任何处理的,res/raw只需分配id后与assets一起直接打包到应用程序中;基于下述原因,其它xml文件则会被编译成二进制。

字符串被替换成相应的索引

资源索引表resources.arsc记录了从资源id到文件路径的转换关系,当应用通过Resources类获取res文件资源时,会先从resources.arsc中拿到文件路径,然后通过AssetManager进行访问。

资源寻找过程 resources.arsc

再补上一张官方图总结总结应用程序资源的编译、打包以及查找过程

Paste_Image.png

参考文章:

  1. Android构建过程分析
  2. Android应用程序资源的查找过程分析
  3. Android应用程序资源的编译和打包过程分析
上一篇 下一篇

猜你喜欢

热点阅读