由于更换了设备,就安装了最新的开发环境,从git上clone代码时,同步失败。项目为Java和Kotlin混编。遂经历了不短的一段调整时间调试,终于可以正常的run起来了,记录一下。
本地环境
Android Gradle Plugin Version: 3.4.0
Gradle Version: 5.1.1
项目环境
Android Gradle Plugin Version: 3.0.1(clone到本地后被我修改为3.4.0)
protobuf-gradle-plugin: 0.8.5
kotlin-gradle-plugin: 1.2.50
遇到的问题
protobuf-gradle-plugin版本不兼容
- 报错日志1:
No such property: javaCompilerTask for class: com.android.build.gradle.internal.variant.TestVariantData
- 报错日志2:
Directory '/<project_path>/build/extracted-include-protos/main' specified for property '$3' does not exist.
- 解决办法:将protobuf-gradle-plugin版本号升至0.8.8或以上。
- 参考:https://github.com/google/protobuf-gradle-plugin/issues/253
kotlin-gradle-plugin版本不兼容
- 报错日志:
Error:Execution failed for task ':app:kaptDebugKotlin'.
Internal compiler error. See log for more details.
- 解决办法:将kotlin-gradle-plugin版本号升至1.3.21或以上。
- 参考:
设置mergedFlavor的versionCode/versionName出错
- 报错日志:
ERROR: versionName cannot be set on a mergedFlavor directly.
versionNameOverride can instead be set for variant outputs using the following syntax:
android {
applicationVariants.all { variant ->
variant.outputs.each { output ->
output.versionNameOverride = "x.x.x"
}
}
}
- 解决办法:
按照日志里面的方法修改就行,具体如下:
// 修改前
applicationVariants.all { variant ->
def flavor = variant.mergedFlavor
// versionCode也一样
def versionName = flavor.getVersionName()
flavor.versionName = versionName
}
// 修改后
applicationVariants.all { variant ->
def flavor = variant.mergedFlavor
def versionName = flavor.getVersionName()
variant.outputs.each { output ->
output.versionNameOverride = versionName
}
}
- 参考:
https://stackoverflow.com/questions/52924175/versionname-cannot-be-set-on-a-mergedflavor-directly
其他与gradle版本无关的问题
git config配置出错
我们的项目versionCode是动态配置的,类似于这样:
Properties cusProperties = loadProperties("local.properties")
def getVersionCode = { ->
if(cusProperties['version.code'])
return cusProperties['version.code']
else
return 'git rev-list --count HEAD'.execute([], project.rootDir).text.trim()
}
def getVersionName = { ->
if(cusProperties['version.name'])
return cusProperties['version.name']
else
return "git describe --tags --dirty".execute([], project.rootDir).text.trim() + "." + getVersionCode()
}
android {
compileSdkVersion 26
defaultConfig {
applicationId "xx.xx.xx"
minSdkVersion 19
targetSdkVersion 25
versionCode getVersionCode().toInteger()
versionName getVersionName()
}
}
然后在同步的时候,命令行'git rev-list --count HEAD'
执行报错。当时不知道到底是什么原因,最后在该命令行的.execute()
后面加了.err
,使得整个return
语句变为:
return 'git rev-list --count HEAD'.execute([], project.rootDir).err.text.trim()
于是便可以查看输出的错误信息。如下:
error: could not expand include path '~/.gitcinclude',
fatal: bad config file line 49 in /usr/local/git/etc/gitconfig
- 解决办法:这个错误是由于系统gitconfig文件中的默认路径
~/
出了点问题。这里我用的是macOS X。
找到/usr/local/git/etc/gitconfig文件,打开,发现文件只读,被上锁了。于是右键显示简介,右下角有个锁子图标,打开,然后最下面的共享与权限中将用户权限改为读写。
然后用文本编译器打开,将其中所有的~/
路径都更换为/Users/<yourusername>/
后保存,然后还原文件权限,再次同步文件,问题解决了。 - 参考:
至此,所有问题解决完毕,可以正常运行了。
总结
Gradle升级时,很可能会引发老版本的项目同步/编译出错。所以没有必要就暂时先别更新,如果一定要更新,最好将相关的所有插件版本全部更新至兼容版本。
其次遇到问题最好去Google,这些问题除非是天选之人,否则同样的问题一定有人遇到过,而百度一般搜不到(至少我这次基本没有用百度搜到过正确答案)。