BuildConfig 无法从变量中正确创建值(Gradle Android)

Posted

技术标签:

【中文标题】BuildConfig 无法从变量中正确创建值(Gradle Android)【英文标题】:BuildConfig cannot create values correctly from variables (Gradle Android) 【发布时间】:2020-01-24 18:34:35 【问题描述】:

目标

使用构建类型为不同环境构建 APKs

方法

我正在使用这个post 在没有 android studio 的情况下构建我的 apk。除了我在 gradle 中使用环境变量时,一切正常:

在构建之前,我设置了环境变量

export MY_API_TOKEN="ABCDEFGH"

然后在我的 build.gradle 中:

buildTypes 

  debug 
    buildConfigField("String", "MY_API_TOKEN", System.getenv('MY_API_TOKEN'))
  


当我执行:gradle assemble 我得到这个错误:

/home/apps/app/src/main/java/com/my/package/controller/api/MyAwesomeCode.java:64: error: cannot find symbol
                BuildConfig.MY_API_TOKEN;
                                  ^
  symbol:   variable BuildConfig
  location: class RestAPI
/home/apps/app/build/generated/source/buildConfig/debug/com/my/package/BuildConfig.java:14: error: cannot find symbol
  public static final String MY_API_TOKEN = ABCDEFGH;
                                               ^
  symbol:   variable ABCDEFGH
  location: class BuildConfig

我尝试了几种组合,我得到了同样的错误:

BuildConfig not getting created correctly (Gradle Android) BuildConfig variable. Error: cannot find symbol https://medium.com/@rafamatias/gradle-android-build-variables-done-right-d0c0e296ee93 Gradle : how to use BuildConfig in an android-library with a flag that gets set in an app

我还用变量验证了相同的行为

def MY_API_TOKEN_VAR = "ABCDEFGH"

debug 
  buildConfigField "String", "MY_API_TOKEN", MY_API_TOKEN_VAR

错误:

BuildConfig.java:14: error: cannot find symbol
public static final String MY_API_TOKEN = ABCDEFGH;
                                          ^
symbol:   variable ABCDEFGH
location: class BuildConfig

问题

buildTypes 仅适用于 build.gradle 中的硬编码值?

【问题讨论】:

【参考方案1】:

字符串类型的BuildConfig字段值应该用转义引号中的字段值声明:

android 
    ...
    defaultConfig 
        ...
        def MY_API_TOKEN_VAR = "ABCDEFGH"
        buildConfigField "String", "MY_API_TOKEN", "\"ABCDEFGH\""
    
    ...

带系统环境变量:

android 
    ...
    defaultConfig 
        ...
        def MY_API_TOKEN_VAR = System.getenv('MY_API_TOKEN')
        buildConfigField "String", "MY_API_TOKEN", "\"ABCDEFGH\""
    
    ...

当你没有在转义引号中声明字段值时,你可以在生成的BuildConfig中看到语法错误:

public final class BuildConfig 
  // ...
  // Fields from build type: debug
  public static final String MY_API_TOKEN = ABCD; // Should be "ABCD"

【讨论】:

非常感谢 Natig。我试过了,但错误是一样的。如果可以,请检查我的尝试:gist.github.com/jrichardsz/803ebd6eec990f6880ff16b5e6b5b194 attempt_2 是最有希望的 第二次尝试是没有希望的,因为正如我在解释中提到的,在创建 buildConfigField 时,不能为没有转义引号的字符串设置值。检查我更新的代码以解决问题。 我的意思是有希望,因为至少价值被替换了。使用尝试_1,错误在替换之前。 我该怎么做?我没有使用 android studio,只是带有最小文本编辑器的完整 linux shell。感谢您的时间和关注。【参考方案2】:

假设给定export MY_API_TOKEN="ABC"(请确保变量对您选择的构建系统可见)并且您的配置配置如下:

buildConfigField("String", "MY_API_TOKEN", "\"" + System.getenv("MY_API_TOKEN") + "\"")

...您的 BuildConfig 类将在同步/重建后有这个额外的字段:

public static final String MY_API_TOKEN = "ABC";

【讨论】:

以上是关于BuildConfig 无法从变量中正确创建值(Gradle Android)的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Android Java 应用程序中读取 BuildConfig.variable

如何将 BuildConfig 值传递给依赖模块?

使用从同一个表中获取值的变量创建更新触发器的正确​​方法是啥?

BATCH - 无法从函数的变量中返回正确的值

变量 BuildConfig 找不到。飘红

如何正确创建 G-Wan 全局变量?