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





