你不会到现在还不知道 Android 中的那些 JDK 配置吧?

在做 Android 应用开发时,不可避免的要使用到 JDK 。在众多版本的 JDK 中, 项目代码的编译会使用哪个版本,开发者要如何指定使用的 JDK  版本?选择和指定 JDK 是一个非常重要的步骤,它会影响整个开发过程。

不论你的源码是用  Java 还是 Kotlin 进行编写的,或者是两者皆用。在整个项目开发迭代周期中,都会有很多地方涉及到  JDK 版本,如下图所示,我们可以看到其中错综复杂的关系。

708741d908aa214eaec4138b202ff861.png
JDK 关系图

Android Studio 的 JDK

「工欲善其事,必先利其器」, Android Studio 是我们的开发利器,它的运行需要使用 JDK 环境。在运行 Android Stduio  的时候, 会按照以下顺序去查找 JVM  运行时环境:

  1. STUDIO_JDK: 环境变量配置 JDK 路径,官方不建议配置

  2. studio.jdk:与 Android Studio 打包在一起, 在 Android Studio 的目录下(PS:我没有找到)

  3. JBR: JetBrains Runtime, 与 Android Studio 打包在一起,在新版本的安装目录下有这个文件夹。官方推荐使用这个版本,Android Studio 是在这个版本下进行测试的,并且可能还存在一些特殊的优化用于支持 Android Studio 的某些增强功能。

  4. JDK_HOME: 环境变量

  5. JAVA_HOME:环境变量

  6. PATH:在 PATH 环境变量中指定的 java 可执行文件

只要你没有配置 STUDIO_JDK 环境变量,当前 Android Studio 默认应该都是使用 JBR 中的 Java

d68c603d76f124371a30015451ba749d.png
Android Studio 目录下的 JBR 文件夹

Gradle 使用的 JDK 版本

Android 应用程序进行编译时,都会使用 Gradle 进行编译。基于 Android Studio 有两种方式可以编译 Android 应用程序:

  1. 在 Android Studio 中直接点  ▶︎ 运行

这两种运行方式,使用的 JDK 版本可能会存在不一致的情况。点  ▶︎ 运行时,是使用 Android Studio 中设置的值 JDK 来运行:

b934d2ca13308b386f188e80b8cae2b1.png

Android Studio 中 gradle 的设置

在默认情况下,会直接使用 jbr 的版本。当然,你也可以手动配置为 JAVA_HOME 或者是 GRADLE_LOCAL_JAVA_HOME。这个地方的配置最终会存储到 .idea/gradle.xml 文件中去,在 Android Studio 启动时会去读取这个文件。

e72d72ff85ecb07edd3fda41f66a1fbc.png

gradleJVM 的存储信息

关于 Gralde JDK 的配置,官方建议使用 GRADLE_LOCAL_JAVA_HOME 配置,这个宏定义会优先使用在 properties 文件中定义的 java.home 变量,如果没找到会使用 JBR。

需要注意的是, 这个 JDK 除了用于 Gradle 本身运行以外,还会用于我们自定插件以及包含在 buildSrc 下面的代码编译与运行。例如我们在使用 Android Gradle Tools 的版本为 8.x 时,此时就需要将 JDK 设置成 17 及以上的版本,否则就会编译报错 :

a90161d9c8dbb2af1a2e66f451e9c2ef.png
报错信息
  1. 在 Terminal 终端使用命令进行运行

这种方式就行简单了,因为运行是在终端,则会直接使用环境变量中定义的 JAVA_HOME 来运行。

如果在编译的时候,使用了不用的 JDK 版本或者是 Gradle 版本, 会导致创建更多的守护进程,因此也会占用更多的 CPU 和内存

Java 与 Kotlin 中 JDK 的配置

在进行 Java 源代码编译时,默认情况下,会直接使用 Gradle 所用的 JDK 版本。但在不同的环境中,可能使用的 JDK 版本存在不一致,我们可以通 Gradle 提供的 toolchain 来指定 JDK 的版本, 如果不存在,会直接下载配置中的版本:

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(17)
    }
}

在不同的 Java 版本中,会存在不同的语法,比如 lambda 表达式只能在 Java 1.8 的版本及以上版本使用, 同时, Java 中还有一些功能是需要特定的库进行支持的。因此,我们可以通过 sourceCompatibility 指定使用 Java 的版本, 来保证源代码编译期间可以进行正常编译。

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_17
    }
}

同时,在执行编译时,还可以指定输出的 class 文件使用哪个版本的文件格式。针对 Java 代码,使用 targetCompatibility 字段进行指定,而 Kotlin 使用 jvmTarget 字段进行指定。

android {
    compileOptions {
        targetCompatibility JavaVersion.VERSION_17
    }
    kotlinOptions {
        jvmTarget '17'
    }
}

在 Android 中可以调用哪些 Java API ?

代码除了在编译时需要关注 JDK 版本,在运行时也需要关注代码中使用的 Java API 。虽然在写代码的时候,使用的是 Java 的语法,但其运行时并不是 JVM , 因此有一些 Java 的 API 在 Android 中并无法运行。在 Android  SDK 中,定义了很多 Java 库函数实现的 API ,在绝大多数时后,开发者根本感知不到它的区别。我们可以通过 compileSdk 来指定当前 Andorid 项目支持的 Java API 的范围,具体信息如下图:

2951730aa07026e2eeb7cee4e7183d13.png
Android 支持的 Java API 的范围

Android  项目中除了配置 compileSdk , 还需要配置 minSdk 指定当前 APP 运行的最低手机版本,当代码中使用了高版本中方法(如 String.isBlank()  等 JDK 11 才提供的),就会导致低版本无法使用。此时为了兼容,R8 在编译的过程中,会对代码进行脱糖处理,将其转换成低版本就可用的代码。

写在最后

JDK 是在代码开发过程中经常会遇到的配置,如果版本不对,搞不好就会出现一些莫名其妙的错误,了解编译运行过程中的 JDK 版本,有助于更好地解决实际开发中遇到的问题。

  • 14
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值