如何在build.gradle中更改.java文件中的某些值?

时间:2014-03-19 07:08:27

标签: java android gradle android-gradle build.gradle

我的情况是我有多种口味的应用程序。对于前者 开发,舞台,制作口味。

因此,dev将指向dev服务器url,dev app id等,同样适用于舞台和制作。 对于我的strings.xml中存在的app id,我可以使用以下代码替换它们 -

variant.mergeResources.doLast {
        File valuesFile = file("${buildDir}/res/all/${variant.dirName}/values/values.xml")
        println("Replacing app id in " + variant.dirName)
        String content = valuesFile.getText('UTF-8')
        def appid;
        String variantDirName = variant.dirName;
        if (variantDirName.contains("dev")) {
            appid = '1234_dev'
        } else if(variantDirName.contains("stage")) {
            appid = '1234_stage'
        } else if(variantDirName.contains("prod")) {
            appid = '1234_prod'
        } else {
            appid = '1234_unknown'
        }
        content = content.replaceAll(/some_app_id/, appid)
        valuesFile.write(content, 'UTF-8')
    }

我的strings.xml是 -

    <string name="app_id">some_app_id</string>

现在,服务器URL作为常规常量存储在我的Config.java文件中 -

public static final String BASE_URL = "http://dev.blahblah.com";

所以问题是如何根据不同的风格从我的build.gradle文件中更改Config.java中的这一行?

2 个答案:

答案 0 :(得分:8)

您可以使用BuildConfig作为Xavier悲伤。例如:

在产品口味中

productFlavors {
    develop {
        applicationId "com.dexode.cree.develop"
        ext.enableCrashlytics = false

        buildConfigField "String", "API_URL", "\"https://api.test.dexode.com/2.3\""
    }
    beta {
        applicationId "com.dexode.cree.beta"
        ext.enableCrashlytics = true

        buildConfigField "String", "API_URL", "\"https://api.dexode.com/2.3\""
    }
    production {
        ext.enableCrashlytics = true
        buildConfigField "String", "API_URL", "\"https://api.dexode.com/2.3\""
    }

所以现在你的BuildConfig看起来像:

public final class BuildConfig {
  public static final boolean DEBUG = Boolean.parseBoolean("true");
  public static final String APPLICATION_ID = "com.dexode.cree.develop.debug";
  public static final String BUILD_TYPE = "debug";
  public static final String FLAVOR = "develop";
  public static final int VERSION_CODE = 1;
  public static final String VERSION_NAME = "1.0.0.0_debug";
  // Fields from product flavor: develop
  public static final String API_URL = "https://api.test.dexode.com/2.3";
}

在代码中使用:

RestAdapter.Builder builder = new RestAdapter.Builder().setEndpoint(BuildConfig.API_URL);

请记住刷新BuildConfig文件的内容。 AndroidStudio喜欢缓存文件。您可以点击文件 - &gt;同步

Documentation about Flavors

相关问题buildConfigField depending on flavor + buildType

答案 1 :(得分:5)

您不应该编辑这样的现有任务的输出,这将打破增量支持,每次构建时,它都会重新运行mergeResource任务(因为它的输出已更改)。

在这种情况下,我只需使用resConfigbuildConfigField动态创建BuildConfig

中的res和常量字段