android - 动态生成产品 flavor

标签 android gradle android-gradle-plugin

我创建了一个需要以多种 (30 多种) 风格构建的 Android 应用。

我的想法是直接从我的 src 目录中的文件夹结构生成不同的 productFlavors,因为配置总是非常相似(基本上只是另一个 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
    }

}

注意:我知道这个问题基本上是 duplicate一个较老的问题,遗憾的是从未得到回答。由于 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

*/

所有这些都是 Gist .

最佳答案

通过反复试验解决:

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
            }
        }
    }

}

关于android - 动态生成产品 flavor ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20976946/

相关文章:

java - 为什么 Xamarin 无法导入 Spongy CaSTLe?

gradle - 调试SLF4J Post Gradle转换

android studio 0.4.2 + gradle + 安卓源码

java - Android 没有得到正确的 boolean 值

android - 如何在 android 中为 Alertdialog.builder 的分隔线着色?

log4j - 在Eclipse的Java Gradle Web应用程序中将log4j.properties放在哪里

android - Invalid tool ID 2.2 on jenkins gradle automatic install 如何解决?

android - 在特定设备上获取 native Android Crash/system/lib64/libc.so (tgkill+8)

android - 将 Unity 项目导入 Android Studio

Android APK 在启动时崩溃并出现 'Illegal class access' 错误