Android cmdline-tools 版本与其最小JDK关系

2023-10-25 00:01

本文主要是介绍Android cmdline-tools 版本与其最小JDK关系,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

关键词:Android cmdline-tools 历史版本、Android cmdline-tools 最小JDK版本、JDK 对应 major version、JDK LTS 信息

由于 JDK8 是一个常用的、较低的版本,因此只需要关注 JDK8 及以上版本的运行情况。

cmdline-tools 版本和最低 JDK

最终结论:(在 Mac 上,基于 JDK8 测试的结果)

cmdline-tools 版本SdkManagerCliSettingsAndroidLocationsProvider最低 JDK
11.061 (JDK 17)55 (JDK 11)17
10.052 (JDK 8)55 (JDK 11)11
9.052 (JDK 8)55 (JDK 11)11
8.052 (JDK 8)52 (JDK 8)8
7.052 (JDK 8)52 (JDK 8)8
6.052 (JDK 8)52 (JDK 8)8

通过上表可以看出,在 cmdline-tools 内部,各个 Jar 的编译目标 JDK 版本存在不一致的情况。因此,在实际运行时,需要将所有 Jar 文件的编译目标 JDK 版本的最大值作为 cmdline-tools 运行时的最小的 JDK 版本。

Android 官网的 cmdline-tools 提供的最新版本是11.0(截止2023年10月24日),也就是说,其 Runtime 的 JDK 版本必须是 JDK17 及以上。

检查流程

$ java -version
java version "1.8.0_351"$ cd path/cmdline-tools/9.0/bin
$ ./sdkmanager --list
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.UnsupportedClassVersionError: com/android/prefs/AndroidLocationsProvider has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0

由上述报错信息可知,com/android/prefs/AndroidLocationsProvider 要求最低使用 version 55.0(JDK 11)。

但是其他 class (比如 lib/sdklib/libsdkmanager_lib.jar 内的 com.android.sdklib.tool.sdkmanager.SdkManagerCliSettings)仍旧是 version 52.0 (JDK 8)。

这里的思路是:

直接切换到cmdline-tools对应版本,然后基于 runtime JDK = 8 的环境,执行 ./sdkmanager --version 检查是否报错,如报错,查看要求的最低 version 为多少。(低于JDK8的不再验证)

验证的脚本:majorVersion.sh

使用方法:./majorVersion.sh path/cmdline-tools/11.0

#!/bin/bash$1/bin/sdkmanager --version
$1/bin/sdkmanager --version 2>&1 | grep "class file"jar_file=/lib/sdklib/libsdkmanager_lib.jarecho "-> $jar_file"
# 使用 javap 命令解析 JAR 文件内指定的 class
output=$(javap -verbose -classpath "$1${jar_file}" com.android.sdklib.tool.sdkmanager.SdkManagerCliSettings 2>&1)#echo "$output"
# 查找主要版本号
major_version=$(echo "$output" | grep  'major version')
# 打印主要版本号
echo "--> $major_version"##---
jar_file=/lib/common/tools.common.jarecho
echo "-> $jar_file"
# 使用 javap 命令解析 JAR 文件内指定的 class
output=$(javap -verbose -classpath "$1${jar_file}" com.android.prefs.AndroidLocationsProvider 2>&1)
# 查找主要版本号
major_version=$(echo "$output" | grep  'major version')
# # 打印主要版本号
echo "--> $major_version"

验证结果:

# 11.0
Exception in thread "main" java.lang.UnsupportedClassVersionError: com/android/sdklib/tool/sdkmanager/SdkManagerCli has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 52.0-> /lib/sdklib/libsdkmanager_lib.jar
major version: 61
-> /lib/common/tools.common.jar
major version: 55# 10.0
Exception in thread "main" java.lang.UnsupportedClassVersionError: com/android/prefs/AndroidLocationsProvider has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0-> /lib/sdklib/libsdkmanager_lib.jar
major version: 52
-> /lib/common/tools.common.jar
major version: 55# 9.0
Exception in thread "main" java.lang.UnsupportedClassVersionError: com/android/prefs/AndroidLocationsProvider has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0-> /lib/sdklib/libsdkmanager_lib.jar
major version: 52
-> /lib/common/tools.common.jar
major version: 55# 8.0
-> /lib/sdklib/libsdkmanager_lib.jar
major version: 52
-> /lib/common/tools.common.jar
major version: 52

扩展资料

cmdline-tools 历史版本

官网地址:https://developer.android.com/studio

cmdline-tools 版本最低 JDKMacLinuxWindows
11.0(latest)17commandlinetools-mac-10406996_latest.zipcommandlinetools-linux-10406996_latest.zipcommandlinetools-win-10406996_latest.zip
10.011commandlinetools-mac-9862592_latest.zipcommandlinetools-linux-9862592_latest.zipcommandlinetools-win-9862592_latest.zip
9.011commandlinetools-mac-9477386_latest.zipcommandlinetools-linux-9477386_latest.zipcommandlinetools-win-9477386_latest.zip
8.08commandlinetools-mac-9123335_latest.zipcommandlinetools-linux-9123335_latest.zipcommandlinetools-win-9123335_latest.zip

