前言
背景
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 |
分析
虽然各个应用的功能集不一致, 但是主要都是提供存储服务, 这里的对比也是从某个层面进行比较. 通过分析对比表可以得知.
微云体积最少, 百度云次之, 115 最大
115 体积主要最大的地方在 res 图片资源这块
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 压缩优化
推荐使用 https://tinypng.com/ .
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 代码混淆
删除注释和无用的代码
将 java 文件文件名及方法名改成短名 a.java
支持的方式也很简单, Gradle 默认支持
- Android {
- buildTypes {
- release {
- minifyEnabled true // 是否开启混淆
- proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
- }
- }
- }
资源混淆
是一个帮助你缩小 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 体积当然还有其他的方案. 如:
资源动态加载(如表情包动态下载)
插件化(动态加载)
方案当然还有很多, 本文只介绍常规使用的一些方法, 有兴趣的伙伴可以继续深入了解.
参考资料
https://tinypng.com/
安装包立减 1M-- 微信 Android 资源混淆打包工具
来源: https://juejin.im/entry/5bff8f56f265da6120618a94