在Android项目的构建中,成功构建项目需要依赖一些工具和库,Google官方针对这种工具和库的项目依赖关系进行了如图所示的梳理。
本地旨在更进一步结合实际应用开发的经验来进行说明,算是对官方文档的一个补充,也方便自己以后回顾这部分的内容。
依赖工具
工具 | 说明 |
---|---|
Gradle | Gradle 构建工具,用于读取 build 文件并生成应用或库,还会公开 API 以供插件扩展其功能。Gradle 会在一个或多个 Java 虚拟机上运行多个进程,并且其 Java 插件会调用 JDK 中的 Java 工具。 |
Gradle Plugins | Gradle 插件通过定义新任务和配置来扩展 Gradle。将插件应用于 build 可启用特定的 build 功能,这些功能会在 build 脚本中配置为数据。对于 Android build,最重要的 Gradle 插件是 Android Gradle Plugin (AGP)。 |
Compilers | Kotlin 或 Java 编译器会将源代码转换为可执行的字节码。Kotlin 编译器公开了一个插件 API,可让外部分析和代码生成直接在编译器内运行,从而访问解析的代码结构。 |
Compiler Plugins | 在 Kotlin 编译器分析代码时,编译器插件会在 Kotlin 编译器内执行分析和代码生成操作,并且在您将其 Gradle 插件应用于 build 时进行安装。 |
Android SDK | Android SDK 包含特定 Android 版本的 Android 平台和 Java API,以及相应的工具。这些工具可帮助您管理 SDK、构建应用,以及与 Android 设备通信和对其进行模拟。 每个版本的 Android SDK 都提供您的源代码可以访问的特定 Java API,并提供脱糖支持,以便在较低版本的 Android 上使用这些 API。 |
JDK | Java 开发套件,包含用于编译 Java 源代码和运行 Java 应用的 Java 库和可执行文件。Android build 中有多种 JDK 在发挥作用。如需了解详情,请参阅 Android build 中的 Java 版本。 |
如图所示,Gradle Plugin: AGP
(Android Gradle Plugin) 、KGP
(Kotlin Gradle Plugin) 、KSP
(Kotlin Symbol Processor) 以及 Compose
(Jetpack Compose插件) 等都是依赖 Gradle
所提供的API开发的插件。
Android对Kotlin的支持,主要是通过 Kotlin Compiler Plugin
进行扩展,支持如 Jetpack Compose 以及 KSP 的插件,这部分都依赖于 Kotlin Compiler。
编译打包流程
Android项目的源码在编译的过程中,通过配置编译工具和插件生成目标代码。项目源码的编译主要依赖以下内容:
- Gradle工具及插件
- Library 三方依赖库
- Android SDK
如图所示,通过编译插件将代码和依赖库进行编译,为了更直观的了解这部分的编译依赖关系,可以参考如下的编译流程:
在Android编译的过程中,编译器将应用的源码和资源文件进行编译和打包,最终通过Gradle插件进行签名,详细的流程如下:
上图属于Android应用编译的基础流程,如果你已经开始使用 Kotlin
和 Jetpack Compose
开发Android应用,那么对应的 Gradle Plugin 中则会增加关于 Kotlin Compiler
以及 Compose
相关的插件配置。
Gradle构建Tips
使用本地构建缓存
使用本地构建缓存通过重用其他构建产生的输出来节省时间。构建缓存可以检索您已创建的任何早期构建的输出。
在 Gradle 文档 中了解更多有关其构建缓存的信息。
使用配置缓存
使用配置缓存通过缓存配置阶段的结果并重用于后续构建来显著提高构建性能。如果 Gradle 检测到构建配置或相关依赖没有变化,它将跳过配置阶段。
优化多个目标的构建时间
当多平台项目包含多个目标时(比如Android和iOS),像 build
和 assemble
这样的任务可以为每个目标多次编译相同的代码,导致编译时间更长。
如果你正在积极开发和测试特定平台,请运行相应的 linkDebug*
任务。
比如,通过下面的配置,可以减少编译 iOS 平台的耗时,你只需要编译 iosArm64
目标的产物即可,避免编译如iosSimulatorArm64
或者iosX64
这种减少编译耗时。
更多信息,请参阅提高编译时间。
从kapt
迁移到KSP
如果您正在使用依赖于 kapt 编译器插件的库,请检查是否可以切换到使用 Kotlin 符号处理(KSP)API。KSP
API 通过减少注解处理时间来提高构建性能。与 kapt
相比,KSP
更快、更高效,因为它直接处理源代码而不生成中间 Java
存根。
关于迁移步骤的指导,请参阅谷歌的迁移指南。
了解 KSP
与 kapt
相比的优势,请查看为什么选择 KSP。