V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zongren
V2EX  ›  Android

提醒使用多 flavor 的 Android 工程师。。。

  •  
  •   zongren · 2018-09-11 10:22:24 +08:00 · 10168 次点击
    这是一个创建于 2300 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我目前开发的项目使用了多 flavor 组合的方式,在开发的过程中发现一个很恶心的性能问题

    当 flavor dimensions 超过一定数量后(业务需求),gradle sync 和 build 都变得奇慢无比,在 8 代 i7 低压,8G 内存的机器上平均需要 3 分钟

    最后我们的解决方式是,开发中

    1、将 flavor 组合拆分成不同的 gradle 文件 2、build.gradle 引用你想开发的 flavor 组合对应的文件

    发布时仍然采用最初的 gradle 文件

    另外 module 过多好像也会引起性能问题( 30+)

    第 1 条附言  ·  2019-01-28 16:13:40 +08:00

    更新-2019/1/28日


    通过使用忽略不相关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(包括debugrelease),这时候打包速度其实还可以接受

    现在添加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

    10 条回复    2018-09-12 11:34:59 +08:00
    bjzhou1990
        1
    bjzhou1990  
       2018-09-11 10:29:02 +08:00   ❤️ 1
    debug 阶段不用的 flavor 可以 disable 的
    sampeng
        2
    sampeng  
       2018-09-11 10:35:34 +08:00
    还好啊。。。八代普压 i5.16G 。ssd。25s。
    flavor 有 3 个

    8G 内存有点低。。是否是 ssd ?读写 2G 的那种?
    zongren
        3
    zongren  
    OP
       2018-09-11 10:37:15 +08:00
    @bjzhou1990 多谢回复,是的,但是有很多配置需要不停的改写,如果不用 flavor 应该怎么解决?
    zongren
        4
    zongren  
    OP
       2018-09-11 10:37:51 +08:00
    @sampeng 多谢回复,ssd 应该没那么快,dell 6000 不到的机器
    bjzhou1990
        5
    bjzhou1990  
       2018-09-11 10:42:30 +08:00
    @zongren #3 编写一次就可以解决啊
    bjzhou1990
        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);
    }
    }
    nicevar
        7
    nicevar  
       2018-09-11 11:46:40 +08:00
    开发中你还全部开启?不慢才怪,两种办法
    1.跟楼上 bjzhou1990 写得一样,进行过滤处理
    2.开发的时候只配置一种就行了,多个 gradle 文件,发版本的时候交给 jenkins 处理
    houskii
        8
    houskii  
       2018-09-11 11:47:37 +08:00
    那不同 flavor 的代码及资源怎么切换的
    XinLake
        9
    XinLake  
       2018-09-11 12:10:07 +08:00
    不会啊,把你的 gradle 贴出来看看?
    zongren
        10
    zongren  
    OP
       2018-09-12 11:34:59 +08:00
    @houskii 多谢回复,你是在问我吗。。
    @nicevar 嗯。目前采用的就是多个 gradle 文件的方式开发,发布的时候还是正常的多 flavor 方案
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2771 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 10:06 · PVG 18:06 · LAX 02:06 · JFK 05:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.