优化编译速度
优化编译配置项
下面的提示能提高AS工程改的编译速度
保持工具的更新
创建一个用于开发的编译变量
一些配置用于release版本,并不需要在开发当中。那些不需要的编译过程拖慢编译速度。
下面有两个产品类,dev和prod(release)
android {
...
defaultConfig {...}
buildTypes {...}
productFlavors {
// 当编译时会覆盖defaultConfig块的配置
dev {
// 命令行编译时禁止使用multidex, 当AS大于等于2.3,minSdkVersion大于等于21时,当发布运行时,编译会自动禁止multidex
minSdkVersion 21
versionNameSuffix "-dev"
applicationIdSuffix '.dev'
}
prod {
// 如果release版本配置在defaultConfig,那这里只需要创建空的块,否则会继承"dev"的配置
}
}
}
组合产品类 flavorDimensions
如下会生成(Dev|Pro)(Demo|Full|)
android {
...
defaultConfig {...}
buildTypes {...}
// Specifies the flavor dimensions you want to use. The order in which you
// list each dimension determines its priority, from highest to lowest,
// when Gradle merges variant sources and configurations. You must assign
// each product flavor you configure to one of the flavor dimensions.
flavorDimensions "stage", "mode"
productFlavors {
dev {
dimension "stage"
minSdkVersion 21
versionNameSuffix "-dev"
applicationIdSuffix '.dev'
...
}
prod {
dimension "stage"
...
}
demo {
dimension "mode"
...
}
full {
dimension "mode"
...
}
}
}
避开编译不需要资源
编译和打包资源禁止一些不需要的语言包和屏幕必读资源。
这个配置只能在开发类下使用
android {
...
productFlavors {
dev {
...
//这是英语资源和xxhdpi密度
resConfigs "en", "xxhdpi"
}
...
}
}
取消Crashlytics
如果不需要跑异常统计报告时,取消这个插件可以加快编译速度
android {
...
buildTypes {
debug {
ext.enableCrashlytics = false
}
}
也可以在运行是取消Crashlytics 工具, 在应用中做Fabric的初始化
// Initializes Fabric for builds that don't use the debug build type.
Crashlytics crashlyticsKit = new Crashlytics.Builder()
.core(new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build())
.build();
Fabric.with(this, crashlyticsKit);
如果想使用Crashlytics,可以加速编译。
android {
...
buildTypes {
debug {
ext.alwaysUpdateBuildId = false
}
}
使用静态编译配置
在release时需要动态配置属性参数时,有可以避开debug模式。这样
manifest 就不用重新生成。
int MILLIS_IN_MINUTE = 1000 * 60
int minutesSinceEpoch = System.currentTimeMillis() / MILLIS_IN_MINUTE
android {
...
defaultConfig {
// Making either of these two values dynamic in the defaultConfig will
// require a full APK build and reinstallation because the AndroidManifest.xml
// must be updated (which is not supported by Instant Run).
versionCode 1
versionName "1.0"
...
}
// The defaultConfig values above are fixed, so your incremental builds don't
// need to rebuild the manifest (and therefore the whole APK, slowing build times).
// But for release builds, it's okay. So the following script iterates through
// all the known variants, finds those that are "release" build types, and
// changes those properties to something dynamic.
applicationVariants.all { variant ->
if (variant.buildType.name == "release") {
variant.mergedFlavor.versionCode = minutesSinceEpoch;
variant.mergedFlavor.versionName = minutesSinceEpoch + "-" + variant.flavorName;
}
}
}
使用静态依赖版本
当声明依赖时,避免使用plus + 号指定版本号,例如:’com.android.tools.build:gradle:2.+’,使用动态版本时导致异常版本更新,解决版本不同也会困难,并且在检查更新时拖慢编译。
离线模式
如果处在慢网络下,采用离线模式,避免Gradle试图使用网络解决依赖。
按需启动配置
Gradle在每次编译时会对app里的所有模块和不依赖配置。在大型多模块项目会拖慢编译进度,高度Gradle只配置想要编译的模块。
创建lib模块
将代码转换成lib模块。模块后的代码只有在修改以后才会编译,其他时间会Cache起来。
配置dexOptions,启动library预编译
Android插件提供了dexOptions块,我们可以如下配置DEX编译属性提高编译速度。
- preDexLibraries 声明预编译lib依赖提高增量构建速度。可能会拖慢清理构建。
- maxProcessCount 设置最大构建运行线程数量 默认4
- javaMaxHeapSize 设置最大运行DEX堆大小。另外一种方案,设置Gradle的堆大小,具体看下一跳。
android {
...
dexOptions {
preDexLibraries true
maxProcessCount 8
// Instead of setting the heap size for the DEX process, increase Gradle's
// heap size to enable dex-in-process. To learm more, read the next section.
// javaMaxHeapSize "2048m"
}
}
增加Gradle的堆大小和启动dex-in-process
Dex-in-process是让DEX编译在整个编译进程中,而不是分开增量和清理构建两个独立进程快。当AS2.1以后再足够内存情况下回默认开始这个特性。
在gradle.properties中设置堆大小。
org.gradle.jvmargs = -Xmx2048m
图片转换成WebP格式
WebP是一个有损压缩的透明格式,它减少了图片大小,而且节省了在编译过程中压缩时间。然而,当设备解压WebP图片时也会增加少许解压时间。
转换Webp看这里
关闭PNG压缩
如果图片不想转换成WebP,也可以通过关闭自动压缩图片来提交编译速度。
android {
...
aaptOptions {
cruncherEnabled false
}
}