长期以来困扰咱们的一个问题就是构建速度,AndroidStudio 的构建速度严重影响 Android 开发者的工做效率,尤为是更新一个版本号,致使整个项目从新构建,在网络慢的状况下,这是没法忍受的。html
buildSrc 这种方式,在最近几年是很是流行的,由于它有如下优势:java
有优势的同时也有缺点,来看一下 Gradle 文档android
A change in buildSrc causes the whole project to become out-of-date. Thus, when making small incremental changes, the --no-rebuild command-line option is often helpful to get faster feedback. Remember to run a full build regularly or at least when you’re done, though.git
buildSrc的更改会致使整个项目过期,所以,在进行小的增量更改时,-- --no-rebuild命令行选项一般有助于得到更快的反馈。不过,请记住要按期或至少在完成后运行完整版本。github
汇总一句话就是说,buildSrc 依赖更新将从新构建整个项目,那么有没有一种方法支持自动补全和单击跳转,有不用从新构建整个项目,Composing builds 就能够实现,接下来咱们来演示一下 buildSrc 和 Composing builds 它们的 build 的时间,相关代码我已经上传到 GitHub 了:ComposingBuilds-vs-buildSrc算法
经过这篇文章你将学习到如下内容,将在文末总结部分会给出相应的答案编程
这篇文章涉及不少重要的知识点,请耐心读下去,我相信应该会给你们带来不少不同的东西。数组
接下来咱们来演示一下 buildSrc 和 Composing builds 它们的优点劣势对比,在分析以前,先来了解一下基本概念性能优化
摘自 Gradle 文档:当运行 Gradle 时会检查项目中是否存在一个名为 buildSrc 的目录。而后 Gradle 会自动编译并测试这段代码,并将其放入构建脚本的类路径中, 对于多项目构建,只能有一个 buildSrc 目录,该目录必须位于根项目目录中, buildSrc 是 Gradle 项目根目录下的一个目录,它能够包含咱们的构建逻辑,与脚本插件相比,buildSrc 应该是首选,由于它更易于维护、重构和测试代码bash
摘自 Gradle 文档:复合构建只是包含其余构建的构建. 在许多方面,复合构建相似于 Gradle 多项目构建,不一样之处在于,它包括完整的 builds ,而不是包含单个 projects
为了正确对比这两种方式,新建了两个空的项目分别是 Project-buildSrc 和 Project-ComposingBuild,这两个项目引用的依赖都是同样的,Project-buildSrc 包含 buildSrc,Project-ComposingBuild 包含 Composing builds。
Project-buildSrc 和 Project-ComposingBuild 它们的结构都差很少,接下来咱们来看一下,编译速度 和 使用上有什么不一样。
Project-buildSrc 和 Project-ComposingBuild 这两个项目,它们的 androidx.appcompat:appcompat 的版本是 1.0.2,如今咱们从 1.0.2 升级到 1.1.0 来看一下它们 Build 的时间。
当修改了版本号,Project-buildSrc 项目 Build 的时间几乎是 Project-ComposingBuild 项目的 4.6 倍( PS: 每一个人的环境不一样,时间上会有差别,可是 Project-buildSrc 的时间老是大于 Project-ComposingBuild )
在更大的项目中,网络慢的状况下,这种差别会更加明显,几分钟的构建都是常事,在 buildSrc 中作微小的更改,可能须要花很长时间构建,等待团队其余成员在他们提取更改以后,都将致使项目从新构建,这个代价是很是昂贵的。
Project-buildSrc
plugins {
`kotlin-dsl`
}
repositories{
jcenter()
}
复制代码
buildSrc/src/main/java/包名/
目录下新建 Deps.kt 文件,添加如下内容object Versions {
......
val appcompat = "1.1.0"
......
}
object Deps {
......
val appcompat = "androidx.appcompat:appcompat:${Versions.appcompat}"
......
}
复制代码
Project-ComposingBuild
buildscript {
repositories {
jcenter()
}
dependencies {
// 由于使用的 Kotlin 须要须要添加 Kotlin 插件
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.72"
}
}
apply plugin: 'kotlin'
apply plugin: 'java-gradle-plugin'
repositories {
// 须要添加 jcenter 不然会提示找不到 gradlePlugin
jcenter()
}
gradlePlugin {
plugins {
version {
// 在 app 模块须要经过 id 引用这个插件
id = 'com.hi.dhl.plugin'
// 实现这个插件的类的路径
implementationClass = 'com.hi.dhl.plugin.Deps'
}
}
}
复制代码
versionPlugin/src/main/java/包名/
目录下新建 Deps.kt 文件,添加如下内容class Deps : Plugin<Project> {
override fun apply(project: Project) {
}
companion object {
val appcompat = "androidx.appcompat:appcompat:1.1.0"
}
}
复制代码
includeBuild 'versionPlugin'
重启你的 Android Studioplugins{
// 这个 id 就是在 versionPlugin 文件夹下 build.gradle 文件内定义的 id
id "com.hi.dhl.plugin"
}
复制代码
ps:plugins{} 须要放在 app 模块 build.gradle 文件内首行位置
Project-ComposingBuild 比 Project-buildSrc 多了两步操做须要在 settings.gradle 和 build.gradle 引入插件,二者在使用都是差很少的
如何快速使用 buildSrc
如何快速使用 Composing builds
总共从如下几个方面对比了 Composing builds 和 buildSrc
Project-buildSrc 和 Project-ComposingBuild 相关代码已经上传到 GitHub 了:ComposingBuilds-vs-buildSrc
到目前为止大概管理 Gradle 依赖提供了 4 种不一样方法:
buildSrc 如何迁移到 Composing builds?
若是当前项目使用的是 buildSrc 方式,迁移到 Composing builds 很简单,须要将 buildSrc 内容拷贝的 Composing builds 中,而后删掉 buildSrc 文件夹就能够便可
致力于分享一系列 Android 系统源码、逆向分析、算法、翻译、Jetpack 源码相关的文章,能够关注我,若是你喜欢这篇文章欢迎 star,一块儿来学习,期待与你一块儿成长
因为 LeetCode 的题库庞大,每一个分类都能筛选出数百道题,因为每一个人的精力有限,不可能刷完全部题目,所以我按照经典类型题目去分类、和题目的难易程度去排序
每道题目都会用 Java 和 kotlin 去实现,而且每道题目都有解题思路,若是你同我同样喜欢算法、LeetCode,能够关注我 GitHub 上的 LeetCode 题解:Leetcode-Solutions-with-Java-And-Kotlin,一块儿来学习,期待与你一块儿成长