加快Android构建速度
尊重劳动成果,转载请注明出处:http://blog.csdn.net/growth58/article/details/49589885
原文链接:https://medium.com/android-news/android-build-speed-up-ver-english-c76890aa610#.92skzplgc
关注新浪微博:@于卫国
邮箱:yuweiguocn@gmail.com
从Eclipse 到Android Studio…
Ant到Gradle…
自从Google发布Android Studio & Gradle Plugin 1.0,Android开发环境已经改变了很多。
但是有很多的开发者抱怨构建花费的时间太长。
实事上我花费了比之前多2倍的时间。对此我很难过。
因此我试了很多方法来减少构建时间。并且这篇文章是关于它的。
Android 应用构建环境
1.Ant
可以说,Android开始于这个工具。我在 Jenkins (CI) 用于自动化构建和发布。但我很少用于开发。
2.Eclipse
很多开发者使用这个IDE。在SingleDex情况下,它是个好工具。实事上,对于构建增量它是相当好的。
3.Gradle-Android Studio
Android Studio基于Gradle。如果开发者修改Gradle属性,然后他们总是得同步Gradle到AS。并且不得不学习Gradle,Gradle还很慢。
自从去年我使用AS & IntelliJ,一直在抱怨Gradle的性能。在硅谷的很多技术公司,他们尝试了别的解决方法。
新的Android 应用构建
1.Bazel (by Google, Github)
它不但能构建Android,而且还能构建IOS。Bazel 开始于Blaze (Google构建系统)。Bazel 目前为Beta版。
2.Buck (by 非死book, Github)
Buck 比Bazel支持更多的语言、平台。(Go,Rust等等)
3.Pants (by 推ter, FourSquare, Square, Github)
三大组件协同工作。(对不起,我对它不太了解。)
性能
1.Bazel
来源: Bazel (http://bazel.io/docs/mobile-install.html)
2.Buck
来源 : Buck (https://buckbuild.com/article/exopackage.html)
3.Pants
我没能找到相关的数据
我们为什么从Gradle转移到其它的构建工具?
在gradle 团队的博客
Gradle团队对于Bazel 的观点 03,2015
https://gradle.org/gradle-team-perspective-on-bazel/
他们指出了Bazel的缺点
1.Bazel 没有一个高级别声明构建语言让构建变得简单对开发者来说。
2.没有建立可扩展性
3.首先是central repo,然后才是性能
4.Bazel is *nix only,它不能运行在Windows上。
5.没有插件的生态系统
结论
新的构建系统 (Bazel, Buck)看起来要比gradle更好。但对于初学者来说它们太困难了,因此我不会从Gradle转移到buck 或者其它的上面。
但是转移到Buck 、Bazel或Pants之后,一些开发者说它可以很高效节约时间对于构建。(抱歉,我忘了在reddit 上面发布)
解决方案只能转移构建工具?
从GDG 的韩国Android成员Alan Jeon,我改进了构建。
1.更新Gradle
$> $project/gradle/wrapper/gradle-wrapper.properties // ... distributionUrl=https\://services.gradle.org/distributions/gradle-2.9-all.zip
2.更新Android Plugin在build.gradle文件中
buildscrpt { dependencies { classpath 'com.android.tools.build:gradle:1.5.0' } }
3.设置minSdk in build.gradle (★★★)
http://developer.android.com/intl/ko/tools/building/multidex.html
android { productFlavors { dev { minSdkVersion 21 } prod { minSdkVersion 14 } } }
打包进程分两步。一是从class到dex。另一个是合并dex。但api 21 (Lollipop)之后基于ART。因此它不会合并dex。关键是节省构建时间。
需要小心的时,修改minsdk 值后,AS不会警告API level。
4.添加gradle.properties
org.gradle.daemon=true org.gradle.parallel=true org.gradle.jvmargs=-Xmx768m
5.添加DexOptions 在 build.gradle文件中
android { dexOptions { incremental true } }
※incremental 有潜在的错误(参考链接)
性能
构建设备:MacBook Pro Retina 2012 (i7 2.3Ghz, 8GB Ram)
之前
Clean Build : 56.97s Incremental Build : 16.3s
之后
Clean Build : 47.0s (up to 17% ) Incremental Build : 9.58s (up to 41%)
※ 在MultiDex时,Incremental 构建从47秒提高到了17秒。
在迭代开发时(包括TDD),我尝试提高构建速度。我希望能帮助到很多开发者。
请我喝杯咖啡,请使用支付宝扫描下方二维码: