学新通技术网

【Gradle 学习】(四)Gradle 在 Android 中的应用

juejin 7 1
【Gradle 学习】(四)Gradle 在 Android 中的应用

前言

Android 是基于 Gradle 完成应用构建的,前面学习了很多 Gradle 的基础知识,从这里开始逐步深入学习在 Android 中 Gradle 都做了些什么。最好的参考文档就是Andorid 的 Gradle Plugin 说明文档了,所以也根据这里开始学习剖析。

1. 构建文件

一个简单的 Android Gradle 项目的 build.gradle 如下

buildscript {
    repositories {
      jCenter() 
    }
    dependencies {
        classpath "com.android.tools.build:gradle:4.1.3"
    } 
}
apply plugin: 'com.android.application'

android {应用
    compileSdkVersion 23
    buildToolsVersion "23.1.0"
}

buildscript { ... } 配置了用于驱动构建的代码。上述代码声明了项目使用 jCenter 仓库,并且 声明了一个 jCenter 文件的 classpath。该文件声明了项目的 Android Gradle 插件版本为 4.1.3。

接着,使用了 com.android.application 插件。该插件用于编译 Android 应用。

最后,android { ... } 配置了所有 android 构建所需的参数,这也是 Android DSL 的入口点。

重要: com.android.application 插件不能与 java 插件同时使用,否则会导致构建错误。

注意: 你需要在相同路径下添加一个 local.properties 文件,并使用 sdk.dir 属性来设置 SDK 路径。或通过设置 ANDROID_HOME 环境变量来设置 SDK 路径。这两种方式都是 一样的,根据喜好选择其中一种。 local.properties 文件示例:

sdk.dir=/path/to/Android/Sdk

2. 项目结构

Gradle 遵循约定优于配置的概念,Gradle 的构建文件中有默认的文件夹结构。最基本的项目有两个 “source set” 组件,分别存放应用代码和测试代码。他们分别位于:

  • src/main/
  • src/androidTest/

里面每个存在的文件夹对应响应的源组件,对于 Java plugin 和 Android plugin 来说,他们的 Java 代码和资源文件路径如下:

  • java/
  • resources/

对于 Android plugin 来说,它还拥有以下特有的文件和文件夹结构:

  • AndroidManifest.xml
  • res/
  • assets/
  • aidl/
  • jni/

这就意味着在 Android plugin 下 *.java 文件的 source set 路径是 src/main/java ,而 manifest 则是 src/main/AndroidManifest.xml

我们之前提到过 Gradle 的一个优点,不仅约定了项目结构,而且约定灵活,当默认的项目结构不适用是,也可以自定义配置,后面再学习。

3. 构建任务

添加一个 plugin 到构建文件中会自动创建一些列构建任务

Gradle 属于任务驱动型构建工具,构建过程基于 Task

Java 插件和 Android 插件都会创建以下Task:

  • assemble 组合项目所有输出任务
  • check 执行所有检查任务
  • build 执行 assemble 和 check 两个 task 的所有工作
  • clean 会清空项目的输出

实际上 assemblecheckbuild 这三个 task 不做任何事情。它们只是一个 Task 标志,用来告诉 plugin 添加实际需要执行的 task 去完成这些工作,当我们执行这样的任务的时候同时执行与其依赖的任务。

在命令行环境中,你可以执行以下命令来获取更多高级别的 task:

gradle tasks

查看所有 task 列表和它们之间的依赖关系可以执行以下命令:

gradle tasks --all

注意:Gradle 会自动监听 task 声明的输入和输出。 多次执行 build task 并且期间项目没有任何改动,Gradle 将会提示所有 task UP-TO-DATE ,这意味着不需要再做任何编译工作。这允许 task 之间互相依赖,而不需要额外的构建操作。

3.1 Android Tasks

Android plugin 使用相同的约定以兼容其他插件,并且附加了标志性的 task,包括:

  • assemble 组合项目所有输出
  • check 执行所有检查
  • connectedCheck 在一个连接的设备或者模拟器上执行检查,它们可以在所有连接的设备上并行执行检查
  • deviceCheck 通过 APIs 连接远程设备来执行检查,主要用于CI(Continuos integration ,持续集成)服务上
  • build 执行 assemblecheck 的所有工作
  • clean 清空项目的输出

这些新的标志性 task 是必须的,以保证能够在没有设备连接的情况下执行定期检查

assemble

一个 Android 项目至少拥有两个输出:debug APK 和 release APK。每个输出都有各自的标志性 task 以便单独构建它们。如果有其他的构建类型也会有对应的任务。

  • assemble

    • assembleDebug
    • assembleRelease

