怎样减少 Android 应用包 60% 的大小?

监控侠 (MonitorX)
• 阅读 3473
简评: 应用的大小也是用户体验的一个重要方面,而减少 Android 应用安装包大小其实一点也不复杂。

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

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

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

怎样减少 Android 应用包 60% 的大小?

可以看到占空间最多的主要是三个部分: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 文件的大小。

怎样减少 Android 应用包 60% 的大小?
方法数从 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 格式。

怎样减少 Android 应用包 60% 的大小?

转换的结果:

怎样减少 Android 应用包 60% 的大小?

我们还可以在 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

欢迎关注微信号「极光开发者」

点赞
收藏
评论区
推荐文章
ndows 11 Beta 预览版用户已经可以体验 Android 应用
今天,微软正式宣布:Beta通道用户已经可以体验Windows11运行Android应用功能。体验此功能需要将电脑的地区设置为“美国”。可以前往Windows11设置时间&语言语言和地区设置页面,将国家和地区设置为美国即可。由于Dev通道目前还处在“不适合大众体验”的阶段,因此Android应用支持还需要等一段时间。
Wesley13 Wesley13
3年前
mysql编码排序规则
1、gbk\_chinese\_ci和gbk\_bin:如果设置为 gbk\_chinese\_ci,表数据包括索引判断不区分大小写;设置为gbk\_bin区分大小写。原因:gbk\_chinese\_ci:非二进制存储,不区分大小写gbk\_bin:以二进制形式进行存储,区分大小写2、如何修改排序规则SELECTCONC
Stella981 Stella981
3年前
Android CheckBox修改大小、边框颜色,以及自定义CheckBox;
CheckBox修改大小:android:scaleX"0.8"android:scaleY"0.8"CheckBox修改边框颜色,注意不是背景色:android:buttonTint"@color/colorAccent"修改大小和边框颜色:
Wesley13 Wesley13
3年前
2.Redis数据类型
Redis中存储数据是通过keyvalue存储的,对于value的类型有以下几种:字符串Hash类型ListSetSortedSet(zset)注:在redis中的命令语句中,命令是忽略大小写的,而key是不忽略大小写的。1String类型1.1  命令
Wesley13 Wesley13
3年前
mysql在LINUX和WINDOWS系统下设置表名不区分大小写
1.在LINUX系统下,表的名称是区分大小写的,而在WINDOWS环境下,表名不区分大小写;2.设置表名不区分大小写:WINDOWS环境下,修改mysql安装目录下的my.ini配置文件,在【mysqld】下添加lower\_case\_table\_names的参数,将参数值设置为0区分大小写,设置为1不区分大小写
Stella981 Stella981
3年前
2020年了,Android后台保活还有戏吗?看我如何优雅的实现!
1、引言对于移动端IM应用和消息推送应用的开发者来说,Android后台保活这件事是再熟悉不过了。自从AndroidP(即Android8.0)出现以后,Android已经从系统层面将后台保活这条路给堵死了(详见:《AndroidP正式版即将到来:后台应用保活、消息推送的真正噩梦(https://www.oschina
Stella981 Stella981
3年前
Android memory leaks(摘抄)
至少在TMobileG1上Android应用在堆上分配的内存大小被限制16MB以内。对于手机来说,这是个不小的内存,但是这仍然远远不能满足一些开发者的需求。但是,即使你不打算使用所有的内存空间,你也应该尽可能地少用内存,从而使得其他应用能够运行而不是被杀掉。因为Android能够在内存中保持的应用越多,那么用户切换应用的速度就会越快。作为我工作的一部分,
可莉 可莉
3年前
2020年了,Android后台保活还有戏吗?看我如何优雅的实现!
1、引言对于移动端IM应用和消息推送应用的开发者来说,Android后台保活这件事是再熟悉不过了。自从AndroidP(即Android8.0)出现以后,Android已经从系统层面将后台保活这条路给堵死了(详见:《AndroidP正式版即将到来:后台应用保活、消息推送的真正噩梦(https://www.oschina
Stella981 Stella981
3年前
Creator优化心得:减少脚本文件的大小
星期2是公众号更新的一个时间点,Shawn这几天情事太多,眼看就快要过12点了,公众号教程看来今天黄呀!但是不发晚上睡不着呀,看来我是中了得到罗胖的毒“死磕自己”,一定要把公众号给发了。还好之前留着大神Colin的一些文章,还没在公众号上推送过,我立马读了一下,任然有不少收获,现将这篇文章分享给大家,在此感谢Colin!!(https://o
Stella981 Stella981
3年前
Flink 1.8.0中的状态生存时间特性:如何自动清理应用程序的状态
对于许多状态流式计算程序来说,一个常见的需求是自动清理应用程序的状态(state),以便有效地控制状态大小,或者控制程序访问状态的有效时间(例如受限于诸如GDPR等法律条规)。ApacheFlink自1.6.0版本引入了状态的生存时间(timetolive,TTL)功能,使得应用程序的状态清理和有效的状态大小管理成为可能。在本文中,我们将讨论引入状