动态生成产品风味

 琼小海 发布于 2023-02-05 23:20

我已经创建了一个Android应用程序,需要构建多种(30多种)风格.

我的想法是productFlavors直接从我的src目录中的文件夹结构生成不同的,因为配置总是非常相似(基本上只是另一个packageName,一个新的启动器图标和一些字符串更改).

src文件夹是这样的:

??? src
    ??? flavor1
    ?   ??? flavor2.keystore
    ?   ??? res
    ??? flavor2
    ?   ??? res
    ?   ??? flavor2.keystore    
    ??? main
        ??? AndroidManifest.xml
        ??? java
        ??? res

如果我必须手动创建gradle属性,它看起来会像这样:

android {

    ....

    productFlavors {
        flavor1 {
            packageName 'com.example.flavor1'
        }
        flavor2 {
            packageName 'com.example.flavor2'
        }
    }

}

每次我尝试productFlavors在创建后更改配置时,我都会收到错误或者无提示地忽略更改/添加.
这可能是我造成的问题,因为我的Gradle/Groovy体验非常有限,或者这是不可能的.

我大多得到错误,说GroupableProductFlavorDsl_Decorated不能按我想要的方式操纵.

我想要存档的内容应该是这样的:

android {

    ....

    def flavors = getMyFlavorsFromFileSystem()

    productFlavors {

    }

    flavors.each { name, config ->
        productFlavors[name] << config
    }

}

注意:我知道这个问题基本上是一个旧问题的重复,遗憾的是从来没有回答过.由于Gradle是Android世界的新手,我希望能够获得更多的答案,因为自上次提出问题以来,因为更多的开发人员现在正在使用Gradle.

更新:

这里我尝试了一些非常简单的方法:

变式1:

android {

    productFlavors {

    }

    productFlavors['flavor1'] << {
        packageName "com.example.flavor1"
    }

    productFlavors['flavor2'] << {
        packageName "com.example.flavor2"
    }
}

/*

A problem occurred evaluating root project 'MyProject'.
> GroupableProductFlavorDsl with name 'flavor1' not found.

*/

变式2:

android {

    productFlavors {

    }

    productFlavors['flavor1'] = {
        packageName "com.example.flavor1"
    }

    productFlavors['flavor2'] = {
        packageName "com.example.flavor2"
    }
}

/*

no error, but does not work

*/

变式3:

android {

    productFlavors {

    }

    productFlavors['flavor1'] = [packageName: "com.example.flavor1"]

    productFlavors['flavor2'] = [packageName: "com.example.flavor2"]
}

/*

no error, but does not work

*/

所有这些都是一个要点.

2 个回答
  • 通过反复试验解决:

    android {
    
        // let's assume these are return by a function which reads the filesystem
        def myFlavors = [
            flavor1: [
                packageName: "com.example.flavor1"
            ],
            flavor2: [
                packageName: "com.example.flavor2"
            ]
        ]
    
        productFlavors {
            myFlavors.each { name, config ->
                "$name" {
                    packageName config.packageName
                }
            }
        }
    
    }
    

    2023-02-05 23:33 回答
  • 我知道已经有了答案,但我将Chris.Zou的方法与TheHippo结合起来.并添加我自己的方法来做到这一点.

    基本上,在处理flavor时,我们通常使用包含资源的/ app/src /下的不同目录.由于目录名称等于包名称,我只列出该文件夹下的目录(不包括"main"和"androidTest").

    所以这是我完整的,有效的gradle脚本:

    def map = [:]
    
    new File("./app/src").eachFile() { file->
    
        def fileName = file.getName()
        if( fileName == "main" || fileName == "androidTest") {
            return
        }
    
        map.put(fileName, 'com.mypackagename.' + fileName )
    
    
    }
    productFlavors {
        map.each { flavorName, packagename ->
            "$flavorName" {
                applicationId packagename
            }
        }
    }
    

    编辑:

    还想补充一点,com.mypackagename基本上是所有风味的根路径.

    我有一个单独的脚本,将flavor目录复制粘贴到/ app/src /文件夹.

    2023-02-05 23:38 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有