我目前开发的项目使用了多 flavor 组合的方式,在开发的过程中发现一个很恶心的性能问题
当 flavor dimensions 超过一定数量后(业务需求),gradle sync 和 build 都变得奇慢无比,在 8 代 i7 低压,8G 内存的机器上平均需要 3 分钟
最后我们的解决方式是,开发中
1、将 flavor 组合拆分成不同的 gradle 文件 2、build.gradle 引用你想开发的 flavor 组合对应的文件
发布时仍然采用最初的 gradle 文件
另外 module 过多好像也会引起性能问题( 30+)
通过使用忽略不相关task的方式,可以大大加快gradle sync的速度
例如应用有四种flavor
flavorDimensions "flavorA","flavorB","flavoC","flavorD"
productFlavors{
flavorAA{
dimension "flavorA"
}
flavorAB{
dimension "flavorA"
}
flavorBA{
dimension "flavorB"
}
flavorBB{
dimension "flavorB"
}
flavorCA{
dimension "flavorC"
}
flavorCB{
dimension "flavorC"
}
flavorDA{
dimension "flavorD"
}
flavorDB{
dimension "flavorD"
}
}
经过组合,一共有8种打包方式,16种build variants
(包括debug
和release
),这时候打包速度其实还可以接受
现在添加gradle脚本,忽略不相关task,首先在app模块的build.gradle添加代码,读取local.properties
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
def flavorAValue = properties.getProperty("flavorA")
def flavorBValue = properties.getProperty("flavorB")
def flavorCValue = properties.getProperty("flavorC")
def flavorDValue = properties.getProperty("flavorD")
if (flavorAValue == null)
flavorAValue = 'flavorAA'
if (flavorBValue == null)
flavorBValue = 'flavorBA'
if (flavorCValue == null)
flavorCValue = 'flavorCA'
if (flavorDValue == null)
flavorDValue = 'flavorDA'
def compositeFlavors = flavorAValue+flavorBValue+flavorCValue+flavorDValue
同样的文件,添加代码,忽略不相关task
android{
android.variantFilter { variant ->
if(!variant.getName().toUpperCase().startsWith(compositeFlavors.toUpperCase())){
variant.setIgnore(true)
}
}
}
重新sync,将看到Build Variant窗口只剩下两个选项flavorAAflavorBAflavorCAflavorDADebug和flavorAAflavorBAflavorCAflavorDADebug,同理Gradle窗口下的选项也仅剩下flavorAAflavorBAflavorCAflavor相关的task
1
bjzhou1990 2018-09-11 10:29:02 +08:00 1
debug 阶段不用的 flavor 可以 disable 的
|
2
sampeng 2018-09-11 10:35:34 +08:00
还好啊。。。八代普压 i5.16G 。ssd。25s。
flavor 有 3 个 8G 内存有点低。。是否是 ssd ?读写 2G 的那种? |
3
zongren OP @bjzhou1990 多谢回复,是的,但是有很多配置需要不停的改写,如果不用 flavor 应该怎么解决?
|
5
bjzhou1990 2018-09-11 10:42:30 +08:00
@zongren #3 编写一次就可以解决啊
|
6
bjzhou1990 2018-09-11 10:42:40 +08:00
@bjzhou1990 #5
android.variantFilter { variant -> def name1 = variant.getFlavors().get(0).name def name2 = variant.getFlavors().get(1).name def isDebug = variant.buildType.name.equals('debug') if (name1.equals('ignoredName1') && name2.equals('ignoredName2') && isDebug) variant.setIgnore(true); } } |
7
nicevar 2018-09-11 11:46:40 +08:00
开发中你还全部开启?不慢才怪,两种办法
1.跟楼上 bjzhou1990 写得一样,进行过滤处理 2.开发的时候只配置一种就行了,多个 gradle 文件,发版本的时候交给 jenkins 处理 |
8
houskii 2018-09-11 11:47:37 +08:00
那不同 flavor 的代码及资源怎么切换的
|
9
XinLake 2018-09-11 12:10:07 +08:00
不会啊,把你的 gradle 贴出来看看?
|