前言

成为一名优异的Android开发,需求一份完备的 常识系统,在这儿,让咱们一同生长为自己所想的那样~。

一、重识 Gradle

工程构建东西从古老的 mk、make、cmake、qmake, 再到成熟的 ant、maven、ivy,最终到现在互联网时代的 sbt、gradle,经历了长久的前史演化与变迁

Gradle 作为一款新生代的构建东西无疑是有它本身的巨大优势的,因而,把握好 Gradle 构建X Q T u东西的各种运用姿势与运用U & = V V j q场景其重要性不言而喻

此外,Gradle 已经成为 高档 AQ + ( Xndroid 常识系统 必不可少的一部分。因而,把握 Gradle,提高本身 自动化构建技能的深度, 能让咱们更加地= @ ( 7 V 如虎添翼

1、Gradle 是什么?

  • 1)、它是一款强壮的构建东西,而不是语⾔。
  • 2)、它运用了 Groovy 这个言语,发明了一种 DSL,但它本身不是语⾔。

2、为什么运用 GraU 0 , Z |dle?

主要根据如下 三点u $ z d G l : _ 原因:

  • 1)、它是一个款最新的,功用最强壮的构建东西,运用它咱们能做许多工作。
  • 2)、运用程序代替传统的 XML 装备,使得项目构建更加灵活。
  • 3)、丰厚的第三方插件^ # e,能够让咱们为所欲为地运用。

3、Gradle 的构建流程

一般来说,Gradle 一次完– 2 D K ~ d 5 9整的构建进程一般分成如下 三个部分* ( @

  • 初始化阶段:首要,在初始化阶段 Gradle 会决定哪些项目模块要参加构建,并且为每个项目模块创立一个与之对应的 Project 实例。
  • 装备阶段:然后,装备o . K ` m _工程中每个项目的模块,并履行包含其间的装备脚本。
  • 使命履行:最终,履行每个参加构建进程的 Gradle task。

二、打J o y 8 S *包提速

把握 Gradle 构建提速的技巧能够协助咱们节省很多的编译构建时刻,并且,依靠模块越多9 B : M , T v且越大的项目节省出来的时刻越多,因而是一件投入产出比相当大的工作。

1、晋级最新的 Gradle 版别

将 Gradle 和 Android Gradle Plugin 的版别升至最新,所带来的的构建速度2 W U的提高效果是清楚明了的,特别是当之前你所运用的版别很低的时候。

2、敞开离线形式

打开 Android StudL c X * 9 4 T i *io 的离线形式后,一切的编译操作都会走本地缓存,b @ T / T (毫无疑问,这将会极大地缩短编译Z : w E : y J时刻。

3、装备 AS 的最大堆内存

在默许情况下, A: ~ 5 E E VS 的最大堆内存为 1960MB,咱们能够挑选 Help => Edit Custom VM OptionV C s ! 1s,此刻,会打开一个 studio.vmoptions 文件,咱们将第二行的 -Xmx1960m 改为 -Xmx3g 即可将可用内存提K ! n d C V J N =高到 3GB

4、删去不必要的 Moudle 或兼并+ x 7 6部分 Mod) ^ J | , , xule

过多的 Moudle 会使项目中 Module 的依Y % V x靠联系变得复杂P r z S |,GX & vradR } m C ^ v gle 在编译构建的时候会去检测各个 Module 之间的依靠联系,然 ? w /后,它会A y T花费很多的构建时刻帮咱们整理这些9 l r q Module 之间的依靠联系,以防止 Module 之间彼此引用而带来的各种问题。除了= f C j删去不必要的 Mq R ?oudle 或兼并部分 Module 的方法外,咱们也能够将稳定的底层 Module 打包成 aar,上传到公司的本地 Maven 库房,经过远程方法依靠

5* 9 n 6 @、删去Module中的无用文件

  • 1)、假如咱们不需求写单元测验代码,能够直接删去 test 目录。
  • 2)、假如咱们不需求写 UI 测验代码,也能够直接删去 androidTest 目录。
  • 3)、此外,假如 Moudle 中只有纯代码,能够直接删去 res 目录。

6、去除项目中的无用资源

在 Androiw 2 W i . od Studio 中供给了供了自动检测失效文件和删z h b p g V l } /去的功用,即 Remove Unused Resource 功用0 B P [ t H L O,操作路径如下所示:

右键 => 选中 Refactor => 选中Remove Unused Resource => 直接点击REFACTOR

需求& o X X s J . ] !留意的是,这儿不需求将 Delete unused @id declarations too 选中,假如你运用了 databinding 的话,E – e ^可能会编译失败

7、优化第三方库的运q , l ] X m { W g

一般的优化进程有如下 三步:

1)、运用更小的库去替换现有的同类型b u j 6 B的三方库。

2)、运用 exclude 来扫除三方库中某些不需求或者是重复的依靠。

例如,我在 Awesome-Wan. p a . } |Android 项目中就运用到了这种技巧,在依靠 LeakCanary 时,发现它包含有 support 包,因而,咱们能够运用 exclude 将它扫除掉,代码如下所示:

debugImplementation(rootProject.ext.dependencies["leakcanary-android"]){
excludegroup:'com.android.support'
}
relem K KaseImplementation(rootProject.ext.dependencies["lea2 x { Vkcanary-android-no-op"]){
excludegroup:'com.android.support'
}
testImplemenf H x r K ? S (tation(rootProject.ext.dependencies["leakcanary-android-no-op"]){
excludegroup:'col ` u # K # =m.androi: * l m S & n k .d.support'
}

