Android、Android Studio 和 Gradle 是如何使用 Java 的

news2025/4/20 4:44:51

目录

    • 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 的某些部分,并伴随着许多自定义修改和添加。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/468118.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ROS学习8:ROS机器人平台设计

【Autolabor初级教程】ROS机器人入门 1. 电机与电机驱动板 1.1 直流减速电机 电机主体通过输入轴与减速箱相连接,通过减速箱的减速效果,最终外端的输出轴会按照比例 (取决于减速箱减速比) 降低电机输入轴的转速,当然速度降低之后&#xff0…

effective c++ item35-39

item35:考虑虚函数的替代方案 NVI----Non-Virtual Interface 不使用虚函数接口,子类也可以实现按需求更改实现: The Strategy Pattern via Function Pointers 也可以使用函数指针 或者使用stl::function The “Classic” Strategy Pattern item…

手术麻醉信息管理系统源码,生成规范麻醉文书,自动信息采集

C#手麻系统源码,C# .net 桌面软件 C/S版手术麻醉信息管理系统源码 手术麻醉信息管理系统源码是专门为麻醉科和手术室开发的围手术期临床信息管理系统,具备以下功能: 1.规范手术流程管理:系统整合了手术室、麻醉科的工作及管理流程&#xff…

一则“孔乙己文学”,刺痛了多少学子的心?

个人主页:【😊个人主页】 孔乙已是鲁迅笔下人物,穷困流倒还穿着象征读书人的长衫,迁腐、麻木。最近,大家自我调佩是“当代孔乙己”,学历成为思想负担,找工作时高不成低不就。 文章目录 前言对待…

【C++技能树】再也不怕没有对象了 --初识类

Halo,这里是Ppeua。平时主要更新C语言,C,数据结构算法…感兴趣就关注我吧!你定不会失望。 目录 0. 初识类1.类的引入**在一个结构体里可以定义函数了:**定义一个Struct的时候再也不用写Struct了. 2.类的定义类的两种定义方式:成员…

05 【Sass语法介绍-插值】

1.前言 在很多编程器语言中都有插值这个概念,在 Sass 样式表的任何地方几乎都可以使用插值,你可以将这些包裹在 #{} 中来使用,所以记住在 Sass 中使用插值的方式是 #{} ,本节我们一起来看一下插值在 Sass 中的使用场景以及它的语…

Authing 入选《2022年度中国高科技高成长企业》榜单

​ 近日,Authing 入选【2022 年度中国高科技高成长企业系列榜单 】- 【云原生高成长企业榜】,该榜单由【第一新声】联合【天眼查】发起的“数字中国”系列之 2022 年度中国高科技高成长企业系列榜单发布,该榜单旨在发现和挖掘被资本市场关注&…

Sentinel介绍及搭建

分布式流量防护 服务雪崩 服务提供者不可用导致服务调用者也跟着不可用,以此类推引起整个链路中的所有微服务都不可用 分布式流量防护 在分布式系统中,服务之间的相互调用会生成分布式流量。如何通过组件进行流量防护,并有效控制流量&…

如何在 Mac 和 Windows 上恢复未保存或删除的 PDF

Adobe Acrobat PDF 是一种常用格式。我们可能会在不同的 PDF 编辑器中编辑和保存 PDF 文件。但是,如果不保存 PDF 文件或不小心将其删除,那将是一种令人不安的体验。 保持冷静!首先,尽可能多地停止运行应用程序,这样它…

( 哈希表) 217. 存在重复元素 ——【Leetcode每日一题】

❓217. 存在重复元素 难度:简单 给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true;如果数组中每个元素互不相同,返回 false 。 示例 1: 输入:nums [1,2,3,1] 输出:true…

工作7年的程序员,明白了如何正确的“卷“

背景 近两年,出台和落地的反垄断法,明确指出要防止资本无序扩张。 这也就导致现在的各大互联网公司,不能再去染指其他已有的传统行业,只能专注自己目前存量的这些业务。或者通过技术创新,开辟出新的行业。 但创新这…

go-zore入门,可能看这一篇就行了

本文主要内容 微服务框架对比goctl的安装和使用go-zore的api服务go-zore的rpc服务一探负载均衡的实现方法服务发现使用consul代替etcd实现服务发现中间件的实现相关代码已传送至gitee点击获取代码文中相关连接无跳转请点击查看原文 go微服务框架对比 参考文档 在 Go 语言中&…

AI | 浅谈AI技术以及其今后发展

文章概要 近期AI成为热点话题, GPT, new bing, bard,AI 绘画等 AI 编程工具引发大量讨论。请结合自身学习与工作经历,一起来聊聊你对AI技术以及其今后发展的看法吧。 🌟🌟🌟个人简介…

【VSCode】1、VSCode 如何连接服务器

文章目录 一、安装 remote-ssh 插件二、直接连接三、配置 SSH 公匙,免密登录 一、安装 remote-ssh 插件 点击插件搜索框,搜 remote-ssh,点击安装 安装完成后就会出现下面的图标: 二、直接连接 点击加号,输入 ssh 连接…

Web前端(更新中)

文章目录 什么是WEB前端HTMLHTML的简介运行环境和开发环境标签的语法结构页面的分类 常用标签head中常用标签body中的常用标签,特殊符号,语义化标签 什么是WEB前端 简单来说就是网页,由多种技术参与制作的,向用户展示的页面 技术…

Java 20和IntelliJ IDEA,一起让开发变得更轻松!

IntelliJ IDEA,是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具,尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能可以说是超常的。 相…

JavaScript 中函数 柯里化风格的运用

导语 当我第一次看见 柯里化 这个词语的时候,我也表现出一脸懵,在代码程序中,看见这种 “高大上”的一些词汇叫法的时候,下意识的会觉得这个概念很难很深奥,但是当冷静下来,去深究过后,就会发现…

Jetson 学习笔记(十六):使用SDK Manager烧录Jetson Nano

SDK Manager 前期准备开始安装 前期准备 安装VMware虚拟机,Ubuntu系统,VMware tools,然后在Ubuntu中安装Nvidia SDK Manager,最后进行烧录。 VMware、Ubuntu系统以及VMware tools:安装链接Nvidia SDK Manager&#x…

ArcGIS Pro数据

目录 1 数据模型 1.1 矢量数据 1.2 栅格数据 1.2.1 栅格数据用途 1.2.2 影像数据地理属性 1.2.3 影像分辨率 1.2.4 栅格波段 2 常用数据格式 2.1 CAD 2.1.1 CAD格式 2.1.2 CAD要素数据集 2.1.3 CAD要素数据集要素类 2.1.4 ArcGIS Pro支持的AutoCAD和MicroStation要…

为什么Web自动化测试需要掌握多种技能?看完就知道了

B站首推!2023最详细自动化测试合集,小白皆可掌握,让测试变得简单、快捷、可靠https://www.bilibili.com/video/BV1ua4y1V7Db 目录 1.编程语言 2.Web开发知识 3.自动化测试框架 4.版本控制系统 5.数据库基础知识 历史进程:…