前言
当打包项目时会出现标题错误,有时候会弹出此错误但不影响打包,有时候会导致直接打包失败但可以直接在AS中安装,很是头大。
以我报错内容为例:【android其元数据的二进制版本为1.8.0,预期版本为1.5.1 】,刚开始以为项目中有使用了 Kotlin 1.5.1
的版本呢,结果一顿搜索下来并未发现 此版本的任何信息?心里一万个草泥马狂奔。开始百度~
百度遇见很多版本的解决方案,大多不适用,具体分为以下几种:
情况1:
由于新版gradle 和 旧版gradle 文件格式并不相同,搜索到的大多是旧版gradle格式,例如存在 ext.kotlin_version = "1.5.31"
代码行,结构大致如下:
bash
buildscript {
ext.kotlin_version = "1.5.31" // 设置你希望使用的Kotlin版本
repositories {
google()
mavenCentral()
}
dependencies {
classpath "com.android.tools.build:gradle:7.0.2" // Android插件
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // Kotlin插件
}
}
//..
WTF,我项目中都没有这种结构,在相同位置的文件,新的文件内容是:
bash
// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
id 'com.android.application' version '8.3.0' apply false
id 'com.android.library' version '8.3.0' apply false
id 'org.jetbrains.kotlin.android' version '1.9.10' apply false
}
我尝试将 buildscript {}
结构添加进该文件,但并未解决问题,需要注意的是这里仍然可以使用老的 buildscript
,来配置需要的插件,但要写在plugins
上面,不然会报错。既然不行,也没做深究,遂继续找方法~
然后又在项目根目录下查找依赖树,看能不能找到些线索,在AS 命令行执行./gradlew :app:dependencies
,看的眼花缭乱,最终也没发现有用信息。
情况2:
修改kotlin的依赖版本和插件版本,如下:
根项目build.gradle
中插件版本:
bash
id 'org.jetbrains.kotlin.android' version '1.9.10' apply false
奥,是ktx的拓展版本(这是目前在项目中能找到与Kotlin相关的两个地方了):
bash
implementation 'androidx.core:core-ktx:1.10.1'
修改完毕,开始打包,咔!又弹出此错误。我这版本号都改了,竟然报错的内容还一样,连报错的版本号都没变,彻底红温。
情况3:
继续搜索,转向stackoverflow
,于是在这篇文章中得到灵感: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.5.1, expected version is 1.1.15
之前一直没注意到,gradle
版本号 和 gradle
插件版本,对Kotlin有什么影响,于是就照着别人版本号修改了一下,继续打包,咔!不出意外,又报错了,但报错内容不一样了,这不就好起来了吗。开始分析...
简单改了两个插件版本对比了一下,gradle版本没有变仍是7.5
bash
gradle-7.5-bin.zip +
id 'com.android.application' version '7.4.2' +
id 'com.android.library' version '7.4.2' +
id 'org.jetbrains.kotlin.android' version '1.8.10' =
报错:The binary version of its metadata is 1.9.0, expected version is 1.7.1.
gradle-7.5-bin.zip +
id 'com.android.application' version '7.2.1' +
id 'com.android.library' version '7.2.1' +
id 'org.jetbrains.kotlin.android' version '1.8.10' =
报错:The binary version of its metadata is 1.8.0, expected version is 1.6.0.
好嘛!这... 虽然看不出来具体原因,但起码知道了和gradle
版本相关,开始修改这两个版本,不急不急,继续 探索~
于是乎,就找到了以下这两个地址:Android Gradle 插件版本说明 和 Gradle版本和Kotlin版本对应关系,才发现原来他们两个还有着这么紧密的关系啊。
你可以根据项目所需的gradle
版本 ,并选择相应的插件版本,并且要对照好你需要的Kotlin
版本。
OK,知道问题所在之后,那就改吧,继续打包,不出意外还是出意外了,我项目选择的组合是
- Kotlin 版本 :
1.9.10
- Gradle 版本 :
8.4
- Android Gradle Plugin 版本 :
8.3.0
打包报错没有BuildConfig
,在此不做叙述了,可以参考这篇文章:Android BuildConfig不生成的解决办法,没有此问题忽略。
顺利的话,修改完gradle相关版本,就能顺利打包而不报错了,但!也不在乎你依赖的三方库不会报错,例如我项目中使用了 RxHttp,而它的版本也与Kotlin版本有着一定关系:
Kotlin
版本不对应也可能会报错,所以尽量修改为一个合适的版本,保持项目健壮性。
最后
之前遇到这种问题,大都是咔咔一顿复制粘贴,又是强制使用某个Kotlin
版本又是不影响打包就忽略报错,想解决又心有余而力不足,事实证明,只要慢慢分析,就没有解决不了的问题,哈哈,再会!