应用构建速度将直接影响开发效率。本文将带你改造一个Android应用程序:《GoogleSantaTracker》为你提供十个技巧小技巧,帮助加速应用程序的Gradle构建,当我们应用所有的小技巧,构建演示应用程序快了三倍多。首先我们来了解一下“谷歌追踪圣诞老人”应用的工程背景:这个应用大小约60M,包含9个模块,Java文件500多个,XML文件1700多个,PNG文件3500多个图片资源。Mutil-dex,没有注解处理器。其次,在开始提速调优之前,先了解一下三个性能指标的描述:fullbuild,即重启整个项目的debug版本;codeincrementalbuild,即我们修改了项目的Java/Kotlin代码;增量构建资源是指我们修改资源文件,增加或减少图片和字符串资源等,每一个trick实现后,我们都会以上述三个场景的构建时间作为我们的量化标准。请注意,由于项目规模和开发环境不同,开发者的实际结果可能与本文中的结果不同。Tip1:使用最新版本的AndroidGradle插件AndroidGradle插件的每次更新都会修复大量的bug和提升性能等新功能,所以保持最新版本的AndroidGradle插件是非常有必要的。从3.0版本开始,我们将通过google()的Maven仓库分发新的AndroidGradle插件,所以我们需要在仓库中添加google()以获取最新的插件更新(现在AndroidStudio会在创建时默认添加google(一个新项目))的Maven存储库指向)。这是将AndroidGradle插件版本从2.x更新到3.0.0-alpha1后得到的结果(这里的demo是基于3.0.0-alpha1版本,随着插件版本的更新,性能提升会更多很明显),我们可以看到构建完整应用的时间直接减少了25%,代码更改的增量构建减少了近40%,资源更改的增量构建也减少了16%。技巧二:避免激活旧版Multidex这个技巧大家应该不陌生——避免激活旧版Multidex。当你的应用中的配置方法数超过64K时,你需要开启multidex。当你开启multidex,并且项目的最低APIlevel在21之前,会激活旧版本的multidex,这会严重拖慢你的构建速度,因为21之前的APIlevel本身是不支持multidex的。启用multidexhttps://developer.android.google.cn/studio/build/multidex.html如果是通过AndroidStudio的run/debug按钮进行构建,则不需要考虑这个问题,新版AndroidStudio会自动detecttheconnection对于设备和模拟器,如果系统的API级别大于21,将提供原生multidex支持,项目中最低API级别(minSdkVersion)的设置将被忽略。习惯于通过命令行窗口构建项目的开发者需要尽量避免这个问题:配置一个新的productFlavor,将项目的最低API级别设置为21或以上,并在命令行调用assembleDevelopmentDebug来避免这个问题。这次的性能提升结果也非常明显(灰线为初始结果),我们在fullbuild中减少了5.5秒,在代码变更的增量构建中减少了50%以上的时间.资源更改的增量构建与以前相同。Tip3:DisableMultipleAPKbuilds当一个应用需要发布和上架时,我们经常使用“MultipleAPK”构建,它可以根据ABI和像素密度创建不同版本的应用,减少包体积,ETC。但这在开发阶段似乎有点多余,所以我们需要禁用多APK构建功能来提高构建速度。禁用多APK构建不能只在splits中设置,因为这里的设置对项目中的所有构建变体都是可见的。禁用多APK构建的正确方法是创建一个属性来进行判断。这里我们设置了一个名为“devBuild”的属性,并在构建过程中将这个值传递给gradle。这时候gradle会splits.abi。enable和splits.density.enable设置为false,它不会生成多个APK。在AndroidStudio中,可以通过在preferences、build、execute和deploy类别中选择编译器选项,在命令行中添加参数:-PdevBuild,这样AndroidStudio每次构建时都会将这个值传递给gradle。避免生成多个APK。如上图,这是我禁用了多个APK后的效果,各项指标都在持续下降。多个APKhttps://developer.android.google.cn/google/play/publishing/multiple-apks.htmlBuildVariantshttps://developer.android.google.cn/studio/build/build-variants.html小提示4:尽量减少资源文件的使用当你的应用程序包含大量本地化资源或针对不同像素密度添加特殊资源时,你可能需要应用这个小技巧来提高构建速度——尽量减少在应用程序中打包的资源量发展阶段。资源数量。构建系统默认会将所有声明或使用的资源打包到APK中,但我们在开发阶段可能只使用其中一个。在这种情况下,我们需要使用resConfigs()来指定构建开发版本需要使用的资源,例如语言版本和屏幕像素密度。在这里我们看到了很大的改进,完整构建时间又减少了6秒,增量构建时间分别减少了20%以上。Tip5:禁用PNG压缩和tip4一样,这个特性本身在包发布阶段就很有帮助——PNG压缩,但是在开发阶段禁用这个特性可以提高构建效率。默认情况下,AAPT会压缩项目的PNG资源以减小APK的大小。根据图像的数量和大小,此过程将花费很长时间或很短的时间。如果你想避免使用PNG压缩,我们可以在Tip3中提到的devBuild属性中添加aaptOptions.cruncherEnabled=false,并在构建过程中将这个值传递给gradle来避免PNG压缩排序。另一种避免压缩PNG的方法是使用将PNG转换为WebP格式的图像。与PNG格式相比,WebP最多可以减少25%的大小。同时AndroidStudio2.3以上版本直接支持PNG转WebP格式。需要注意的是,APIlevel15及以上可以支持不透明的WebP格式图片,如果是透明格式的WebP,则需要APIlevel18及以上。可以看出完整的构建时间又减少了9秒。这也是因为GoogleTrackingSanta应用中有3500多张PNG图片,需要花费大量时间进行压缩和计算,所以这方面的效率提升是显而易见的。而其他增量构建只是维持之前的情况。特别想问一下APK体积——对比了开启和关闭PNG压缩后的APK体积,发现前后体积变化不大,说明本项目使用的PNG图片已经进口前经过充分加工。优化,PNG压缩在这里是多余的。Tip6:使用ApplyChanges从AndroidStudio3.5版本开始(3.5版本目前在Beta构建通道中发布),开发者可以使用ApplyChanges功能来提高构建性能,它可以让代码和资源更改直接生效,无需重启应用程序,有时甚至无需重新启动当前Activity。不同于InstantRun的实现,ApplyChanges充分利用了Android8.0及以上操作系统进行运行时检测的特性,从而动态重定义类。因此,如果你想使用ApplyChanges,你需要让你的项目运行在Android8.0(API级别26)或更高版本的真实设备或模拟器上。Tip7:避免被动更改让我们用一个小例子来说明这个tip:我们将项目的版本号设置为一个基于当前时间的数字(其实你不应该这样做),结果是版本号是每次构建都会new,项目的manifest文件也会随之变化。最终的结果是拖慢了构建速度。如您所见,我们发现增量构建时间甚至翻了一番,所以尽量不要在构建脚本中添加太多废话。解决这个问题并不难。我们可以判断构建脚本中是否有devBuild标志。如果是这样,我们可以将版本号设置为固定值。在这个例子中,我们故意在构建脚本中放了一些乱七八糟的代码来展示它会造成的破坏。同时,我也会给出一个使用Crashlytics时的实际例子。本插件默认会为每次构建添加一个唯一的ID作为构建标识,这样会造成不必要的时间损失。你可以在buildscript中加上ext.alwaysUpdateBuildId=false来避免这种情况,当然你也可以在开发阶段选择完全关闭Crashlytics。Tip8:不要使用动态版本标识Gradle提供了一个非常方便的依赖库版本号管理功能,方便开发者使用加号“+”表示要使用这个依赖库的最新版本。但是,使用动态版本存在一些风险。从性能上看,Gradle每24小时会检查一次依赖库的更新。如果你的依赖库很多,并且使用了动态获取最新版本的设置,那么会对构建时的性能造成一定的影响。即使你不是特别在意这些性能损失,它仍然是有风险的——依赖库的版本更新会让你的构建充满不确定性,两周后你可能正在构建一个完全不同的项目,因为更新到依赖库代码对开发人员是不可见的。Tip9:Gradle内存分配调优在默认的构建环境下,我们会给Gradle分配1.5G的内存,但这并不是对所有项目都适用,你需要调优这个数字以获得最适合你项目的最佳Gradle内存分配.同时,从AndroidGradleplugin2.1版本开始,dex已经默认在进程中,所以如果之前设置过javaMaxHeapSize的值,可以选择删除。技巧10:启用Gradle构建缓存Gradle的新缓存机制运行良好。我们建议您尝试启用它。最新的Gradle支持对Kotlin项目使用构建缓存,构建速度可以大大提升。Gradle的构建缓存默认是禁用的。您可以通过在命令行中添加--build-cache参数或在项目根目录中的gradle.properties中添加org.gradle.caching=true来为所有人启用构建缓存。您可以在本文档中了解有关Gradle构建缓存的更多信息。关于Gradlebuildcachehttps://docs.gradle.org/current/userguide/build_cache.html在实践了所有提速技巧后总结了整体的提升,fullbuild的速度比之前快了三倍以上,并且代码变更增量构建提速12倍以上,我们在GitHub上创建了代码仓库,大家可以下载练习我们今天提到的构建速度提升技巧。有关如何提高应用程序构建速度的更多信息,请参阅我们的官方文档。代码仓库https://github.com/jmslau/santa-tracker-android官方文档https://developer.android.google.cn/studio/build/optimize-your-build
