越小越好
作为一个开发者我们总是更关心应用的性能,设计和用户体验。但是,大多数开发者都忘了(或低估)一件事:应用体积。如果你希望你的应用能吸引大量用户,这是非常核心的一点。
市场上大概有 11000 种安卓机型,而其中大部分都是低端机,有限的存储(1GB 到 8GB),甚至用的还是 2G 或者 3G 网络。这些设备在印度,巴其尔等非洲发展中国家占有大量市场,你可以在这些地方获得大量的用户。
让你的应用大小保持最佳变得尤其重要。你的应用体积越小,你的用户就有更多的空间来存储他们的视频和图片。说实话,你肯定不希望用户因为“存储空间不足”的提示删除你的应用。
如果用户的存储空间不够的话,他们会卸载你的应用。
这些发展中国家用户使用的依然是速度有限的 2G/3G 网。所以,如果你的应用体积太大,将会需要更多的时间来下载(更可能的情况时用户根本不会去下载)。同样的,大多数用户流量有限,用户下载的每个字节都是在花钱。
所以,很明显了,应用程序界的真理就是:
越小越好
单个的 classes.dex 文件可以容纳大约 64K 方法。如果你达到了这个限制,你必须要在你的工程中启用 multidexing。这将会创建另一个 classes1.dex 文件去存储剩下的方法。所以 classes.dex 文件数目由你的方法数而定。
你可以看到现在的 “Anti-Theft Screen Lock” 包含 4392 个类和 29897 个方法。这个结果是没有经过混淆的。你有两个默认的混淆文件。
proguard-android-optimize.txt
proguard-android.txt
就像文件名写的那样,“proguard-android-optimize.txt”是更积极的混淆选项。我们将这个作为默认的混淆配置。你可以在 /app 目录下的 proguard-rules.pro 里添加自定义的混淆配置。
release {
//Enable the proguard
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), "proguard-rules.pro"
//Other parameters
debuggable false
jniDebuggable false
renderscriptDebuggable false
signingConfig playStoreConfig //Add your own signing config
pseudoLocalesEnabled false
zipAlignEnabled true
}
通过设置 minifyEnabled 为 true,混淆将会移除所有未使用的方法、指令以减小 classes.dex 文件。
这是启用了 minify 之后的 APK。
你可以看到在为每个模块启用了混淆之后我们的 classes.dex 大小减小了几乎 50%。同时你可以看到方法数从 29897 降到了 15168(几乎 50%)。恭喜……��
体积从 3.1MB 降到了 1.98MB。(缩小约 50%)
减小 res:
下一大块就是 res 文件夹,它包括了所有的图片,raw 文件和 XML。你不能添加/删除/修改你的 XML,因为它们包含了你的布局。但是我们可以减小图片文件。
“shrinkResources” 属性将会移除所有在工程中没有用到的资源。在 build.gradle 中像下面这样启用它:
release{
//...
//...
shrinkResources true
//...
}
resConfigs
“resConfigs” 属性将会在构建过程中移除所有本地化资源。app “Anti-Theft Screen Lock” 只需要支持英语。而很多的支持库都可能有其它语言的本地化文件夹。这些是我不需要的。所以,添加下面的这些代码让应用只支持英语。
defaultConfig {
//...
//...
//...
//strip other than english resources
resConfigs "en"
}
如果你在用 Android Studio 2.3,并且你的应用的最低支持版本大于 18,你可以使用 webp 替代 png。webp 图片比 png 体积更小但质量一样。而且 Android 支持 webp。所以你可以在 ImageView 中像加载其它光栅图片一样加载 webp 图片。这不需要改变你的布局。
你可以在工程选择 drawable 和 mipmap 文件夹,右击并选择 convert to webp。这将会打开下面这样的配置弹框。
点击 ok,将会将所有 png 图片转成 webp。如果 webp 图片比 png 更大,Android Studio 将会自动跳过这个文件。
让我们看下最终效果:
喔!!!res 文件夹从 710KB 降到了 597KB。
体积减小了 105KB。(降低了 16%)
你也可以将图片转为矢量图。但是这样你需要对它的向后兼容性进行一些处理。如果你想了解更多 vector 的相关知识,看看 Chris Banes 的这篇博客。