下载地址的生成规则:https://dl.google.com/android/repository/文件名

JDK 对应 major version

Java SE 21 = 65 (0x41 hex),
Java SE 20 = 64 (0x40 hex),
Java SE 19 = 63 (0x3F hex),
Java SE 18 = 62 (0x3E hex),
(LTS) Java SE 17 = 61 (0x3D hex),
Java SE 16 = 60 (0x3C hex),
Java SE 15 = 59 (0x3B hex),
Java SE 14 = 58 (0x3A hex),
Java SE 13 = 57 (0x39 hex),
Java SE 12 = 56 (0x38 hex),
(LTS) Java SE 11 = 55 (0x37 hex),
Java SE 10 = 54 (0x36 hex),[4]
Java SE 9 = 53 (0x35 hex),[5]
(LTS) Java SE 8 = 52 (0x34 hex),
Java SE 7 = 51 (0x33 hex),
Java SE 6.0 = 50 (0x32 hex),
Java SE 5.0 = 49 (0x31 hex),
JDK 1.4 = 48 (0x30 hex),
JDK 1.3 = 47 (0x2F hex),
JDK 1.2 = 46 (0x2E hex),
JDK 1.1 = 45 (0x2D hex).

资料来源:Java class file

JDK LTS 信息

  • JDK 17(LTS)
    • major version = 61
    • 积极支持:2026年9月30日
    • 安全支持:2029年9月30日
  • JDK 11(LTS)
    • major version = 55
    • 积极支持:2023年9月30日
    • 安全支持:2026年9月30日
  • JDK 8(LTS)
    • major version = 52
    • 积极支持:2022年3月31日
    • 安全支持:2030年12月31日

资料来源:

  • https://endoflife.date/java
  • https://www.oracle.com/java/technologies/java-se-glance.html

如果有什么建议或者问题可以随时联系我,共同探讨学习:

  • Github: likfe
  • CSDN:他叫自己Mr.张
  • 掘金:cafeting
  • 微博:cafeting

这篇关于Android cmdline-tools 版本与其最小JDK关系的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/278659

相关文章

常用的jdk下载地址

jdk下载地址 安装方式可以看之前的博客: mac安装jdk oracle 版本:https://www.oracle.com/java/technologies/downloads/ Eclipse Temurin版本:https://adoptium.net/zh-CN/temurin/releases/ 阿里版本: github:https://github.com/

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

poj 1287 Networking(prim or kruscal最小生成树)

题意给你点与点间距离,求最小生成树。 注意点是,两点之间可能有不同的路,输入的时候选择最小的,和之前有道最短路WA的题目类似。 prim代码: #include<stdio.h>const int MaxN = 51;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int P;int prim(){bool vis[MaxN];

poj 2349 Arctic Network uva 10369(prim or kruscal最小生成树)

题目很麻烦,因为不熟悉最小生成树的算法调试了好久。 感觉网上的题目解释都没说得很清楚,不适合新手。自己写一个。 题意:给你点的坐标,然后两点间可以有两种方式来通信:第一种是卫星通信,第二种是无线电通信。 卫星通信:任何两个有卫星频道的点间都可以直接建立连接,与点间的距离无关; 无线电通信:两个点之间的距离不能超过D,无线电收发器的功率越大,D越大,越昂贵。 计算无线电收发器D

poj 1734 (floyd求最小环并打印路径)

题意: 求图中的一个最小环,并打印路径。 解析: ans 保存最小环长度。 一直wa,最后终于找到原因,inf开太大爆掉了。。。 虽然0x3f3f3f3f用memset好用,但是还是有局限性。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#incl

hdu 1102 uva 10397(最小生成树prim)

hdu 1102: 题意: 给一个邻接矩阵,给一些村庄间已经修的路,问最小生成树。 解析: 把已经修的路的权值改为0,套个prim()。 注意prim 最外层循坏为n-1。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstri

poj 2175 最小费用最大流TLE

题意: 一条街上有n个大楼,坐标为xi,yi,bi个人在里面工作。 然后防空洞的坐标为pj,qj,可以容纳cj个人。 从大楼i中的人到防空洞j去避难所需的时间为 abs(xi - pi) + (yi - qi) + 1。 现在设计了一个避难计划,指定从大楼i到防空洞j避难的人数 eij。 判断如果按照原计划进行,所有人避难所用的时间总和是不是最小的。 若是,输出“OPETIMAL",若

poj 2135 有流量限制的最小费用最大流

题意: 农场里有n块地,其中约翰的家在1号地,二n号地有个很大的仓库。 农场有M条道路(双向),道路i连接着ai号地和bi号地,长度为ci。 约翰希望按照从家里出发,经过若干块地后到达仓库,然后再返回家中的顺序带朋友参观。 如果要求往返不能经过同一条路两次,求参观路线总长度的最小值。 解析: 如果只考虑去或者回的情况,问题只不过是无向图中两点之间的最短路问题。 但是现在要去要回