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