概述
Android Gradle 3.0.0插件是一个大版本的升级,对多个module带来了显著的性能提升。但同时也改变了一些此插件的行为,DSL和APIS。
升级到Gradle3.0.0会带来以下的性能提升:
- 由于构建per-call dexing提高了构建速度,每个类编译成独立的DEX文件,并且仅仅被修改的类重新编译。为了提高构建APK的速度,需要设置minSdkVersion到20,或者更低但使用 legacy multi-dex。
- 当改变依赖项时,Gradle通过不访问依赖项的API的module不重新编译的方式来提高构建速度。通过使用Gradle的新的依赖项的配置(implementation, api, compileOnly, and runtimeOnly),可以严格的控制依赖项的API的暴露。
升级
配置Gradle版本
Android plugin 3.0.0 要求Gradle4.1或者更高的版本。
需要在gradle-wrapper.properties文件中配置下列的内容:
distributionUrl=\
https\://services.gradle.org/distributions/gradle-4.1-all.zip
配置Android Gradle Plugin
如果使用Android Studio 3.0或者更新版本,会提示自动更新到最新版本的Android plugin。对于手动更新工程,在工程级下的 build.gradle
配置如下的内容。
buildscript {
repositories {
...
// You need to add the following repository to download the
// new plugin.
google()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.0'
}
}
NOTICE:
对于多模块和复合构建,如果Android插件每次构建不止一次加载,则可能会出现构建错误,可以查看常见错误进行修复。
新的依赖配置接口
问题描述
要理解旧的Gradle插件2.0构建系统的局限性,请考虑以下具有多层模块的项目:
看最底层的模块,基本上可以做出两种不同的改变:
- Implementation change: 内部实现改变,不修改模块的外部接口
- Application binary interface (ABI) change: 修改模块的外部接口
Note: 在下面的图形中,重新编译的模块将会以红色高亮
Implementation change
由于模块的外部接口不变,Gradle将只重新编译该模块。所有的引用的模块都将保持不变。
在这种情况下没问题。
ABI change
当外部模块的接口改变,那引用此模块的module也需要重新编译。
但是这些模块可能直接通过自己的接口暴露底层模块的一部分!所以为了完全安全,还需要重新编译。
因此,Gradle将有效地需要重新编译所有模块。
现在我们遇到了一个很大的问题:一个代码更改导致所有模块被重新编译。造成这种情况的根本原因是Gradle不知道是否通过另一个模块泄漏了此模块的接口。
Android Gradle插件3.0的修改
最新的Android Gradle 3.0插件要求您明确定义是否泄漏模块的接口。基于此来判断是否重新编译。
因此 compile</