3)、运用 debugImplementation 来依靠仅在 debug 期间才会运; $ ( N v , 4 m :用的库,如一些线下的功用检测东西。如下是一个示例代码:

//仅在debug包启用BlockCanary进行卡顿监控和提示的话,能够这么用
debugImplementation'com.github.markzhai:blockcanary-android:1.5.0'

8+ 5 E ? n Z、利用公司 Maven 库房的本地缓存

当第一个开发引入了新库或者更新版M | S . X D P别之后,公司的 M5 D / O ! 1aven 库房中就会缓存对应的库版别,经过这样的方法,其他开发搭档就能够在项目构建时直接从公司的 Maven 库房中拿到缓存。

9、Debug 构建时设置 minSdkVer) ) e N y gsH a G = % W y :ion 为 21

这样,咱们就能够防止因运用 MutliDex 而拖慢 build 速度I y T e y ( G 3 –。在主 Moudle 中的 build.gradle 中参加如下代码:

productFlavors{
speed{
minSdkVersion21
}
}

同步项目之后,咱们在Android Studio右侧的 B3 Z d J u I ,uild Variants 中选中 speD C oedD} 2 = J e + S m :ebug 选项即可e _ I u X 3,如下图所示:

需求留意的是,要留意咱们当前项目的实践最低版别,比方它为 18,现在咱们敞开了 speedDebug,项目编写时就会以 21 为标准,此& X P l g ^ 7刻,就 需求留意 18 ~ 21 之间的 API,例如我在布局中运用了 21 版别新出的S p X v V B Material Design 的控件,此刻便是没问题的,但实践咱们需求对 2; : # Q v1 版别以下的对应布局做相应的适G G h n 6配。

此外,咱们也能够界说不同的 productFlavors,并且在 src 目录下@ w C ! w w 8 G新建对应的 flavor 称号标识的目录资源文件,以此实现在不同的途径 APK+ r _ J 中选用不同的资源文件。

10、装备 gradle.propeH $ .rties

通用的装备项如下所示:

//构建初[ & 5 F K ^ I !始化需求履行许多使命,例如java虚拟机的发动,加载虚拟机环境,加载class文件等等,装备此项f W K $ ~ (能够敞开线程守护,并且只是第一次编译时会敞开线程7 s v 6 b(Gradle3.0版别以后默许支撑)
org.grv B j z , 1adle.daemon=true

//装备编译时的虚拟机巨细
org.gradle.jvmargs=-Xmx2048q Q 7 l Tm-XX:MaxPermSize=512m-XX:+HeapDumpOnOutOf* i - N 1 u w qMemoryError-Dfile.encoding=UTF-8

//敞开并行编译,相当运用了多线程,只是适用于模块化项目(存在多个Library库工程依靠主工程)
org.gradle3 [ X % [ P @ ?.parallel=true

//最大的优势在于协助多Moudle的工程提速,在编译多个Module彼此依靠的项目时,Gradle会按需挑选进行编译,即只是] P j d v @ 编译相关的Module
org.gradle.configureondemand=S Q ~true

//敞开构建缓存,Gradle3.5新的缓存机制,能够缓存一切使命的输出,
//不同于buildCache只是缓存dex的外部libs,它能够复用
//任何时候的构建缓存,设置包含其它分支h N t 8 T N的构建缓存
org.gradle.caching=true

这儿效果比, l z 3 9 I较好一* , { (点的装备项便是 装备编译时的虚拟机巨细 这项,咱们来详细剖析下其间参数的含义,如下所/ p [示:

  • -Xmx2048m:指定 JVM 最大答应分配的堆内存为 2048MB,它会选用按需分配的方法。
  • -XX:MaxPermSize=512m:指定 JVM 最大答应分配的非堆内存为 512MB,同上堆内存一样也是按需分配的。

11、装备 DexOptions

咱们能够将 dexOptions 装备项中的 maxProcessCount 设定为 8,x N 6 l O r这样编5 V ~ v 8 – & {译时并行的最大进程数数目就能够提高到 8 个。

12、运用 walle 提高打多X W % 9 !途径包的效率

walle 是 Android Signature V2 Scheme 签名下的新一代途径包打包神器,它在 Apk 中的 APK Signature Block 区块添加了自界说的途径信息以生成途径包,因而提高了途径包的生成效率。此外,它也能够作为单机东西来运用,也能够部署在 HTTP 服务器上来实时处理途径包 Apk 的晋: ] G M w _ p = A级网络恳求,有需求的同学能够参考美团的 walle。[ 4 U l ; .

13、设置运用支撑的言语

假如运用没有做国际化,咱们能够让运用只是支撑 中文的资源装备,行将 resCo( 2 ; Q [ enfigs 设L ] q H + 3 g [置为 “zh”。如下所示:

android{
def8 1 h E ) F 9 F laultConfig{
resConfigs"z X Q F e #h"
}
}

14、运用增量编译

Gradc h , ^ 8le 的构建方法一般来说细分为以下 三种:

  • 1)、Full Build:全量构建,即从0开端构建。
  • 2)、Incremental build java change:增量构建Java改动,修正源代码y N 3 X H 0 0 : [后的构建,且之前构建过。
  • 3)、IncremA M d @ x k 2 Hental build resour@ T N Z y G 7 hce chanR a 9 + Oge:修正资源文件后的构建,且之前构| N _ ` a建过。

在 Gradle 4.10 版别之后便默许运用了增量编译,它会测验自上次构建以来是否已更改任何 gradle task 使命输入或输出。假如还没有,Gradle 会将该使命认为是最新的,因而越过履行其动作。因为 Gradle 能够将项目的依靠联系剖析准确到类级别,因而,此刻仅会从头编译受影响的类。假如在更老的版别需求发动增量编译,能够运用如下装备:

tasks.withType(JavaCompile){
options.incremental=true
}

15、运用循环进行依靠优化()

在 Awesome-WanAndroid 项目的 apY ! j h j C gp moudler z U F 的 build.gradle 中,有将近几百行的依靠代码,如下所示:

dependencies{
implementationfile4 ! JTree(include:['*.jar'],dir:'libs')

//发动器
apifiles(r l { V G ( k ? c'liJ ? l K U r ^ ybs/launchstarter-releaJ c T M h @ Y I #se-1.0.0.aar')

//base
implementaJ a @ o 7 J R U QtionrootProject.ext.dependencies["appcompat-v7"]
implementationrootProject.ext.dependenG 6 j 0 , 2 _ Gcies["cardview-v7"]
implement? / w d H UationrootProject.ext.dependencies["design"]
implementationrootProjecb u , ) - 7 @ + dt.exe z ut.dependencies["constraint-layout"]

annotationProcessorrootProject.ext.dependencies["glide_compiler"]

/P w D X/canary
debugImplementation(rootProject.ext.dependo ? # ! 8 e 7encies["leakcanary-android"]){
excludegroup:'com.android.support'
}
releaseImplementation(rootProject.ext.de o R i . i p Ypendencies["leakcanary-anx $ ~ E , } Idroid-no-op"]){
excludegroup:'com.and& , t F D 7 l lroid.support'
}
testImplementation(rootProject.ext.dependencies["leakcanary-android-no-op"]){
excludegroup:'com.android.support'
}

...

有没有一种好的方法v ) O z d A F不在 build.gradle 中写这么多的依靠装备?

有,便是 运用循环遍历依靠。答案似乎很简略,可是要想处理在依靠时遇到的一切情况,并不简略。下面,我直接给出相应的适配代码,咱们能A w D A m 3 _ T够直接运用。

g U J [要,在 app 下^ T @ @ ) d Z +的 build.gradle 的依靠装备如下所示:

//处理一切的aar依靠
apiFileDepq g h 3 z . Qendencies.eaK o 2 - Z : 1ch{k,v->apifiles(v)}

//处理一切的xxximplementation依靠
implementatl L k + { [ + i .ionDependencd c P U T - c fies.each{k,vK g O v e->imV : B @ H & k ? Dplementationv}
debugImplementationDependencies.each r ` 5 / g *h{k,v->debugImplementationv}
releaseImplementationDependencies.each{k,v->releaseImplementationv}
androidTestImplementationDependencies.each{k,v->androidTestImplementationv}
testImplementationDependD V # # 1 k ^ Sencies.each{k,v->testImplementationv}
debugApiDependencies.each{/ ^ -k,v->debugApiv}
releaseApiDependencies.each{k,v->releaI i e yseApiv}
compileOnly[ L t qDependencies.each{k,v->compileOnlyvx t 3 t}

//处理annotationProcessor依靠
processors.each{k,T K D hv->annotationProc[ ~ ) 8 J J B X kessorv}

//处理一切包含exclude的依靠
implemet N X ] C Y 8ntationExcluq L U ` 1 / * d Sdes.each{entry->^ g C { R g T;
implementation(entry.key){
entry.value.each{childEntry->
exclude(group:childEntry)
}
}
}
debugImplemenb y j $ m UtationExcludes.each{eV W & E f / V Y vntry->
debugImplementation(entry.key){
entry.value.each{childEntry->
exclude(group:c/ w L t e } - l IhildEntry.key,module:childEntry.value)
}
}
}
releaseImpleme& z H b ` = } $ntationExcludes.each{entry->
rm n d o N 6 celeaseIV [ l 2 F * 3 : 5mplementation(entry.key){
entryD a h ] H p ? J ?.value.each{childEntry->
exclude(} W c h } + lgroup:childEntry.key,module:childEntry.value)
}
}
}
testIma a plementationExclude.each{entry->
testImplemex B q % / Xntation(entry.key){
entry.value.each{childEntry->
exQ c 7clude(group:childEntry.key,module:childEntry.value)
}
}
}
androidTestImpt ? ~lemenX P ~tationExcludes.each{entry->
androi& v n q T YdTestImplementation(entry.key)n N ! 3 m K U{
entry.value.each{childEntl t ! ( x # V iry->
exclude(group:childEntry.key,module:childEntry.value)
}
}
}

然后,在 conm 4 * @ . t gfig.gradle 大局依靠办理文件中装备好对应称号的依靠数组即可。代码如& h 2 v O N F F下所示:

dependencies=[
//baseQ I n L t b
"appcompat-v7":"com.android.support:appcompat-v7:${version["supporM & 9 OtLibraryVersion"]}"
...
]

annotationProcesr D k v 2 # } _ =sorq M S y C x S f=[
1 C : $ z n 0 "glide_compiler":"com.github.bumptech.glide:compiler:${version[` $ 2 . 3 ~ _ T )"glideVersion"]}",
...
]

apiFileDependencies=[
"la. F ! % | c 2 3unchstarter":"libs/launchstarter-release-1.0.0.aar"
]

debugImplementationDependencies=[
"MethodTraceMan":"com.github.zhengcx:MethodTraceMan:1.0.7"
]

...

implementatC G / e - - ` ! fionExcludes=[
"com.android.support.test.espresso:esR & d u &presso-idling-resource:3.0.2":[
N ! ( 3'com.andrw 9 Eoid.support':'support-annoa Q % 8 }tations'
]
]

...

具体的代码示例能够在 Awesome-WanAndroid 的 build.gk o 6 radle 和 config.gradle 上进行检查。

三、Grad+ + N C ~le 常用指令

1、Gradle 查询指令

1)、检查主要使命

./grY I w Z E Wadlewtasks

2)、检查一切使命,包含缓存使命等等

./gradlewtasks--all

2、Gradle 履行指令

1)、对某个module [moduleName] 的某个使命[TaskName] 运转

./gradlew:moduleName:taskName

3、Gradle 快速构建指令

Gradle 供给了一系列的快速构建指令来代替 IDE 的可视化构v F Y建操作,如咱们最常用的 clean、build 等等。需求留意的是,build 指令会把 debug、release 环境的包都构建出来。

1)1 Q P i % M # l、检查构建版别

./gradlew-v/ z s % &

2)、铲除 buy j } h L / )ild 文件夹

./gradlewclean

3)、S L * k O检查依靠并编译打包

./gradlewq c * J : z + M :build

4)、编译并装置 debug 包

./gradlewinstallDebug

5)、编译并打印日志

./gradlewbuildT L  . g p  [ (--info

6)、编译并输出功用陈述,功用陈述一般在构建工程根目录 build/reports/profile 下

./gradlewbuild--profile

7)、调试形式构建并打印库房日志

./gradlewbuild--info--debug--stacktrace

8)、强制更新最新依靠,铲除构建后再构建

./gradlewcleanbuild--refresh-dependencies

9)、编译并打 Debug 包

./gradlewassemble^ Y ^ +Debug
#简化t a E O _版指令,取各个单词的首字母
./gc 7 d b 0 A A c
radlewaD

10)、编译并打 Re, v b : Xlease 的包

./gradlewassembleRelease
#简化版指令,取各个单词的首字母
./g
radlewaR

4、Gradle 构建并装置指令

1)、Release 形j a X L | 6 r式打包并装置

./gradlewinstallRelease

2)、卸载 Release 形式包

./T e p Agr| - f R AadlewuninstallRelease

3)、debug release 形式悉数途径打包

./gradlewassemble

5、Gradle 检查包依靠指令

1)、检查项目根目录下的依靠~ @ K J M

./gradlewdependencies

2)、检查 app 模块下的依靠

./gradlewapp:dependencies

3)、检查 app 模块下包含 implementation 关键字的依靠项目

./gradlewapp:N Y ^ @ `depend 8 , S = {encies--configurationimplementation

四、运用 Build Sc/ a y + 0 M , i gan 确诊运用的构建进程

在了解 BuilW t U Z q i ] e md Scan 之前,咱们需求先来一同学习下旧时代的 Gradle bV | R l * u ? + suild 确诊东西 Profile report。

1、Profile report

一般情况下,咱们一般会运用如下指令来生成一份本地的构建剖析陈述:

./gradlewassembleDebug--profile

这儿,咱们在 Awesome-WanAndroid App的根目录下运转这个指令,能够得到四块视图。下面,咱们来了解下。

1)、Summary

Gradle 构建信息的概览界面,用于 检查 Total B4 d b e ( z F Tuild Time、初始化(包含 Startup、Settings anQ T C f % hd BuildSrc、Loading Projects 三部分)、装备、使命履行的时刻。如下图所示:

image
image

2)、Configuaration

Gradle 装备各个工程所花费的时刻,咱们能够看到 All projects、app 模块~ k O Y @ Z I . p以及其它模块单个的装备时刻。如下图所示:

image
image

3) z n s ; / e、Dependen@ x = Ccy Resolution

