使用CSV/TXT文件中的名称列表(带属性)动态生成productFlavors和sourceSets

And*_*tel 5 android android-build android-gradle-plugin android-productflavors android-sourcesets

这个问题继续我的另一个问题,我想进一步改进.

我能够sourceSets使用以下代码对flavor(具有通用配置)进行分组:

(从上面链接问题的天才那里得到它)

import com.android.build.gradle.api.AndroidSourceSet
android {
    sourceSets {
        [flavor2, flavor4].each { AndroidSourceSet ss ->
            ss.assets.srcDirs = ['repo-assets/flavor2']
            ss.res.srcDirs = ['repo-res/flavor2']
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,我想知道列表[flavor2, flavor4]是否可以从以下任何一个中提取:

  • 一个XML文件,我可以通过它来迭代以获得所有的味道(我将放在那里)
  • 一个CSV文件,我可以通过它迭代并获取值.
  • 一个自定义类,我可以在一个单独的文件中编写,并从类中的静态成员中获取数据.

除了风味名称,我打算将以下内容存储在外部源(上面的一个)中:

  • 应用程序ID(我将拉到productFlavors)
  • 广告单元ID(每种风格两个)
  • 一些其他自定义值,如类别等.

PORPOSE: 我想写一个通用的代码片段来迭代并动态创建productFlavorssourceSets.我已经推广sourceSets到几乎90%,一个块现在足以满足各种口味.

它现在看起来像这样:

sourceSets {
    [flavor1, flavor2, flavor3 ...].each { AndroidSourceSet ss ->
                ss.assets.srcDirs = ['repo-assets/' + ss.name.split('_')[0]]
                ss.res.srcDirs = ['repo-mipmap/' + ss.name.split('_')[0] , 'repo-strings/' + ss.name]
            }
}
Run Code Online (Sandbox Code Playgroud)

也想像productFlavors上面提到的那样做同样的事情.

STUCK AT:[flavor2, flavor4]从外部源获取上面代码中的列表(以及上面列出的每种风味的一些额外字段).

我看到像这样的方法

productFlavors.add()
productFlavors.addAll()
Run Code Online (Sandbox Code Playgroud)

但我不太确定如何使用这些.由于方法可用,我确信有可能做我想做的事情.

有没有人这样做并有一些指示?

And*_*tel 8

我终于以这种方式工作了:

创建一个自定义类MyFlavorbuild.gradle,并添加来自CSV文件中的每个风味的ArrayListMyFlavor

class MyFlavor {
    public String flavorname;
    public String basename;
    public String appid;
    public String bannerid;
    public String interstitialid;
    public String category;
}

def ArrayList<MyFlavor> myFlavors = new ArrayList<>();

new File('app/flavors.csv').eachLine {
    String[] values = "$it".split(',');
    MyFlavor f = new MyFlavor();
    f.flavorname = values[0];
    f.basename = values[0].split('_')[0];
    f.appid = values[1];
    f.bannerid = values[2];
    f.interstitialid = values[3];
    if(values[0].contains('_')) f.category= "state"
    else f.category = "country";
    myFlavors.add(f);
}
Run Code Online (Sandbox Code Playgroud)

然后遍历的ArrayList动态创建productFlavorssourceSets如下:

productFlavors {
    myFlavors.each { MyFlavor f ->
        "$f.flavorname" {
            applicationId = "$f.appid"
            buildConfigField 'String', 'BANNER_ID', "\"" + "$f.bannerid" + "\""
            buildConfigField 'String', 'INTERSTITIAL_ID', "\"" + "$f.interstitialid" + "\""
            buildConfigField 'String', 'CATEGORY', "\"" + "$f.category" + "\""
        }
    }
}
sourceSets {
    myFlavors.each { MyFlavor f ->
        "$f.flavorname" {
            assets.srcDirs = ['repo-assets/' + "$f.basename"]
            res.srcDirs = ['repo-mipmap/' + "$f.basename" , 'repo-strings/' + "$f.flavorname"]
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

希望这有助于某人.我成功地摆脱了1000行代码(因为我有很多口味),并把它归结为你在这里看到的这些10行.