Gradle 是 Android 现在主流的编译工具, 虽然在 Gradle 出现之前和之后都有对应更快的编译工具出现, 但是 Gradle 的优势就在于它是亲儿子, Gradle 确实比较慢, 这和它的编译过程有关, 但是现在的 Gradle 编译速度已经有了成倍提高. 除此之外, 相对其他编译工具, 最重要的, 他和 Android Studio 的关系非常紧密, 可以说对于一些简单的程序我们几乎不需要任何代码上的配置只使用 Android Studio 就可以完成编译和运行.
但是对于一些比较复杂的, 特别是多人团队合作的项目我们会需要一些个性化的配置来提高我们的开发效率. 比如我们要自定义编译出的 apk 包的名字, 对于一些特殊产品我们可能会要用同一个项目编译出免费版和付费版的 apk. 这些高级的功能都需要我们对配置代码进行自定义地修改.
最近伴随着 Android Studio2.0 的发布, Gradle 也进行了一次非常大的升级, 叫 Instant Run. 它的编译速度网上有人用逆天两个字来形容. 当我们第一次点击 run,debug 按钮的时候, 它运行时间和我们往常一样. 但是接下去的时间里, 你每次修改代码后点击 run,debug 按钮, 对应的改变将迅速的部署到你正在运行的程序上, 传说速度快到你都来不及把注意力集中到手机屏幕上, 它就已经做好相应的更改. 但是刚出来的似乎对一些项目的兼容性不太好, 现在升级后不知道怎么样.
为什么要了解命令行编译?
在很多情况下我们都是使用的 Android Studio 来 build,debug 项目. Android Studio 能满足我们开发的大多数需求, 但是某些情况下命令行能够让我们编译的效率更高, 过程更明朗, 一些高级的配置也需要熟悉命令行才能够使用, 比如在服务器编译, 某些项目初始化的时候如果直接交给 Android Studio , 它会一直 Loading, 你都不知道它在干嘛, 但是用命令行你就知道它卡在了哪个环节, 你只需要修改某些代码, 马上就能够编译过了.
了解 Gradle 之后我们可以做什么?
we can do everything what we want.
自定义编译输出文件格式.
hook Android 编译过程.
配置和改善 Gradle 编译速度
- Gralde Overview
- History
我们知道, Android 的编译过程非常复杂:
我们需要一种工具帮我们更快更方便更简洁地完成 Android 程序的编译. 现在结合 Android Studio 我们一般使用的工具都是 Gradle, 在 Gradle 出现以前 Android 也有对应的编译工具叫 Ant, 在 Gradle 出现之后, 也有新的编译工具出现, 就是 FaceBook 的 Buck 工具. 这些编译工具在出现的时候几乎都比 Gradle 要快, Gradle 之所以慢是跟它的编译周期有很大关系.
Gradle 的编译周期
在解析 Gradle 的编译过程之前我们需要理解在 Gradle 中非常重要的两个对象. Project 和 Task.
每个项目的编译至少有一个 Project, 一个 build.gradle 就代表一个 project, 每个 project 里面包含了多个 task,task 里面又包含很多 action,action 是一个代码块, 里面包含了需要被执行的代码.
在编译过程中, Gradle 会根据 build 相关文件, 聚合所有的 project 和 task, 执行 task 中的 action. 因为 build.gradle 文件中的 task 非常多, 先执行哪个后执行那个需要一种逻辑来保证. 这种逻辑就是依赖逻辑, 几乎所有的 Task 都需要依赖其他 task 来执行, 没有被依赖的 task 会首先被执行. 所以到最后所有的 Task 会构成一个有向无环图 (DAG Directed Acyclic Graph) 的数据结构.
编译过程分为三个阶段:
初始化阶段: 创建 Project 对象, 如果有多个 build.gradle, 也会创建多个 project.
配置阶段: 在这个阶段, 会执行所有的编译脚本, 同时还会创建 project 的所有的 task, 为后一个阶段做准备.
执行阶段: 在这个阶段, gradle 会根据传入的参数决定如何执行这些 task, 真正 action 的执行代码就在这里.
- Configuration
- BuildConfig
- Local dependencies
- File dependencies
- org.gradle.jvmargs=-Xms256m -Xmx1024m
- Reducing apk file
- Closure square = {
- it * it
- }
- square 16
- apply
- apply plugin:'com.android.application'
- project.apply([plugin: 'com.android.application'])
- dependencies
来源: http://www.jianshu.com/p/c286b979ced1