分析android :The binary version of its metadata is 1.8.0, expected version is 1.5.

前言

当打包项目时会出现标题错误,有时候会弹出此错误但不影响打包,有时候会导致直接打包失败但可以直接在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版本又是不影响打包就忽略报错,想解决又心有余而力不足,事实证明,只要慢慢分析,就没有解决不了的问题,哈哈,再会!

相关推荐
千里马学框架1 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台1 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone1 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc1 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo1 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077002 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼2 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone2 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen2 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone2 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui