问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

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

创作时间:
作者:
@小白创作中心

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

引用
CSDN
1.
https://blog.csdn.net/lovecluo/article/details/141180131

在Android应用开发中,JDK(Java Development Kit)的配置是一个至关重要的环节。从Android Studio的运行环境到Gradle构建工具,再到Java和Kotlin代码的编译,每个环节都可能涉及不同的JDK版本。本文将详细解析Android开发中JDK配置的相关问题,帮助开发者更好地理解和应对实际开发中的挑战。


JDK关系图

Android Studio的JDK

"工欲善其事,必先利其器",Android Studio作为我们的开发利器,它的运行需要使用JDK环境。在运行Android Studio时,会按照以下顺序查找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。

Gradle使用的JDK版本

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

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

Android Studio中gradle的设置

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

gradleJVM的存储信息

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

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

报错信息

  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的范围,具体信息如下图:

Android支持的Java API的范围

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

写在最后

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

本文原文来自CSDN

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号