它们都依赖于其它一些 tasks 以完成构建一个APK所需的多个步骤。其中 assemble task 依赖于上述两个 task,所以执行 assemble 将会同时构建出两个 APK。

check

check task 也有拥有依赖:

  • check

    • lint
  • connectedCheck

    • connectAndroidTest
  • deviceCheck

    • 进行测试时才会触发

最后,只要可被安装(需要签名),插件会为所有的构建类型(debug, release, test)创建

install 及 uninstall 相关的 task。例:

  • installDebug

  • installRelease

  • uninstallAll

    • uninstallDebug
    • uninstallRelease
    • uninstallDebugAndroidTest

3.2 查看 Android Gradle 任务

使用 ./gradlew task 来查看当前项目完成了哪些 Gradle任务

Gradle 和 Android 插件可以完成以下编译配置

App$ ./gradlew task
 
Task :tasks
​
------------------------------------------------------------
Tasks runnable from root project (所有从项目根目录可运行的任务)
------------------------------------------------------------
​
Android tasks(Android 任务)
-------------
androidDependencies - 显示 Android 依赖
signingReport - 显示每个版本的签名信息
sourceSets - 打印这个项目中定义的 source 集合
​
Build tasks(构建任务)
-----------
assemble - 编译并打出应用程序所有变种版本的包.
assembleAndroidTest - 编译并打出所有测试应用的包.
assembleDebug - 编译并打出Debug版本的包.
assembleRelease - 编译并打出Release版本的包.
build - 执行所有检查并编译打包.
buildDependents - 检查所有的依赖并编译打包.
buildNeeded - 检查所有的依赖并编译打包.
clean - 删除构建目录.
cleanBuildCache - 删除构建缓存目录.
compileDebugAndroidTestSources
compileDebugSources
compileDebugUnitTestSources
compileReleaseSources
compileReleaseUnitTestSources
​
Build Setup tasks (构建设置任务)
-----------------
init - 被始化一个新的Gradle构建
wrapper - 生成 Gradle wrapper文件.
​
Cleanup tasks
-------------
lintFix - Runs lint on all variants and applies any safe suggestions to the source code.
​
Help tasks
----------
buildEnvironment - 显示项目根目录中声明的所有构建脚本的依赖.
components - 显示项目根目录产生的组件
dependencies - 显示并洞察项目根目录中一个特殊的依赖关系
dependencyInsight - 显示并洞察项目根目录中一个特殊的依赖关系.
help - 显示帮助信息
model - 显示项目根目录的配置模型.
projects - 显示项目根目录中的子项目.
properties - 显示项目根目录的属性.
tasks - 显示从项目根目录可以运行的任务(有些显示的任务可能属于子项目)
​
Install tasks(安装任务)
-------------
installDebug - 编译打包并安装Debug版本的包.
installDebugAndroidTest - 编译打包并安装Debug版本的测试包到设备上
uninstallAll - 卸载所有版本的包.
uninstallDebug - 卸载Debug版本的包.
uninstallDebugAndroidTest - 从设备上卸载Debug版本的Android测试包
uninstallRelease - 卸载Release版本的包.
​
Verification tasks(验证任务)
------------------
check - 运行所有检查.
connectedAndroidTest - 在已连接的设备上安装所有flavors(渠道包)并运行instrumentation测试
connectedCheck - 在当前已连接的设备上运行设备检测.
connectedDebugAndroidTest - 在已连接的设备上安装并运行Debug版本的测试.
deviceAndroidTest - 在所有提供的设备上安装并运行instrumentation测试.
deviceCheck - 在所有提供的设备和测试服务器上运行设备检测.
lint - 在所有变种版本上运行lint检测.
lintDebug - 在Debug版本上运行lint检测.
lintRelease - 在Release版本上运行lint检测.
test - 在所有变种版本上运行单元测试.
testDebugUnitTest - 在Debug版本上运行单元测试.
testReleaseUnitTest - 在Release版本上运行单元测试.
​
To see all tasks and more detail, run gradlew tasks --all
​
To see more detail about a task, run gradlew help --task <task>

3.3 执行 Gradle 任务

执行 Gradle 任务的命令是

gradle 任务名称

或使用 gradle wrapper

./gradlew 任务名称

比如执行 打包任务(assemble)

gradle assemble

会把配置的所有构建类型(Build Types)全部打出来,默认构建类型是 Debug 和 Release,因此会 assemble 至少会执行两个任务 assembleDebugassembleRelease

如果有其他构架类型,任务名称是 assemble+构建类型名

参考

Gradle Plugin 使用手册

本文出至:学新通技术网

标签: