使用Composing builds提升Android编译速度

目录
  • 前言
  • Composing builds 和 buildSrc 对比
    • 什么是 buildSrc
    • 什么是 Composing builds
    • buildSrc vs Composing builds
    • 编译速度
    • 它们在使用上有什么不同呢
  • 总结
  • 结语

前言

长期以来困扰我们的一个问题就是构建速度,AndroidStudio 的构建速度严重影响 Android 开发者的工作效率,尤其是更新一个版本号,导致整个项目重新构建,在网络慢的情况下,这是无法忍受的。

buildSrc 这种方式,在最近几年是非常流行的,因为它有以下优点:

  • 共享 buildSrc 库工件的引用,全局只有一个地方可以修改它
  • 支持 AndroidStudio 自动补全

  • 支持 AndroidStudio 单击跳转

有优点的同时也有缺点,来看一下 Gradle 文档

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.

buildSrc的更改会导致整个项目过时,因此,在进行小的增量更改时,-- --no-rebuild命令行选项通常有助于获得更快的反馈。不过,请记住要定期或至少在完成后运行完整版本。

汇总一句话就是说,buildSrc 依赖更新将重新构建整个项目,那么有没有一种方法支持自动补全和单击跳转,有不用重新构建整个项目,Composing builds 就可以实现,接下来我们来演示一下 buildSrc 和 Composing builds 它们的 build 的时间,相关代码我已经上传到 GitHub 了:ComposingBuilds-vs-buildSrc

通过这篇文章你将学习到以下内容,将在文末总结部分会给出相应的答案

  • 什么是 buildSrc?
  • 什么是 Composing builds?
  • 如何使用 Composing builds 和 buildSrc
  • buildSrc 和 Composing builds 优势劣势对比?
  • Composing builds 编译速度怎么样?
  • buildSrc 如何迁移到 Composing builds?
  • 管理 Gradle 依赖都有那几种方式?以及效率怎么样?

这篇文章涉及很多重要的知识点,请耐心读下去,我相信应该会给大家带来很多不一样的东西。

Composing builds 和 buildSrc 对比

接下来我们来演示一下 buildSrc 和 Composing builds 它们的优势劣势对比,在分析之前,先来了解一下基本概念

什么是 buildSrc

摘自 Gradle 文档:当运行 Gradle 时会检查项目中是否存在一个名为 buildSrc 的目录。然后 Gradle 会自动编译并测试这段代码,并将其放入构建脚本的类路径中, 对于多项目构建,只能有一个 buildSrc 目录,该目录必须位于根项目目录中, buildSrc 是 Gradle 项目根目录下的一个目录,它可以包含我们的构建逻辑,与脚本插件相比,buildSrc 应该是首选,因为它更易于维护、重构和测试代码

什么是 Composing builds

摘自 Gradle 文档:复合构建只是包含其他构建的构建. 在许多方面,复合构建类似于 Gradle 多项目构建,不同之处在于,它包括完整的 builds ,而不是包含单个 projects

  • 组合通常独立开发的构建,例如,在应用程序使用的库中尝试错误修复时
  • 将大型的多项目构建分解为更小,更孤立的块,可以根据需要独立或一起工作

buildSrc vs Composing builds

为了正确对比这两种方式,新建了两个空的项目分别是 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:修改了版本号 1.0.2 -> 1.1.0 重新 Build 用时 37s

  • Project-ComposingBuild:修改了版本号 1.0.2 -> 1.1.0 重新 Build 用时 8s

当修改了版本号,Project-buildSrc 项目 Build 的时间几乎是 Project-ComposingBuild 项目的 4.6 倍( PS: 每个人的环境不同,时间上会有差异,但是 Project-buildSrc 的时间总是大于 Project-ComposingBuild )

在更大的项目中,网络慢的情况下,这种差异会更加明显,几分钟的构建都是常事,在 buildSrc 中做微小的更改,可能需要花很长时间构建,等待团队其他成员在他们提取更改之后,都将导致项目重新构建,这个代价是非常昂贵的。

它们在使用上有什么不同呢

Project-buildSrc

  • 在项目根目录下新建一个名为 buildSrc 的文件夹( 名字必须是 buildSrc,因为运行 Gradle 时会检查项目中是否存在一个名为 buildSrc 的目录 )
  • 在 buildSrc 文件夹里创建名为 build.gradle.kts 的文件,添加以下内容
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}"

    ......
}
  • 重启你的 Android Studio,项目里就会多出一个名为 buildSrc 的 module,实现上面演示的效果

Project-ComposingBuild

  • 新建的 module 名称 versionPlugin
  • 在 versionPlugin 文件夹下的 build.gradle 文件内,添加以下内容
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"
    }
}

在 settings.gradle 文件内添加 includeBuild 'versionPlugin' 重启你的 Android Studio

在 app 模块 build.gradle 文件内首行添加以下内容,就可以实现上面演示的效果

plugins{
    // 这个 id 就是在 versionPlugin 文件夹下 build.gradle 文件内定义的 id
    id "com.hi.dhl.plugin"
}

ps:plugins{} 需要放在 app 模块 build.gradle 文件内首行位置

Project-ComposingBuild 比 Project-buildSrc 多了两步操作需要在 settings.gradle 和 build.gradle 引入插件,两者在使用都是差不多的

如何快速使用 buildSrc

  • 访问 ComposingBuilds-vs-buildSrc 拷贝 buildSrc 文件夹到你的项目的根目录
  • 重启你的 Android Studio,项目里就会多出一个名为 buildSrc 的 module

如何快速使用 Composing builds

  • 访问 ComposingBuilds-vs-buildSrc 拷贝 versionPlugin 文件夹到你的项目的根目录
  • 按照上面的配置方式,分配在 settings.gradle 和 app 模块的 build.gradle 引用插件即可

总结

总共从以下几个方面对比了 Composing builds 和 buildSrc

  • 目录结构:它们的基本目录结构是相同的,可以根据自己的项目进行不同的扩展
  • 编译速度:当修改了版本号,Project-buildSrc 项目 Build 的时间几乎是 Project-ComposingBuild 项目的 4.6 倍( PS: 每个人的环境不同,时间上会有差异,但是 Project-buildSrc 的时间总是大于 Project-ComposingBuild )
  • 使用上的区别:Composing builds 比 buildSrc 多了两步操作需要在 settings.gradle 和 build.gradle 引入插件

Project-buildSrc 和 Project-ComposingBuild 相关代码已经上传到 GitHub 了:ComposingBuilds-vs-buildSrc

到目前为止大概管理 Gradle 依赖提供了 4 种不同方法:

  • 手动管理 :在每个 module 中定义插件依赖库,每次升级依赖库时都需要手动更改(不建议使用)
  • 使用 ext 的方式管理插件依赖库 :这是 Google 推荐管理依赖的方法 Android官方文档
  • Kotlin + buildSrc:自动补全和单击跳转,依赖更新时 将重新 构建整个项目
  • Composing builds:自动补全和单击跳转,依赖更新时 不会重新 构建整个项目

buildSrc 如何迁移到 Composing builds?

如果当前项目使用的是 buildSrc 方式,迁移到 Composing builds 很简单,需要将 buildSrc 内容拷贝的 Composing builds 中,然后删掉 buildSrc 文件夹就可以即可

结语

参考文献

Organizing Gradle Projects

Composing builds

Android官方文档,使用 ext 的方式管理插件依赖库

以上就是使用Composing builds提升Android编译速度的详细内容,更多关于Android编译Composing builds 的资料请关注我们其它相关文章!

(0)

