前言
背景
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,然后再进行删除。
这里需要注意,特别有使用第三方的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代码混淆
- 删除注释和无用的代码
- 将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体积当然还有其他的方案。如:
- 资源动态加载(如表情包动态下载)
- 插件化(动态加载)
方案当然还有很多,本文只介绍常规使用的一些方法,有兴趣的伙伴可以继续深入了解。
网友评论