Android Project Gradle升级5.1遇到的坑

由于更换了设备,就安装了最新的开发环境,从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 '//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或以上。
  • 参考:
    1. https://stackoverflow.com/questions/43661018/kapt-build-fails-with-dagger-android-processor;
    2. https://stackoverflow.com/questions/46850060/errorexecution-failed-for-task-appkaptdebugkotlin;

设置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//后保存,然后还原文件权限,再次同步文件,问题解决了。
  • 参考:
    1. https://stackoverflow.com/questions/19526732/can-not-build-gradle-project-with-android-studio
    2. https://stackoverflow.com/questions/36908041/git-could-not-expand-include-path-gitcinclude-fatal-bad-config-file-line

至此,所有问题解决完毕,可以正常运行了。

总结

Gradle升级时,很可能会引发老版本的项目同步/编译出错。所以没有必要就暂时先别更新,如果一定要更新,最好将相关的所有插件版本全部更新至兼容版本。
其次遇到问题最好去Google,这些问题除非是天选之人,否则同样的问题一定有人遇到过,而百度一般搜不到(至少我这次基本没有用百度搜到过正确答案)。

你可能感兴趣的:(Android Project Gradle升级5.1遇到的坑)