【问题标题】:BuildConfig cannot create values correctly from variables (Gradle Android)BuildConfig 无法从变量中正确创建值(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

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

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

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 中的硬编码值?

【问题讨论】:

    标签: android android-studio


    【解决方案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";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-10
      • 2014-05-19
      相关资源
      最近更新 更多