You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android如何通过编程获取所有App Flavor名称及Activity中风味列表

获取所有App Flavor列表的解决方案

嘿,我明白你的需求——你已经在Gradle里配置了多个Flavor,但目前只能通过BuildConfig.FLAVOR拿到当前编译的那个,想要获取所有定义的Flavor列表对吧?下面给你两种靠谱的实现方式:

方法1:通过Gradle生成Flavor数组到BuildConfig

这是最直接的方式,我们可以在编译时让Gradle把所有Flavor名称注入到BuildConfig类中,这样在Activity里就能直接调用。

在你的app模块的build.gradle(Groovy示例)中添加以下配置:

android {
    flavorDimensions "igen"
    productFlavors {
        myExamIdea {}
        examLeaders{}
    }

    // 注入所有Flavor列表到BuildConfig
    applicationVariants.all { variant ->
        // 把所有Flavor名称转成字符串数组格式
        def flavorArrayContent = productFlavors.names.collect { "\"$it\"" }.join(",")
        variant.buildConfigField("String[]", "ALL_FLAVORS", "new String[]{${flavorArrayContent}}")
    }
}

配置完成后重新编译项目,你会发现BuildConfig类里多了一个ALL_FLAVORS静态数组。在Activity里直接使用即可:

// 获取所有Flavor列表
String[] allFlavors = BuildConfig.ALL_FLAVORS;
// 遍历输出示例
for (String flavor : allFlavors) {
    Log.d("FlavorList", "Flavor: " + flavor);
}

方法2:生成字符串资源存储Flavor列表

如果你不想修改BuildConfig,也可以让Gradle生成一个字符串资源,把所有Flavor名称用逗号分隔存储起来,之后在代码中解析成数组。

同样在app模块的build.gradle中添加:

android {
    // ... 已有的flavor配置

    // 生成包含所有Flavor的字符串资源
    applicationVariants.all { variant ->
        def allFlavorsStr = productFlavors.names.join(",")
        variant.resValue("string", "all_flavors", allFlavorsStr)
    }
}

编译后,在Activity中通过资源获取并解析:

// 获取逗号分隔的Flavor字符串
String flavorsStr = getResources().getString(R.string.all_flavors);
// 分割成数组
String[] allFlavors = flavorsStr.split(",");

关键提醒

这两种方式都是编译时注入的——因为运行时APK只包含当前编译的Flavor相关内容,无法直接获取所有定义过的Flavor,所以必须通过Gradle在编译阶段把列表写入到代码或资源中。如果你的Flavor名称包含特殊字符(比如逗号),记得在Gradle处理时做转义,避免分割出错。

内容的提问来源于stack exchange,提问作者Khemraj Sharma

火山引擎 最新活动