相关推荐

  • 哔哩哔哩Android项目编译优化

    目录 背景 编译优化 工作流程 快编插件 获取工程树结构 version版本 源码orAAR 主动Skip模块 Configuration策略 远端upload R8 class check Faster 云编译 独立的编译单元 展望 结语 背景 哔哩哔哩的安卓项目的工程结构是Monorepo(单仓)变种,也就是所有的代码都在一个工程结构下编译.我们认为Monorepo(单仓)是一个非常适合我们的开发模式,主要是因为其提供的原子提交,可见性,参与度,切片的稳定性等等优点,这些都是我们选择Mono

  • 解决Android 源码编译错误的问题

    如下所示: Building with Jack: out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/with-local/classes.dex FAILED: /bin/bash out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/with-local/classes.dex.rsp Out of memory error (version 1.2-a

  • 关于AndroidStudio新建与编译项目速度慢解决办法

    android第一次新建项目是,相关依赖包需要下载很久,至少半小时,因为网速问题,还会多次下载失败. 解决办法如下: 1.通过镜像将gradle-5.4.1-all.zip下载到本地:解压到文件夹:D:\software\gradle\gradle-5.4.1作为GRADLE_HOME目录 GRADLE_HOME=D:\software\gradle\gradle-5.4.1 GRADLE_USER_HOME=D:\software\gradle 2.修改gradle文件夹下的gradle-wr

  • 关于android studio通过命令行运行gradle编译命令的问题

    报错:Could not resolve all dependencies for configuration ':classpath'  打开android-studio的terminal,运行命令 gradlew -debug 或者 gradlew -info 发现错误 根据提示(利用gradle.perperties),解决了jdk版本问题 org.gradle.java.home=D\:/android/android-studio/jre/ 到此这篇关于关于android studio

  • 使用Composing builds提升Android编译速度

    目录 前言 Composing builds 和 buildSrc 对比 什么是 buildSrc 什么是 Composing builds buildSrc vs Composing builds 编译速度 它们在使用上有什么不同呢 总结 结语 前言 长期以来困扰我们的一个问题就是构建速度,AndroidStudio 的构建速度严重影响 Android 开发者的工作效率,尤其是更新一个版本号,导致整个项目重新构建,在网络慢的情况下,这是无法忍受的. buildSrc 这种方式,在最近几年是非常

  • 优化Gradle提升Gradle编译速度

    一. 我们先说一下提升Gralde编译速度. 针对这个问题, 先讲一下配置相关设置提升编译速度.  我发现在build.gradle文件中如果设置了很多渠道, 在编译时会影响编译速度, 尤其是windows系统下运行. 对gradle中渠道进行优化, 可以提升编译速度 1. 在user/.gradle文件下创建gradle.properties文件, 并在中写上org.gradle.daemon=true , 保存. 2. 设置studio, 打开setting >> gradle>&g

  • Android Studio通过Artifactory搭建本地仓库优化编译速度的方法

    Android Studio 编译速度慢,一般来说,原因有下面几个. Gradle下载慢 依赖库下载慢 依赖库使用"+"(使用最新的),每次都需要去查找新的(尽量不适用这种方式) 这里,大部分的库,我们可以通过阿里云代理仓库. 但是,如果有我们自己的私有库或者插件的话.肯定不希望放到阿里云上了. 这个时候,我们就需要建立,我们自己的本地仓库,让私有仓库,依赖阿里云的私有仓库. 依赖关系,如下图 这样,既保证了我们私有库的安全性,又让我们的依赖库也享受到了阿里云代理仓库的便利. 通过Ar

  • XCode编译速度慢的处理方法

    提升编译链接的速度主要有以下三个方式: 1. 提高XCode编译时使用的线程数 复制代码 代码如下: defaults write com.apple.Xcode PBXNumberOfParallelBuildSubtasks 4 XCode默认使用与CPU核数相同的线程来进行编译,但由于编译过程中的IO操作往往比CPU运算要多,因此适当的提升线程数可以在一定程度上加快编译速度. 2. 将Debug Information Format改为DWARF 在工程对应Target的Build Set

  • 手把手教你实现Android编译期注解

    详细阐述了实现一个Android编译期注解sdk的步骤以及注意事项,并简要分析了运行时注解以及字节码技术在生成代码上与编译期注解的不同与优劣 一.编译期注解在开发中的重要性 从早期令人惊艳的ButterKnife,到后来的以ARouter为首的各种路由框架,再到现在谷歌大力推行的Jetpack组件,越来越多的第三方框架都在使用编译期注解这门技术,可以说不管你是想要深入研究这些第三方框架的原理 还是要成为一个Android高级开发工程师,编译期注解都是你不得不好好掌握的一门基础技术. 本文从基础的

  • js实现网页图片延时加载 提升网页打开速度

    提升网页加载速度的方法有很多种,用 jquery.lazyload.js 实现图片异步延迟加载,对于页面包含图片较多的网站来说,会是个不错的提升网页打开速度的方法.代码君网站栏目页列表左侧,在PC端预览时能看到一个文章略缩图展示模块,一定程度上会延长网页加载时间.本文采用图片异步延迟加载的方法,来提升本站页面加载速度. 图片异步加载,就是不必一次性把页面的所有图片都加载显示出来,等用户滑动滚动条到某个位置时才会加载显示相应位置的图片,这样能很好地提升网页加载速度,进一步提升用户体验. 有很多技术

  • Android 编译出错版本匹配问题解决办法

    Android 编译出错版本匹配问题解决办法 解决问题的关键在于版本匹配, compileSdkVersion compileSdkVersion targetSdkVersion 这三个参数的整数值都应该是一样的,这里我全部设置成23, 在这之前我还升级了:appcompat到com.Android.support:appcompat-v7:24.0.0 最终编译成功,剩下的问题都是代码问题了 apply plugin: 'com.android.application' android {

  • 详谈Android编译命令

    工欲善其事,必先利其器,对于想要深入学习Android源码,必须先掌握Android编译命令. 一.引言 关于Android Build系统,这个话题很早就打算整理下,迟迟没有下笔,决定跟大家分享下.先看下面几条指令,相信编译过Android源码的人都再熟悉不过的. source /opt/android1204_17.conf source setenv.sh lunch make -j12 记得最初刚接触Android时,同事告诉我用上面的指令就可以编译Android源码,指令虽短但过几天就

  • 10种提升android运行效率的建议

    目录 一.有效的线程 1. 如何使用后台线程以避免前台负载过荷? 2.如何避免应用不响应ANR? 3. 如何在分离的线程中初始化查询? 4.其他 二.设备电池的优化 5. 如何优化网络? 6. 如何优化前台应用? 7.如何优化后台运行的应用? 8. 其他 三.使用最少内存实现UI 9. 如何分辨出布局性能问题? 如何让安卓程序在有限的内存和电池资源下流畅快速有效率的运行,下面给出了10种实践中的建议: 一.有效的线程 1. 如何使用后台线程以避免前台负载过荷? 默认情况下,应用程序的所有操作都是

  • Docker容器搭建android编译环境的实践记录

    目录 1 部署容器 1.1 手动部署 1.1.1 配置docker 1.1.2 启动容器 1.1.3 配置环境 1.2 Dockerfile 2 镜像管理 3 容器管理 3.1 每个用户各用容器 3.1.1 服务端配置 3.1.2 客户端使用 3.2 多用户共用容器 3.2.1 服务端配置 3.2.2 客户端使用 1 部署容器 1.1 手动部署 1.1.1 配置docker # 安装之前必须修改docker路径,防止docker空间增长暴满. sudo ln -s /opt/docker /va

随机推荐