【问题标题】:How to change some value in .java file from build.gradle?如何从 build.gradle 更改 .java 文件中的某些值?
【发布时间】:2014-03-19 07:08:26
【问题描述】:

我的应用程序有多种风格。例如。 开发、阶段、生产风格。

因此,dev 将指向开发服务器 url、开发应用程序 ID 等,对于舞台和生产也是如此。 对于我的 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')
    }

我的 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 中的这一行?

【问题讨论】:

  • 为什么不使用您从中读取的具有适当名称的属性文件?你可以从静态初始化器中做到这一点
  • 如何告诉我的 Config.java 使用属性文件中的 url?您可以使用您的方法发布答案吗?这似乎是一个好方法。如果您使用示例进行说明,那就更好了。谢谢
  • 这也取决于您如何获得该 app_id。我不知道安卓...
  • 如果我将 url 保留在 strings.xml 中。任何人都可以提取我的 .apk 文件并读取 strings.xml,所以我不想采用这种方法。

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


【解决方案1】:

您可以像 Xavier 一样使用 BuildConfig。示例:

在产品风味方面

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

Documentation about Flavors

相关问题buildConfigField depending on flavor + buildType

【讨论】:

    【解决方案2】:

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

    在这种情况下,我只需使用resConfigbuildConfigFieldBuildConfig 中动态创建一个 res 和一个常量字段

    【讨论】:

    • 谢谢。我刚刚在网上的某个地方找到了。这是我认为的完美方法。
    • 您是否介意提供更多信息,更具体地解释:1。最初的问题是,您如何实际更改 java 文件中的值? 2. 如何使用在 buildConfigField 中创建的常量?我找不到任何相关文件。谢谢!
    • buildConfigField 将在生成的类&lt;your package Name&gt;.BuildConfig 中创建一个新常量。
    猜你喜欢
    • 1970-01-01
    • 2021-07-04
    • 2021-07-21
    • 2021-10-25
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多