授课语音

Gradle在构建阶段做了什么?

Gradle 是 Android 项目的主要构建工具,它通过自动化构建流程来帮助开发者高效地编译、打包、测试和发布应用。Gradle 在构建过程中完成了多个步骤,每个步骤都会影响最终 APK 的生成。以下是 Gradle 在构建阶段的主要工作流程:

1. 初始化阶段

在 Gradle 构建开始时,首先会进入初始化阶段,这个阶段主要是初始化一些必要的环境和设置:

  • 解析构建脚本:Gradle 会解析项目中的 build.gradle 文件,确定需要执行的任务和依赖项。
  • 初始化项目:Gradle 会加载所有的子项目(如多模块项目)并建立项目的构建模型。

2. 配置阶段

在初始化阶段之后,Gradle 会进入配置阶段,这个阶段主要是设置构建的所有配置项。Gradle 会为每个项目执行构建脚本,评估项目的构建参数,并将其应用到构建过程中。

  • 构建脚本评估:Gradle 会读取 build.gradle 文件,并计算所有的任务和配置。这包括依赖项、构建类型、构建变体等。
  • 任务创建:Gradle 根据项目的需求创建构建任务。每个任务代表一个构建步骤,如编译、测试、打包等。

在此阶段,Gradle 会解析所有的构建配置,如 android {} 块中的 SDK 版本、签名配置、依赖项等,最终生成一个任务图。

3. 执行阶段

执行阶段是 Gradle 实际执行构建任务的阶段。在此阶段,Gradle 根据之前的任务图开始执行任务,完成项目的构建工作。执行过程中的主要任务包括:

1. 依赖解析和下载

Gradle 会解析项目中声明的依赖项(如库、插件等),并从远程仓库(如 Maven Central、JCenter)下载缺失的依赖项。

  • 解析项目依赖:Gradle 会根据 dependencies 块中的定义,解析所有需要的外部库和模块依赖。
  • 依赖缓存:Gradle 会将下载的依赖项缓存在本地,以避免每次构建都重新下载。
  • 冲突解决:如果不同模块依赖了相同的库的不同版本,Gradle 会根据一定的规则(如选择最新版本)解决依赖冲突。

2. 源码编译

Gradle 会将 Java 或 Kotlin 源代码编译成字节码。具体过程如下:

  • 编译 Java/Kotlin 代码:Gradle 会调用相应的编译器(如 javackotlinc)将 src/main/javasrc/main/kotlin 下的源代码编译成 .class.kt 字节码文件。
  • 生成中间文件:每个模块的源代码会被编译成 .class 文件,这些文件会存放在 build/intermediates/classes 目录中。

3. 资源编译和优化

Gradle 会处理应用程序中的所有资源文件,并将其转化为合适的格式:

  • XML 文件编译:Gradle 会将 XML 布局文件、字符串资源文件、样式文件等编译为二进制格式。
  • 图像资源优化:Gradle 会优化应用中的图像资源(如 PNG、JPEG 格式),并根据设备的屏幕密度进行优化,生成多种分辨率的资源文件。
  • 资源合并:Gradle 会合并所有模块的资源,并确保最终 APK 包含所有需要的资源。

4. 构建 DEX 文件

Gradle 会将编译后的 Java 字节码转化为 DEX(Dalvik Executable)文件,供 Android 设备上的 ART 或 Dalvik 虚拟机执行:

  • D8 编译器:从 Java 字节码编译到 DEX 字节码的工作由 D8 编译器完成。它会将 .class 文件转化为 .dex 文件。
  • 多 DEX 支持:如果生成的 DEX 文件过大,Gradle 会将其分割成多个 DEX 文件,这对于大型应用尤其重要。

5. AndroidManifest.xml 合并

Gradle 会合并各个模块的 AndroidManifest.xml 文件:

  • 主清单文件:通常每个模块(如应用模块和库模块)都有自己的 AndroidManifest.xml 文件。Gradle 会将这些文件合并成一个主清单文件,最终的 AndroidManifest.xml 会包含所有模块的清单信息。
  • 合并过程中的冲突解决:如果不同模块的 AndroidManifest.xml 文件中存在冲突(如相同的权限声明),Gradle 会根据一定的规则(如优先使用应用模块的声明)进行冲突解决。

6. 签名 APK

Gradle 会根据配置文件对 APK 文件进行签名:

  • 调试签名:在开发过程中,Gradle 会自动使用默认的调试证书进行签名。
  • 发布签名:在发布版本时,开发者需要提供自己的密钥库(keystore)来进行 APK 的签名。

7. 打包 APK

Gradle 会将所有的编译结果和资源打包成 APK 文件:

  • 生成 APK:Gradle 会将 .dex 文件、资源文件、清单文件等合并,生成最终的 APK 文件。
  • 优化 APK:Gradle 会对 APK 进行优化(如资源压缩、删除无用资源等)以减小 APK 的体积。

8. 多渠道打包

对于需要发布多个渠道的应用,Gradle 支持多渠道打包。在构建过程中,Gradle 会根据不同的构建变种(如不同的版本号、不同的图像资源等)生成不同的 APK 文件。

4. 总结

Gradle 在 Android 构建过程中的主要作用是自动化所有步骤,包括源码编译、资源处理、依赖解析、APK 打包和签名等。构建过程的每个阶段都会影响最终生成的 APK 文件,因此合理的配置和优化对于提高构建效率和确保应用的质量至关重要。

去1:1私密咨询

系列课程: