目录
- Java平台
- JRE
- 虚拟机
- JDK
- Android Studio 如何使用 Java
- Gradle 如何使用 Java
- Android Gradle 插件
- 从命令行执行 Gradle 构建
- Android 设备上是如何使用 Java 的
可以肯定地说,每个人都知道 Android 使用 Java。然而,“使用 Java ”的含义范围相当大。因此,在本文中,我将介绍 Android 设备和我们用于 Android 开发的各种工具是如何使用 Java 平台的。
让我们从结论开始——下图显示了 Java 在 Android 生态系统中的作用:
Java平台
使用 Java 编程语言编写代码的开发人员通常简称为 “Java”,因此很自然地认为 Java 就是:一种编程语言。但是,你可能知道,Java 源代码在其原始形式下是不可执行的。首先,你需要将其转化为所谓的字节码,然后使用专门的工具在目标设备上执行字节码。因此,语言本身只是更大工具链的一部分。该工具链称为 Java 平台。
Java 平台最重要的部分是所谓的 “JVM 编程语言”(Java、Kotlin、Scala 等)、JRE、JDK 和 JVM。
JRE
JRE 代表 Java 运行时环境。要了解它的作用,假设您有一个成熟的 Java 应用程序并且您想要运行它。由于 Java 的设计理念是“一次编写,随处运行”,因此您应该能够在许多不同的环境中运行 Java 程序。这是一个非常好的特性,但是这种灵活性是有代价的:你不可能只在“本地”运行 Java 应用程序。相反,你可能需要在其他人的目标机器上安装 JRE,然后使用该软件来执行你的 Java 应用程序。简而言之:JRE 是运行 Java 程序所需要的一套工具。
一般来说,JRE 内部包含的主要工具是类库、类加载器和 JVM。类库和类加载器我就不多说了(如果你好奇它们是干什么的可以上网搜索),但是 JVM 在 Java 世界中是一个非常突出的概念,所以我们也需要讨论一下。
虚拟机
JVM 代表 Java 虚拟机。该组件执行 Java 字节码并抽象出(即“隐藏”)主机设备上安装的硬件和操作系统的细节。在某种意义上,你可以将 JVM 视为独立于平台的 Java 字节码与特定于平台的硬件和软件之间的适配器。换句话说,JVM 是允许 Java 字节码与平台无关的组件。
JDK
现在你明白了你需要 JRE 才能在主机设备上运行 Java 应用程序。然而,要开发这些应用程序,您需要特殊的开发工具来将 Java 源代码(java文件)转换为可执行的字节码类(class文件)、库和成熟的应用程序。由于大多数用户永远不会开发应用程序,因此将这些开发工具包含到 JRE 中没有任何意义。输入 Java 开发工具包 (JDK)。
JDK 是一个软件包,其中包括 JRE 和可用于开发 Java 应用程序的其他工具。
概括地说,Java 平台的不同组件之间的关系可以描述如下:
请注意,上图非常笼统,实际上,所有这些实体都是非常复杂的软件。
Android Studio 如何使用 Java
Android Studio 是 JetBrains 的 IntelliJ IDE 的定制版本,后者又是一个 Java 应用程序。因此,正如我们所确定的那样,要在您的计算机上启动 IntelliJ(以及随后的 Android Studio),您需要安装 JRE。但是,如果您下载并安装 Android Studio,即使没有 JRE,您也可以启动它。怎么会?
事实证明,JetBrains 的人决定让他们的用户更简单地安装 IntelliJ,因此他们将整个 JRE 打包在一起。因此,当您安装 IntelliJ(或 Android Studio)时,它也会安装自己的 JRE。在 IntelliJ 中,有一个选项可以将默认 JRE 更改为其他内容(操作名称:为 IDE 选择 Boot Java Runtime),但 Android Studio 维护人员决定摆脱它,因此您只能使用捆绑选项。在我看来,这没关系。
但是,正如我们所讨论的,如果要编译 Java 源代码,则需要 JDK,而不仅仅是 JRE。幸运的是,Android Studio 也可以解决这个问题。如果我打开 Project Structure 对话框并转到 SDK Location 选项卡,我会在底部看到这个下拉菜单:
就像 JRE 一样,Android Studio 自带了一个 JDK,也就是捆绑了自己的 JDK 并默认使用它。由于某种原因,该目录被称为 “jre”,但别担心——它包含一个完整的 JDK,它的名字并不重要。
但是请注意,上述下拉菜单的标题表示所选的 JDK 将由 Gradle 使用,而不是 Android Studio。那么,让我们谈谈 Gradle。
Gradle 如何使用 Java
Gradle 是一个构建工具。它以一段源代码作为输入,然后执行一个“构建”流程,将源代码转换成其他东西。在构建流程中,Gradle 通常会使用额外的第三方工具,因为它不知道如何自行处理源代码。从某种意义上说,您可以将 Gradle 视为构建过程的编排器:它不会自己完成工作,但它知道流程中的所有步骤,也知道谁负责执行这些步骤中的每一个.
在 Android 开发的背景下,Gradle 的主要作用是将源代码和相关资源分别转换为应用程序和库的 APK 和 AAR 存档。
从根本上说,Gradle 也是一个 Java 应用程序,因此您需要安装 JRE 才能运行它。但是,当您使用 Gradle 构建以 JVM 语言(Java、Kotlin、Scala 等)编写的源代码时,JRE 是不够的,Gradle 需要完整的 JDK。这就是为什么您必须在 Android Studio 中为 Gradle 指定 JDK 位置。
正如我们在上一节中已经讨论过的,Android Studio 自带默认使用的 JDK。因此,在实践中,您无需安装自己的 JDK 即可从 Android Studio 中执行构建流程(除非您有特殊原因更改默认设置)。
Android Gradle 插件
由于我已经提到了 Gradle,让我们也讨论一下 Android Gradle Plugin (AGP)。
首先,考虑官方 Gradle 文档中的描述:
Gradle 的核心是有意为现实世界的自动化提供很少的东西。所有有用的功能,如编译 Java 代码的能力,都是由插件添加的。插件添加新任务(例如JavaCompile)、域对象(例如SourceSet)、约定(例如 Java 源代码位于src/main/java)以及扩展核心对象和来自其他插件的对象。
换句话说,Gradle 仅提供用于自动化的高级脚手架,并假定特定目标的构建流程将由插件实现。一些插件由 Gradle 团队维护,而另一些则来自第三方开发人员。
AGP 是一个用于 Android 开发的 Gradle 插件。它由 Google 维护,其发布节奏与 Android Studio 的发布同步。此外,作为一般规则,较新版本的 AGP 不向后兼容较旧版本的 Gradle(即,如果您想迁移到较新的 AGP,您可能还需要迁移到较新的 Gradle)。
总而言之,AGP 是 Google 开发的一个插件,可以使用 Gradle 构建 Android 应用程序。
从命令行执行 Gradle 构建
在某些情况下,您可能希望从命令行而不是 Android Studio 执行 Gradle 构建。要完成此任务,您需要调用gradlew.bat(Windows) 或gradlew(Mac 和 Linux)脚本。
例如,如果您在 Mac 上并且想要构建应用程序的调试版本,则可以使用以下命令(假设您没有任何风格):
./gradlew assembleDebug
现在,还记得我们之前讨论过的 Android Studio 中的 JDK 位置设置吗?如果您从命令行构建,它没有任何效果。事实上,您甚至不需要安装 Android Studio 即可从命令行执行 Gradle 构建。这对于在持续集成服务器上构建工件非常有用,但这也意味着现在您有责任告诉 Gradle 它可以在哪里找到 JDK。
定义一个名为 JAVA_HOME 的环境变量并将其值设置为机器上 JDK 安装目录的位置是一种普遍的约定。幸运的是,Gradle 知道这个约定。因此,要从命令行调用 Gradle 构建,您只需正确设置 JAVA_HOME,Gradle 就会选择它。如果您在特定机器上同时从 Android Studio 和命令行构建,建议确保 Android Studio 中的 JDK 位置设置和 JAVA_HOME 指向同一个位置。这样,无论从何处启动构建,您都将使用相同的 JDK。
Android 设备上是如何使用 Java 的
有趣的是,尽管我们使用 JVM 编程语言编写 Android 应用程序,但实际上并没有运行在 Android 设备上的 Java 平台。至少不是正式的。要了解这方面的内容,我们需要追溯历史,追溯 Android 平台的根源。
Google 在开发 Android 时,决定以 Java 平台为基础。然而,出于法律方面的考虑,谷歌没有采用“适当的 Java”,而是决定基于 Java 平台并根据他们的需要进行修改。由于这种方法,Android 设备上没有 JVM。相反,Google 使用了所谓的 Dalvik 虚拟机 (DVM),后来被 Android Runtime (ART) 取代,简单来说 Android 设备上并没有 JDK 来运行java开发的应用,而是使用 Android Runtime (ART) 来来运行java 开发的应用的。
除了使用不同的虚拟机外,Google 还在 Android 内部重新实现了许多标准 Java API,以允许开发人员在编写 Android 应用程序时使用这些熟悉的结构(例如 ,java.lang.等java.util.)。后来,在 Android 7 中,Google 决定将 OpenJDK 合并到 Android 中,并用 OpenJDK 的版本替换 Java API 的自定义重新实现。然而,Android中仍然没有JVM。
底线是,从形式上讲,Android 设备内部没有 Java 平台。Google 决定使用 Java 的某些部分,并伴随着许多自定义修改和添加。