原文地址:How you can decrease application size by 60% (In only 5 minutes)?
看到这个标题,你可能很感兴趣,当我看到这个标题的时候,我也很感兴趣。其实也就是减小应用体积的一些技巧,网络上也有不少体积优化的相关文章,这里的这些技巧简单易用,可能你会用到。
当App应用做得比较大的时候,应用大小这个事情大家都会关注,毕竟移动设备的资源有限,有限的存储,有限的内存…
你希望你的应用能吸引大量用户,你会考虑应用的性能、设计和用户体验。市场上大概上万种安卓机型,而其中大部分都是低端机,有限的存储(1GB 到 8GB),甚至用的还是 2G 或者 3G 网络。这些设备在印度,巴其尔等非洲发展中国家占有大量市场,你可以在这些地方获得大量的用户。
让你的应用大小保持最佳变得尤其重要。你的应用体积越小,你的用户就有更多的空间来存储他们的视频和图片。说实话,你肯定不希望用户因为“存储空间不足”的提示删除你的应用。
Android Studio 提供了一个有用的工具:APK Analyser。APK Analyser 将会拆解你的应用并让你知道 .apk 文件中的那个部分占据了大量空间。让我们看一下在没有经过优化之前的截图:
从 Apk Analyser 的输出来看,应用的原大小是 24.4MB。经过 Play 商店的压缩,大致是 23.3MB。
从截图中可以看出主要有 3 个文件夹占据了应用的大多数空间。
classes.dex 包含了所有 Java 代码。当你编译你的应用时,gradle 会将你的所有模块里的 .class 文件转换成 .dex 文件并将这些文件合成一个 classes.dex 文件。
单个的 classes.dex 文件可以容纳大约 64K 方法。如果你达到了这个限制,你必须要在你的工程中启用 multidexing。这将会创建另一个 classes1.dex 文件去存储剩下的方法。所以 classes.dex 文件数目由你的方法数而定。
你可以看到现在的我的应用包含 7548 个类和 52763 个方法。这个结果是没有经过混淆的。你有两个默认的混淆文件。
release {
//Enable the proguard
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), "proguard-rules.pro"
//...
}
就像文件名写的那样,“proguard-android.txt”是更积极的混淆选项。我们将这个作为默认的混淆配置。你可以在 /app 目录下的 proguard-rules.pro 里添加自定义的混淆配置。
proguard-android.txt这个默认混淆配置位置是在:sdk目录下 ~sdk\tools\proguard\proguard-android.txt
通过设置 minifyEnabled 为 true,混淆将会移除所有未使用的方法、指令以减小 classes.dex 文件。
可以看到混淆之后的classes.dex的方法数从52763降低到了44895;体积从3.4M降低到了2.3M;
下一大块就是 res 文件夹,它包括了所有的图片,raw 文件和 XML。你不能添加/删除/修改你的 XML,因为它们包含了你的布局。但是我们可以减小图片文件。
release{
//...
//...
shrinkResources true
//...
}
defaultConfig {
//...
//...
//...
//strip other than english resources
resConfigs "zh"
}
如果你在用 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体积大小从4.3M降低到了3.8
最终应用从24.4M降低到了22.5M。看上去想过不明显,主要是使用了环信sdk,我这里没有做libs的优化和没有png转webp。这些只是最简单的方式,还有很多减小应用体积的方法。但是,你应该始终使用上面这些简单的方法来保证已经尽可能的减小了应用体积。