升级 AGP 后,构建错误“cannot find symbol BuildConfig.VERSION_NAME”

1,916 阅读1分钟

本该快快乐乐摸鱼的午后~~

构建出了个错误,搜了一下,好像没有其他工友提到。

记录一下。有什么问题建议的欢迎多多指教

起因

构建老项目,升级 AGP 版本,从版本 3.0.0 升级到 7.0.3。在搞定一系列依赖问题后,构建报了个错误:

error: cannot find symbol BuildConfig.VERSION_NAME
  symbol:   variable VERSION_NAME
  location: class BuildConfig

在 library module 中试图通过 BuildConfig.VERSION_NAME 获取 VERSION_NAME 导致的编译错误。

  • library module 里面的 build.gradle
apply plugin: 'com.android.library'

android {
    compileSdkVersion 25
    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 22
        # 留意这两行
        versionCode 1
        versionName "1.0"

testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

    }
    ... 省略 ...
}

Android IssueTrack 中获知,从AGP version 4.1.0-beta05 版本起,文中这两行已经不效了。

versionCode 1
versionName "1.0"

不能在 BuildConfig 生成相应的字段了。 Google 工程师的说法是,version code 在library module 中没有意义,但是我们可以通过读取这个字段识别我们的 library 版本。

当然我们也可以改代码,不再使用 BuildConfig.VERSION_NAME 来获取 library 的版本。如果你不想要修改代码,你可以参考下面的解决方法。

解决方法

在library module 下的 build.gradle 中加上这两行,重新构建就能正常生成,通过编译,解决问题。

# 加上这两行解决问题
buildConfigField("long", "VERSION_CODE", "${defaultConfig.versionCode}")
buildConfigField("String", "VERSION_NAME", "\"${defaultConfig.versionName}\"")

留意是加到 android.defaultConfig 里面, 如果加到 buildTypes.release 下,是无效的,也无法生成相应的字段。

你也可以把文中的 ${defaultConfig.***} 改成你项目中取值方式,我这么写纯粹是因为懒~

The End

新年快乐 GYM ~

参考资料