怎样减少 Android 应用包 60% 的大小?
简评: 应用的大小也是用户体验的一个重要方面,而减少 Android 应用安装包大小其实一点也不复杂。
对于移动应用来说,应用安装包的大小当然是越小越好。特别是对于一些欠发达地区,你不希望用户因为手机「存储空间不足」而卸载你的应用。
本文就介绍了几个小技巧来有效减少 apk 的大小:
首先,我们先用 Android Studio 提供的 APK Analyser 工具来分析下我们的 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 文件的大小。

方法数从 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 格式。

转换的结果:

我们还可以在 build.gradle 中设置 shrinkResources 属性为 true,这会在打包时删除未使用的资源:
release{
//...
//...
shrinkResources true
//...
}
另外如果你的应用不需要支持国际化,那么可以设置 resConfigs 为 "zh","en",即只支持中英文:
defaultConfig {
//...
//...
//...
resConfigs "zh","en"
}
这么做是因为对于官方的 support library,默认是支持国际化的,也就是包含了很多不同语言的资源文件,我们就可以通过这样设置来移除用不到的语言资源文件。
通过上面的设置,这个 App 的安装包大小从 3.19MB 减少到了 1.89MB。当然还有很多其他的减少 apk 大小的技巧,但这里介绍的技巧是完全可以作为你项目的默认设置。
原文链接: How you can decrease application size by 60% (In only 5 minutes)?
推荐阅读: Android Package Name vs. Application ID
欢迎关注微信号「极光开发者」
怎样减少 Android 应用包 60% 的大小?的更多相关文章
- Android导包导致java.lang.NoClassDefFoundError
摘要: SDK方法总数是不能超过65k的.是否也引入其他的三方库,导致总数超过限制.超出限制会导致部分class找不到,引发java.lang.NoClassDefFoundError.解决方法:近日 ...
- 新一代开源Android渠道包生成工具Walle
本文转自:http://tech.meituan.com/android-apk-v2-signature-scheme.html 新一代开源Android渠道包生成工具Walle 新的应用签名方案A ...
- Android Studio 主题、字体大小的设置
1. Android Studio 主题的设置: 设置Android Studio 自带的主题 设置第三方主题 2. Android Studio 字体的设置 设置左面包名的字体大小 设置右面代码编辑 ...
- HttpCanary——最强Android抓包工具!
迎使用HttpCanary——最强Android抓包工具! HttpCanary是一款功能强大的HTTP/HTTPS/HTTP2网络包抓取和分析工具,你可以把他看成是移动端的Fiddler或者Char ...
- 关于iOS和android自定义包的名字
自定义包名的使用,android的包名和ios的包名都是你的自定义包名!如下以新浪微博SDK自定义包名示例:(官方没的,自己踩过坑,方便后来人吧) 相关技术文档:http://www.apicloud ...
- Android抓包方法(三)之Win7笔记本Wifi热点+WireShark工具
Android抓包方法(三) 之Win7笔记本Wifi热点+WireShark工具 前言 做前端测试,基本要求会抓包,会分析请求数据包,查看接口是否调用正确,数据返回是否正确,问题产生是定位根本原因等 ...
- Android抓包方法(二)之Tcpdump命令+Wireshark
Android抓包方法(二) 之Tcpdump命令+Wireshark 前言 做前端测试,基本要求会抓包,会分析请求数据包,查看接口是否调用正确,数据返回是否正确,问题产生是定位根本原因等.学会抓包分 ...
- Android抓包方法(一)之Fiddler代理
Android抓包方法(一) 之Fiddler代理 前言: 做前端测试,基本要求会抓包,会分析请求数据包,查看接口是否调用正确,数据返回是否正确,问题产生是定位根本原因等. 不管是之前做HTML5手机 ...
- Android之hint提示字体大小修改,显示完全
Android之hint提示字体大小修改,显示完全 1.工作中遇到一个问题,就是自定义EditText的hint提示在超大字体下会显示不全, 2.然后在网上搜索了一下,在这里记录一下,分享给大家,在此 ...
随机推荐
- docker-compose部署redis-cluster
node1-node6 1.到http://download.redis.io/redis-stable/redis.conf下载官方redis.conf文件 2.修改对应端口 # bind 127. ...
- Python_序列对象内置方法详解_String
目录 目录 前言 软件环境 序列类型 序列的操作方法 索引调用 切片运算符 扩展切片运算符 序列元素的反转 连接操作符 重复运算符 成员关系符 序列内置方法 len 获取序列对象的长度 zip 混合两 ...
- mysql登录的三种方式
1.远程登录mysql 先授权:如:grant all on *.* to 'root'@'192.168.81.130' identified by '52033dd';查看是否生效:select ...
- HDP-2.6.0.3
http://public-repo-1.hortonworks.com/HDP/centos6/2.x/updates/2.6.0.3/HDP-2.6.0.3-centos6-rpm.tar.gz ...
- 【BW系列】SAP 讲讲BW/4 HANA和BW on HANA的区别
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[BW系列]SAP 讲讲BW/4 HANA和BW ...
- Ubuntu环境配置机器安装驱动
ubuntu_environment_config.md thead > tr > th { text-align: left; border-bottom: 1px solid; } t ...
- 如何在CBV中使用装饰器
要区分函数装饰器和方法装饰器得区别 ,方法装饰器得第一个参数是self本身,所以函数装饰器不能用
- HTTP 请求消息头部实例:
HTTP 请求消息头部实例: Host:rss.sina.com.cn //客户端指定自己想访问的WEB服务器的域名/IP 地址和端口号User-Agent:Mozilla/5.0 (W ...
- angular [NgClass] [NgStyle],NgIf,[ngSwitch][ngSwitchCase]
[NgClass] CSS 类会根据表达式求值结果进行更新,更新逻辑取决于结果的类型: string - 会把列在字符串中的 CSS 类(空格分隔)添加进来, Array - 会把数组中的各个元素作 ...
- Nmap Windows 版本时区显示乱码
Nmap 版本 $ nmap --version Nmap version 7.80 ( https://nmap.org ) Platform: i686-pc-windows-windows Co ...