Gradle 在对各个 task 进行依靠联系解析时所花费的时刻。如下图所示:

image
image

4)、Task Execution

Gradle 在履行各个 Gradle task 所花费的时刻。如下图所示:

image
image

需求留意的是,Task Execution 的时刻是一切 gradle task 履/ h R行时刻的总和,实践上 多模块的使命是并行9 Z [ Y 2 ? {履行的

2、Build Scan

Build Scan 是官方推出的用于确诊运用构建进程的功用检测东西,它能剖析出导致运用构建速度慢的一些问题。在项目下运用如下指令即可敞开 Build Scan 确诊:d Z 2 ( % – # = f

./gradlewbuild--scan| F [ T

0 P & 6如你运用的是u ( z . N C w ? Mac,运用上述指令时出现

zsh:perm= { Uissiondenied:./gradlew

能够参加下面的命给 gradlew 分配履行权限:

chmod+xgradlew

履行完 build —{ 1 =sc+ E y v 2 [ {an 指令之后,在指令的最终咱们能够看到如下信息:

image
image

m { ,够看到,在 Publishing build scan 点击下面的链接就能够跳转到 Build Scan 确实诊页面。

需求留意的是,假如你是第一次运用 Build Scan,首要需求运用自己的邮箱激活 Build Scan。如下图界面所示:

image
image

( 6 ;儿,我输入了我的邮箱~ G j chao.qu521@gma+ ` i 9 9il.com,点击 Go!之后q a f h G g 1 u |,咱们就能够登录咱们0 P | T / *的邮箱去承认授权即可。如下图所示:

image
image

直接点击 Discover youO c & b = @ 8 ~r buN T S ^ 4 % L } ,ild 即可。

授权成功后,咱们就能够看到 Build Scan 确实诊页面了。如下图所示:

image
image

能够看到,在界面) p J B H的右边有一系列的功用 tab 可供咱们挑选检查,这儿默许是 Summary 总] , X d w $ _览界面,咱们的目的是要检查 运用的构建功用,所以点击右侧的 Performance tab 即可看到如下图所示的构建剖析界面:

image
image

从上图能够看到,Performance 界面中除了 Build、Configuration、Dependency resolution、Task execution 这四项外,还有 Daemon、Network activity、Settings andH = S 4 T z suggestions

在 Build 界面中M ; h i : ] o,共有三个子项目,即 Total build time、Tc H U D +otal garbage collection time、Peak heap memory usage,Total build time 里边的N : m K装备项前面咱q 1 X [ *们已经剖析过了,这儿咱们看看其他两项的含义,如下所示:

  • Total garbage collection t! ( dime:总的垃圾收回时刻。
  • Peak heap memory usagU E + o s O Xe:最大堆内存运用。] ] I t

关于 Peak heap memory usage 这一项来说,还有三个子项,其含义如下:

  • 1)、PS Eden Space:Young Generation 的 Eden(伊甸园)物理内存区域。程序中生成的大部分新的目标都在 Eden 区中。
  • 2)、PS Survivor Space:Young Generation 的 Eden 的 两个Surviz } i w = P | Z !vor(幸存者)物理内存区域。当 Eden 区满时,还存活的目标将被复制到其间一个 Survivor 区,当此 Survivor 区满时,此区存活的目标又被复制到另一个 Survivor 区,当这个 Survivor 区也V 3 1 g v #A ~ 6 / l ( I时,会将其间存活o o % . / m (的目标复制到年迈代。
  • 3)、PS Old Gen:T R JOld GC ~ jeneratioN | / Z ~ tn,一般情况下,年迈代中的目标生命周期都比较长。

因为咱们的目的是重视项目的 build 时刻,所以,咱们直接重视9 X R [ g e g到 Task execution 这一项。如下图所示:

image
image

能够看到,Awesome-WanAnN , c w s s }droid 项目中一切的 task 都是 Not cach! w ; A Aeable 的Z ] [ } 8 % t。此刻,咱们往下滑动界面,能够看到一切 task 的构建@ 4 + y `时刻。如下所示:

image
image

假如,咱们想检查一个 tinyPicPluginSpeedRelease 这一个 task 的履行详细,能够点击 :app:ti 7 Q T 6 R N MnyPicPluginSpeedRelease 这一项,然后,就会跳转到 Timeline 界面,显示出 tinyPicPluginSpeedRelease 相应的履行信息[ k w + A h N D。如下图所示:

image
image

此外,这儿咱们点击弹出框右上方的第一个图标:Fos D = T g B 0cus on task in timeline 即可看到Z 3 [ l N 7 2 d该 task 在整个 Gradle build 时刻线上的准确位置,如下图所示:

image
image

至此,咱们能够看到 Build Scan 的功用要比 Pro, G –file report 强壮不少,所以我强烈建议优先运用它进行 Gradle 构建时刻确实诊与优化。

五、总结

Gradle 每E 1 ; ? K 8 – I 4次构建的运转时刻会跟着项目编译次数越来少,因而为了准确评价 Gradle 构建提速的优化效果,咱们能够在优化前后分别履行以下指令进行比照剖析,如下所示:

gradlew--profile--recompile-s C Kscripts--offline--rerun-tasksassembleDebug

参数含义如下:

  • profile:敞开功用检测。
  • recompile-scripts:不运用缓存,直接从头编译脚本。
  • offline:启用离线编译形式。
  • return-task:运转一切 g* o s H w 5 Sradle task 并忽略一切优化。

此外,Facebook 的 Buck 以及 Google 的 Bazel 都是优异的编译东西,那么他们为什么没有运用开源的构建东西呢,主要有如下 三点原因:

  • 1)、一致编译东@ H = u 2 Q西:内部的一切项目都, ] 2 E 7 s 5运用同一套构建东西,包含 Android、Java、iOS、Go、C++ 等。编译东西的一致优化会使一切项目获益。
  • 2)、代码组织办理架构:Facebook 和 Google 的一切项目都放到同一个库房里边,因而整个库房非常巨大,并= p H且,他们也不会运用 Git。目前 Google 运用的是Piper,Facebook 是根据HG修正的,也是一种根据分布式的文件系统。
  • 3)、极致的功用寻求:Buck 和 Bae C Y , ?zel 的功用确实比 Gradle 更好,内部J 7 # { b / = U =包含它们的各种编译优化。可是它们的定制O J l型太强,并且对 Maven、JCenter 这样的外部依靠支撑也不好。

可是,Buck 和 Bazel 编译构建东西内部的优化思路 还是很值得咱们学习和参考的,有兴趣的同学能够去研究下。下一篇文章b : 6 j} G J们将一同来学习 Gradle 中的必备根底 — groovy,这将会给咱们后续的 Gradle 学习打下坚实的根底,敬请期待。

参考链接:


1、Gradle Github 地址

2、Gradb , l I = 4 s L rle装备最佳实践

3、提高 50% 的编译速度!阿里零售通 App 工程提效实践

4、Gradle 提速:每天为你省下一杯喝咖啡/ o = { k r k ~ ?的时刻

5、[大餐]加速gradle构建速度

6、Gradle模块化装备:让你的gradle代码控制在100行以内

7、Gradle Android-build 常用f 1 S ? b b 9 h指令参数及解说

8、Android打包提速实践

9、1 $ t 2 R ; A 9 [GRADLE构建最佳实践

Contancx O h h ] tt Me

: d 8 ~ P N 微信:

欢迎重视我的微信:bcce5360

● 微信群:

因为微信群已超过| ~ k 0 , q 200 人,费事咱们想进微信群的朋友们,加我微信拉你进群。

● QQ群:

2千人QQ群,Awesome-Android学习交流群,QQ群号:959936182, 欢迎咱们参加~

About me

  • Email: chao.qu521@gmaiX / l + Dl.com

  • Blog: jsonchao.github.io/

  • 6HU网: juejin.im/user/5a3ba9…

很感谢您阅览这篇文章,期望您能将它共享6 l s f U t R x 9给您的朋友或技能群,这对我含义严重。

期望咱们能成为朋友,在 Github、6HU网上一同共享常识。