如何从build.gradle更改.java文件中的某些值?
我的应用程序有多种风格。例如。 开发,舞台,制作风格 所以,dev将指向dev服务器url、dev应用程序id等,对于stage和production也是如此。 对于my strings.xml中存在的应用程序id,我可以使用以下代码替换它们-如何从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")
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);