一、资源存放位置
在Android Studio项目中,源码和资源都是放在各个module中对应的src目录下。比如一个叫app的module,默认情况下我们看到的是在app/src/main下。但实际上module中源码和资源目录不止一个。如果app有两个buildType叫debug和release,那么每个同样你也可以在app/src/debug
、app/src/release
下放置你的源码和资源。如果你有两个productFlavors分别叫flavor1和flavor2,同样的你也可以在app/src/flavor1
、app/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的可以在这里切换:
image.png
build variants的组合方式是[dimen1][dimen2][buildType]
,dimen1有1个(flavor1),dimen2有2个(flavor2、flavor3),buildType有2个(debug、release ),因此一共有122=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 | 是 | 内容合并 |
网友评论