本文已得到原做者受权赞成,翻译以及转载 原文连接:Build your Android app Faster and Smaller than ever 做者:Jirawatee 译文连接:Gradle更小、更快构建APP的奇淫技巧 翻译人:MrTryingandroid
上个月,我有机会在 LINE DEVELOPER DAY 2018 发表演讲。对我来讲是特殊的时刻,由于这是我第一次在日本演讲。在成为演讲者以前,LINE 活动的工做人员必须向全球团队提交他们的演讲。面试
我提交的主题是关于如何更快构建 Android App,以及如何生成更小的 APK 的一些技巧。这些提示来自于个人经验和 Google I/O,特别是在 Developer Build Clinic 中收集到的。Developer Build Clinic 是 Android Studio 团队为改进构建性能方面提供的一对一咨询。安全
在本文中,我想与你分享这些技巧和 app,给你带来的 app 是 LINE MAN Driver。bash
对于不知道 LINE MAN 是什么的人来讲,它是一个按需助理提供专业服务的 app,包括食物配送、便利店货物配送、信使服务、包裹服务和出租车服务,随时知足全部泰国用户的需求。app
请注意,实际结果可能会有所不一样,由于它取决于您的项目特征和构建环境,例如项目规模、资源、依赖关系和机器性能。框架
APK 的大小将会影响 app 的加载速度、内存占用以及电量消耗。我想大多数人都知道,APK 大小是用户参与度的重要因素。让咱们来看看当前在 LINE MAN Driver 中 app 的大小。jvm
优化 APK,快速的建议是使用 Android Studio 的APK Analyzer。打开 Android Studio ,而后选择Profile or debug APK,浏览你的 APK 文件。ide
大多数人都是在遗留项目中开发,有不少图片、布局和string你历来没有用过,可是你不知道也不想本身删除它,由于你惧怕会让你的 app 崩溃,对吗?因此,在 Android Studio 中,它提供了Remove Unused Resources的选项。布局
它对咱们很是有帮助,由于他能自动找到无用的资源,而后你能一键删除它们。性能
有些依赖内部包含了一堆库,像play-services和FaceBook SDK。若是你没有指定你须要的库,那你将得到所有的库,让你的 app 变胖。例如,若是你想使用 Google 受权,你应该指定com.google.android.gms:play-services-auth:16.x.x代替com.google.android.gms:play-services:16.x.x。
你能够经过下面的命令来细分项目的依赖
$ ./gradlew app:dependencies
复制代码
你将看到在项目中用到的全部的依赖,而后确保只用你所须要的。
默认状况下,Android Studio 将会生成一个包含全部屏幕密度的通用 APK。在此技能中,你能专门排除或包含你想要在app/build.gradle支持的屏幕密度,Android Studio 将会为你生成多个 APK。
android {
splits {
density {
enable true
// Specify a list of screen densities which Gradle won't create multiple APKs for exclude 'ldpi', 'mdpi' // Specify a list of compatible screen size for the manifest compatibleScreens 'small', 'normal', 'large', 'xlarge' } } } 复制代码
因此,你须要将他们全部都上传到 Google Play,最终你的用户将会下载与他们屏幕密度匹配的 APK。
这个技巧和前一个技巧类似,可是此技巧是用于支持Application Binary Interfaces(ABIs)。今天,我认为 Android 市场中有7个 CPU 框架,其中3个很难找到(mips,mips64,armeabi),以此你能够在app/build.gradle指定你想要支持的 ABI,Android Studio 将会为你生成多个 APK。
android {
splits {
abi {
enable true
reset()
// Specify a list of ABIs that Gradle should create APKs for
include 'x86', 'x86_64', 'arm64-v8a', 'armeabi-v7a'
// If you don’t want to generate a universal APK that includes all ABIs.
universalApk false
}
}
}
复制代码
而后,你须要将他们全部都上传到 Google Play,最后你的用户将会下载与他们 CPU 匹配的 APK。
这个技巧不一样于多个 APK。你能指定你想要支持的 CPU 框架,Android Studio 将只生成一个 APK。
android {
defaultConfig {
...
ndk {
abiFilters 'x86', 'x86_64', 'arm64-v8a', 'armeabi-v7a'
// armeabi, mips and mips64 has removed since NDK r17
}
}
}
复制代码
根据个人经验,我更喜欢这个技巧,由于我曾经在多个APK的状况中在某些设备上发现了崩溃。
有时,你建立一个本地的 app,你只想支持一些特殊的语言。可是,有一些依赖包含全世界的不少语言,你不须要全部的这些。所以,你可使用resConfigs
属性指定你想要的语言,你的 app 将更小。
android {
defaultConfig {
resConfigs 'en', 'th'
...
}
}
复制代码
默认状况下,Android Studio 的 minifyEnabled为false,但我认为不少人为了更小和安全因素把它设置为true来缩小和混淆你的代码。我建议你在app/build.gradle中添加shrinkResources,在压缩(minify)进程以后删除无用的资源。由于在压缩中,gradle将移除无用的代码,这些代码可能会引用一些资源。
最后,我想大多数人都不知道-optimize。你能在proguard-android以后添加-optimize,它将为你构建 app 作更多的优化,你的 app 将会更小。
android {
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
复制代码
请注意,此过程将花不少时间,因此你应该只在发布快中使用
-optimize
。
有时候,我看到开发者使用Bitmap的渐变背景或者圆角图。实际上,bitmap图比 Android Studio 提供的Shape Drawable更大,由于在Shape Drawable中,你能够以xml
的格式绘制矩形、椭圆、圆、圆角和其余。
相同质量下 Webp 更小,最多30%。惟一须要注意的是操做系统的要求。若是你使用不透明的背景,Webp 的 API 等级是API 15及以上支持。可是若是你想在 Webp 中支持透明背景,你须要支持API 18或者更高,Android Studio 还为您提供了一种将图像转换为 WebP 格式的简便方法。你能够右击你想要的图片,选择Convert to WebP,而后你会看到下图。
所以,让咱们看一个示例结果,图像尺寸减少到原始尺寸的15%,质量为90%。
从API 21起,确保vector比bitmap更小,你能使用vector代替bitmap图片。由于VectorDrawable能以相同质量的图,下降大小到不一样屏幕密度。
若是你正在支持minSdkVersion 20或者更低。别担忧,你能够用它。由于 Android 团队提供了一个库。所以你只须要使用23.2及其以上支持库。
这是在应用这些技巧后所累积的改进
从 Android Studeio 3.2 开始,Android App Bundle是一种新的 app 发布格式,可让你的 app 小的更轻松。你不须要添加一行代码,只须要使用新方法导出便可。所以,当你下载你的 app 时,Google Play 动态传输指定设备须要的代码和资源。
经过这种方式你不须要本身构建多个 APK 了。
请注意,文件扩展名师.aab,你须要花更多的时间来构建,但这是值得的。
和 Android 开发者想要改进的同样,构建速度对工做效率相当重要。从这个问题我有10个技术能够更快的构建 LINE MAN Driver app。
优化以前,我想让你看看 LINE MAN Driver app 如今在 Android Studio 3.2.1 的完整构建速度。
如今构建 LINE MAN Driver 的时间是3分钟。
第一个技术,确保你的 Android Gradle plugin 是最新的。由于有不少错误修复和性能问题被修复。
buildscript {
repositories {
jcenter()
google()
}
dependencies {
- classpath 'com.android.tools.build:gradle:3.0.0'
+ classpath 'com.android.tools.build:gradle:3.2.1'
}
...
}
复制代码
第二个技术是避免 Legacy Multidex。如你所知,若是你的 app 超过64k方法限制,你须要使用 Multidex。若是你的的minSdkVersion是21或更低,你也是用 Multidex,那么你将使用 Legacy Multidex,这会使你在构建时变慢。
要避免 Legacy Multidex,你能够定义新的flavor,并在app/build.gradle中指定minSdkVersion为21或更高。
productFlavors {
development {
minSdkVersion 21
...
}
}
复制代码
第三个技术,你应该在开发构建环境禁用多个 APK 生成,由于打包和建立这些 APK 须要时间。因此,你能在app/build.gradle的 debug 代码块中添加如下两行代码禁用它。
buildTypes {
...
debug {
splits.abi.enable = false
splits.density.enable = false
}
}
复制代码
在你开发构建中最小化打包的资源。默认状况下,构建系统包含 app 和库使用的全部语言和屏幕密度。开发期间你不须要用到全部的这些资源,你能经过添加resConfigs来使用这些资源中的一组,并指定开发构建所需的语言和屏幕密度。
productFlavors {
dev {
resConfigs('en', 'xhdpi')
...
}
}
复制代码
默认状况AAPT将会缩进PNG来减少它们的大小,对于你发布 APK 是一件好事,可是它对于你开发构建并不重要。要避免PNG
缩紧,你可使用下面的属性并将其设置为false。
buildTypes {
...
debug {
aaptOptions.cruncherEnabled = false
...
}
}
复制代码
默认状况下,当你点击 RUN按钮时,系统将会尝试冷切换,app 须要重启,可是当你点击 Apply Changes按钮时,系统将先尝试热交换,这会将更改直接推送到实时进程。
下一个技能是在 Firebase Crashlytyics 中禁用更新构建ID。我想不少人使用 Crashlytics,每次构建 Crashlytics 将默认生成一个惟一的构建ID。你可能不知道他们为你提供了一个关闭它的方式,以下
buildTypes {
debug {
ext.alwaysUpdateBuildId = false
...
}
}
复制代码
你须要注意,只在 debug 块中设置为false。
Gradle 经过在依赖行末尾添加+,提供一种很是方便获取每一个依赖的最新版本。它将使 Gradle 每24小时检查库的新版本,并增长构建时间。
android {
dependencies {
implementation 'com.android.support:appcompat-v7:+'
...
}
}
复制代码
这里的代码是我从 Android 开发经验中收集的配置。对我而言,它们就像一种魔法,能够帮助你更快地构建 app。
例如,默认状况下,Android Studio 会为你提供1.5GB的内存,这多是好事或坏事,由于它实际上取决于你项目的特征。
org.gradle.jvmargs=-Xmx4096m -XX:MaxPermSize=1024m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
org.gradle.daemon=true
org.gradle.parallel=true
org.gradle.configureondemand=true
org.gradle.caching=true
android.enableBuildScriptClasspathCheck=false
复制代码
所以,我鼓励你尝试这些配置,我保证你将节省大量的建设时间。
下一步是什么?在即将推出的 Android Studio 3.3 中可使用R8的下一代代码shrinker
。它将减小无用的代码和资源,并缩小您的源代码。所以 Android Studio 声称构建时间和 APK 大小会更小。
让咱们看看,在使用这些技巧以后新的完整建筑速度。如今我花了大约1分钟完成建设。因此此次累积改进,完整版本如今快3倍。
你想象一下,若是你的旧项目比 LINE MAN Driver 程序应用程序更大,你能够减小多少大小以及能够节省多少时间。
如下是我在 LINE DEVELOPER DAY 2018 的演讲中的幻灯片和视频
因此我但愿这些技巧和技巧能够帮助你提升生产力。
Enjoy coding,Thank you!
在这里得到的不只仅是技术!若是您以为不错,欢迎关注和交流!