分析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版本又是不影响打包就忽略报错,想解决又心有余而力不足,事实证明,只要慢慢分析,就没有解决不了的问题,哈哈,再会!

相关推荐
带电的小王24 分钟前
WhisperKit: Android 端测试 Whisper -- Android手机(Qualcomm GPU)部署音频大模型
android·智能手机·whisper·qualcomm
梦想平凡36 分钟前
PHP 微信棋牌开发全解析:高级教程
android·数据库·oracle
元争栈道1 小时前
webview和H5来实现的android短视频(短剧)音视频播放依赖控件
android·音视频
阿甘知识库2 小时前
宝塔面板跨服务器数据同步教程:双机备份零停机
android·运维·服务器·备份·同步·宝塔面板·建站
元争栈道2 小时前
webview+H5来实现的android短视频(短剧)音视频播放依赖控件资源
android·音视频
MuYe3 小时前
Android Hook - 动态加载so库
android
居居飒3 小时前
Android学习(四)-Kotlin编程语言-for循环
android·学习·kotlin
Henry_He6 小时前
桌面列表小部件不能点击的问题分析
android
工程师老罗6 小时前
Android笔试面试题AI答之Android基础(1)
android
qq_397562318 小时前
android studio更改应用图片,和应用名字。
android·ide·android studio