APK瘦身三步曲

前言

背景

115于2009年推出的网络数据在线存储服务,一直以来都有阶段性对应用进行安装包的体积优化,因为公司也没有硬性的指标规定,所以这块的重视程度也一直不高。对比了目前竞品的一个情况,如下:

应用 版本号 大小
115 V8.1.1 50.26M
微云 V6.6.4 37.67MB
百度云 V9.0.2 48.3MB

使用Android Studio的APK Analyzer具体详细分析如下:

目录 115 微云 百度云
res 31.8M +assert 10.2M +assert 17.4M
lib 7M 18.2M 13.1M
classes 7.3M 6.8M 13.9M
resource.arsc 1.9M 1.6M 2.2M

分析

虽然各个应用的功能集不一致,但是主要都是提供存储服务,这里的对比也是从某个层面进行比较。通过分析对比表可以得知。

  1. 微云体积最少,百度云次之,115最大
  2. 115体积主要最大的地方在res图片资源这块
  3. 115的lib及classes是最小的

所以从分析的结果上来看,115的体积优化的主要方向要从res图片资源入手。

瘦身三步曲(删除、压缩、混淆)

删除

删除无用的代码

删除无用的代码,这个放在第一位是因为这个是问题的根源。

随着项目版本的迭代及业务快速的更迭,有时候为了赶时间,废弃的代码及资源都不会及时清理,日积月累的堆积,慢慢APK的体积就会越来越臃肿。

如果属于这种情况,应该先自己进行人工的整理及清除。这个时候可以先不管资源(后面用工具进行清理),但是类相关的调用及无用的类要及时进行清理。否则后面的图片及资源也会照样被识别为有引用,打包进APK。

Lint工具检查

Android Studio给我们提供了强大的检查工具。只需要选中res目录,右键选择Refactor然后再选择Remove Unused Resources。
建议先使用Preview,然后再进行删除。

Lint使用
Lint Preview

这里需要注意,特别有使用第三方的SDK,有些代码是在jar包里面,但是资源独立拷贝进工程,这样也会被识别成无引用的资源。但是这类资源一般都有特定的命名格式。

Grdle配置

android {
        buildTypes {
            release {
                minifyEnabled true //是否开启混淆
                shrinkResources true //压缩
                zipAlignEnabled true ////去掉无用的resourse文件
            }
        }
    }

启用shrinkResources,gradle在打包的时候会自动进行资源的清理。

压缩

PNG压缩优化

推荐使用tinypng

tinypng通过合并图片中相似的颜色,通过将 24 位的 PNG 图片压缩成小得多的 8 位色值的图片,并且去掉了图片中不必要的 metadata(元数据,从 Photoshop 等工具中导出的图片都会带有此类信息),这种方式几乎能完美支持原图片的透明度。有部分文档指出tinypng同时采用了pngquant、optipng、advpng几种脚本。图片的压缩率能达到50%以上。

webp使用

WebP格式,谷歌(google)开发的一种旨在加快图片加载速度的图片格式。无损压缩比PNG文件小45%,即使PNG已经过其他的优化,也能达到28%。缺点,加载比PNG慢。

Android Studio自带了对WebP的转换支持。选中资源,右键Convert to WebP。

PNG 转 WebP

通过删除及压缩前两步的操作,115的优化情况如下:

目录 115 115优化
res 31.8M 26.1MM
lib 7M 7M
classes 7.3M 7.3M
resource.arsc 1.9M 1.8M

优化情况分析:优化后为44.46M,约节省5.8M,优化11%

混淆

Proguard代码混淆

  1. 删除注释和无用的代码
  2. 将java文件文件名及方法名改成短名 a.java

支持的方式也很简单,Gradle默认支持

android {
        buildTypes {
            release {
                minifyEnabled true //是否开启混淆
                 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    }

资源混淆

AndResGuard是一个帮助你缩小APK大小的工具,他的原理类似Java Proguard,但是只针对资源。他会将原本冗长的资源路径变短,例如将res/drawable/wechat变为r/d/a。

具体的原理可参看安装包立减1M--微信Android资源混淆打包工具

集成也非常简单,详细参看Github中的使用说明则可。

通过资源混淆后,115的优化情况如下:

目录 115 115优化 115资源混淆
res 31.8M 26.1MM 25.4M
lib 7M 7M 6.7M
classes 7.3M 7.3M 6.9M
resource.arsc 1.9M 1.8M 280.3KB

优化情况分析:优化后为41.32M,相比没做资源混淆,约节省3.14M,体积优化7%

总结

经过瘦身三步曲的优化后,最终115应用的一个优化情况如下:

目录 115 115最终优化版本
res 31.8M 25.4M
lib 7M 6.7M
classes 7.3M 6.9M
resource.arsc 1.9M 280.3KB

优化情况分析:优化后为41.32M,相比没做优化前,约节省8.94M,体积优化17.7%

115的APK体积优化,现阶段只能说是做了一个初步优化,特别是对于第一步的删除,由于历史的遗留原因。对于一些遗留的代码还待进一步的整理和清除,体积也是还有继续优化的空间。

其他方案

除了常规的瘦身三步曲,对于APK体积当然还有其他的方案。如:

  1. 资源动态加载(如表情包动态下载)
  2. 插件化(动态加载)

方案当然还有很多,本文只介绍常规使用的一些方法,有兴趣的伙伴可以继续深入了解。

参考资料

tinypng

AndResGuard

安装包立减1M--微信Android资源混淆打包工具

关于

欢迎关注我的个人公众号

微信搜索:一码一浮生,或者搜索公众号ID:life2code

image

推荐阅读更多精彩内容

  • 最近几周一直在研究如何为APK瘦身,折腾了很久,是时候写篇博客总结一下了,虽然已经准备了下周一要在客户端周会分享用...
    风清袖一阅读 605评论 1 10
  • 本文来自尚妆Android团队青峰发表于尚妆博客 APK瘦身探索 最近几周一直在研究如何为APK瘦身,折腾了很久,...
    尚妆产品技术刊读阅读 1,124评论 1 22
  • 本文会不定期更新,推荐watch下项目。如果喜欢请star,如果觉得有纰漏请提交issue,如果你有更好的点子可以...
    天之界线2010阅读 15,358评论 22 154
  • 1、 前言 如果你对App优化比较敏感,那么Apk安装包的大小就一定不会忽视。关于瘦身的原因,大概有以下几个方面:...
    貌似许亚军阅读 6,651评论 4 37
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 138,429评论 20 591