Android资源的合并小结

一、资源存放位置

在Android Studio项目中,源码和资源都是放在各个module中对应的src目录下。比如一个叫app的module,默认情况下我们看到的是在app/src/main下。但实际上module中源码和资源目录不止一个。如果app有两个buildType叫debug和release,那么每个同样你也可以在app/src/debugapp/src/release下放置你的源码和资源。如果你有两个productFlavors分别叫flavor1和flavor2,同样的你也可以在app/src/flavor1app/src/flavor2下放置你的源码和资源。在打包的时候,这些代码和资源会进行合并。当然你也可以通过gradle配置修改上面几个目录的位置,具体如何配置本篇不做讨论。
ps:上面标红的几个目录,默认不存在,需要自己手动创建。

二、Build Variants

从Build Variants的名称上看,能知道我们打的包是由哪几个目录下的源码组成。比如我们的工程中有一个叫app的module,app的配置如下:

 //优先级高于productFlavors
 buildTypes {
        release {
            minifyEnabled false
        }
        debug{
            resValue "string","name","buildType xml"
        }
 }
    
 //从左到右优先级依次降低,冲突时,使用优先级高的资源
 flavorDimensions "dimen1","dimen2"
 productFlavors{
        flavor1{
            dimension "dimen1"
            resValue "string","name","flavor1 xml"
        }

        flavor2{
            dimension "dimen2"
            resValue "string","name","flavor2 xml"
        }

        flavor3{
            dimension "dimen2"
            buildConfigField "String","name","\"buildConfig dimen2\""
            resValue "string","name","string from flavor3 xml"
        }
}

脚本执行后,那么app会生成以下四种Build Variants:
flavor1Flavor2Debug
flavor1Flavor2Release
flavor1Flavor3Debug
flavor1Flavor3Release

比如flavor1Flavor2Debug,我们就知道它是由flavor1、flavor2和debug三个目录下的代码组成,当然还有marin目录。Build Variants的可以在这里切换:

《Android资源的合并小结》 image.png

build variants的组合方式是[dimen1][dimen2][buildType],dimen1有1个(flavor1),dimen2有2个(flavor2、flavor3),buildType有2个(debug、release ),因此一共有1《Android资源的合并小结》2《Android资源的合并小结》2=4种组合。依此类推,如果你声明了三个flavorDimensions ,最终就是[dimen1][dimen2][dimen3][buildType]

合并优先级

最终打包的时候,遇到相同的资源,使用优先级最高的那个。顺序如下:
buildType > productFlavor > main > library
对于多维度productFlavor,每个flavor的优先级按flavorDimensions的声明顺序从左往右依次降低。如:

flavorDimensions "dimen1","dimen2","dimen3",...

则优先级顺序为:
buildType > dimen1 > dimen2 > dimen3 > ...> main >library

合并方式

1.文件覆盖

单个文件就是一个资源的(drawable,layout,xml等),遇到相同资源,按照上面的优先级覆盖,高优先级覆盖低优先级的文件

2.合并内容

资源在文件内定义的(string,style等)和manifest,合并内容,遇到相同资源,高优先级覆盖低优先级。

源码类型允许资源重复合并相同资源
java编译失败
assets文件覆盖
layout文件覆盖
drawable文件覆盖
mipmap文件覆盖
xml文件覆盖
values内容合并
manifest内容合并
    原文作者:Sumauto
    原文地址: https://www.jianshu.com/p/e7c6adc09801
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