博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[译] 怎样减少 Android 应用包 60% 的大小?
阅读量:6421 次
发布时间:2019-06-23

本文共 1863 字,大约阅读时间需要 6 分钟。

简评:应用的大小也是用户体验的一个重要方面,而减少 Android 应用安装包大小其实一点也不复杂。

对于移动应用来说,应用安装包的大小当然是越小越好。特别是对于一些欠发达地区,你不希望用户因为手机「存储空间不足」而卸载你的应用。

本文就介绍了几个小技巧来有效减少 apk 的大小:

首先,我们先用 Android Studio 提供的 APK Analyser 工具来分析下我们的 apk 文件:

apk
可以看到占空间最多的主要是三个部分:classes.dex, res 和 resources.arsc。

  • classes.dex:包含有 Java 代码的字节码文件。
  • res:包含了资源文件,比如图片、布局文件等等。
  • resources.arsc:包含所有的值资源文件,如 strings, dimensions, styles, integers 等等。

classes.dex

classes.dex 文件的大小完全取决于程序中方法数的多少。在上面展示的例子中,包含了 4392 个类和 29897 个方法。这个结果是默认没有使用 proguard 的。我们有两个默认的 proguard 文件可以使用:

从名字上就可以看出,proguard-android-optimize.txt 是更加激进的 proguard 配置,包括和 proguard-android.txt 相同的 ProGuard 规则,但还包括其他在字节码一级(方法内和方法间)执行分析的优化,以进一步减小 APK 大小和帮助提高其运行速度。

可以像这样来使用:

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,会告诉 proguard 删除所有未使用的方法和指令,进一步的减少 .dex 文件的大小。

.dex
方法数从 29897 减少到了 15168,大小从 3.1MB 减少到了 1.98 MB。

res

对于 res 文件夹,通常占空间最大的就是图片了。如果你的 Android Studio 为 2.3,并且项目的 minimum version 为 18 或以上,应该使用 webp 而不是 png 图片。webp 图片有更小的体积,图片质量还没有什么损失。

我们可以选中 drawable 和 mipmap 文件夹,右键后选择 convert to webp,将图片转为 webp 格式。

webp
转换的结果:
res

我们还可以在 build.gradle 中设置 shrinkResources 属性为 true,这会在打包时删除未使用的资源:

release{  //...  //...  shrinkResources true  //...}复制代码

另外如果你的应用不需要支持国际化,那么可以设置 resConfigs 为 "zh","en",即只支持中英文:

defaultConfig {    //...    //...    //...    resConfigs "zh","en"}复制代码

这么做是因为对于官方的 support library,默认是支持国际化的,也就是包含了很多不同语言的资源文件,我们就可以通过这样设置来移除用不到的语言资源文件。

通过上面的设置,这个 App 的安装包大小从 3.19MB 减少到了 1.89MB。当然还有很多其他的减少 apk 大小的技巧,但这里介绍的技巧是完全可以作为你项目的默认设置。


知乎专栏:

原文链接:

极光日报,极光开发者 的 Side Project,每天导读三篇国外技术类文章,欢迎关注。

转载地址:http://gvlra.baihongyu.com/

你可能感兴趣的文章
Ubuntu 16.04中XMind 8导致Java内存溢出的问题解决(硬盘卡死,桌面卡死)
查看>>
mysql中函数greatest 与MAX区别
查看>>
GreenDao3.0新特性解析(配置、注解、加密)
查看>>
spring 使用注解注入 list 或 map
查看>>
Ora2Pg的安装和使用
查看>>
A Basic Example of Threads Synchronization in Python, python中的线程同步示例
查看>>
CVE-2016-10191 FFmpeg RTMP Heap Buffer Overflow 漏洞分析及利用
查看>>
Must Know Tips/Tricks in Deep Neural Networks (by Xiu-Shen Wei)
查看>>
关于SVM(support vector machine)----支持向量机的一个故事
查看>>
GDB 常用命令 ***
查看>>
[Oracle][Metadata]如何查找与某一个功能相关的数据字典名
查看>>
Ubuntu环境下IPython的搭建和使用
查看>>
Linux中查看系统版本的方法
查看>>
GPU的线程模型和内存模型
查看>>
概率校准Probability Calibration
查看>>
Activity 5秒 Broadcast 10秒 Service 20秒
查看>>
linux 上配置tomcat、mysql 开机启动
查看>>
定制rpm包-Yum环境搭建
查看>>
回滚机制——《亿级流量》
查看>>
PHP7 学习笔记(十)会话控制
查看>>