Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从build.gradle更改.java文件中的某些值?_Java_Android_Gradle_Android Gradle Plugin_Build.gradle - Fatal编程技术网

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

如何从build.gradle更改.java文件中的某些值?,java,android,gradle,android-gradle-plugin,build.gradle,Java,Android,Gradle,Android Gradle Plugin,Build.gradle,我的应用程序有多种风格。例如。 开发,舞台,制作风格 所以,dev将指向dev服务器url、dev应用程序id等,对于stage和production也是如此。 对于my strings.xml中存在的应用程序id,我可以使用以下代码替换它们- variant.mergeResources.doLast { File valuesFile = file("${buildDir}/res/all/${variant.dirName}/values/values.xml")

我的应用程序有多种风格。例如。 开发,舞台,制作风格

所以,dev将指向dev服务器url、dev应用程序id等,对于stage和production也是如此。 对于my strings.xml中存在的应用程序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')
    }
其中my strings.xml是-

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

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

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


在这种情况下,我只需使用
resConfig
buildConfigField
BuildConfig

中动态创建一个res和一个常量字段,您可以将BuildConfig用作Xavier sad。例如:

产品风味

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喜欢缓存文件。您可以单击文件->同步


相关问题

为什么不使用您从中读取的具有适当名称的属性文件?您可以从静态初始化器中执行此操作。如何告诉my Config.java使用属性文件中的url?你能用你的方法发布答案吗?这似乎是个好办法。如果你用例子来说明就更好了。谢谢,这也取决于你如何获得应用程序id。我不知道android…如果我把url保存在strings.xml中。任何人都可以提取我的.apk文件并读取strings.xml,所以我不想使用这种方法。谢谢。我刚在网上找到一个地方。我认为这是一个完美的方法。你介意提供更多的信息,更具体地解释一下:1。最初的问题是,如何实际更改java文件中的值?2.如何使用在buildConfigField中创建的常量?我找不到这方面的任何文件。谢谢buildConfigField将在生成的类
.BuildConfig
中创建一个新常量。
RestAdapter.Builder builder = new RestAdapter.Builder().setEndpoint(BuildConfig.API_URL);