[Android 之美] APK 瘦身,减少APK的大小
让我们的apk文件尽可能更小,移除那些未使用的代码和资源文件。本章节介绍了如何做到让APK更小,性能更好,下载转化率会更高,以及如何指定在构建APK过程中保留或移除项目中的代码和资源,在我们还没有分析APK大小之前,项目中存在一些资源放置处理不当,没有统一的规范,依赖管理不合理,资源重叠,dex方法数过多、文件过大等问题,导致整个APK文件也比较大,对于下载转化率必然有一定的影响。
那么公司要求我们的产品APK体积大小要优化到3M左右。经过我们的努力终于达到要求,然而我们发现还能再小。
分析APK的大小
古人云:工欲善其事,必先利其器,我们得先有利器,下面就是我们常用的分析APK大小工具的利器做一些简单的介绍和使用,帮助我们分析造成APK体积较大的元凶,以便于我们从那些方面入手优化。
使用Android Studio 2.2
Android Studio 2.2 新功能直接能分析APK的大小,双击打开就能看到那些占用APK比例大,方法数等。
- 分析任何的APK
- 查看APK下载包的大小,解压后的实际大小
- 反编译资源文件,还原layout中的资源id,代码
- 分析dex,显示每部分的方法数,直接查看那些library体积比较大
使用方法:Build -> Analyz APK
有了Analyz APK
这个利器,以下工具也可以基本不用了
NimbleDroid
NimbleDroid 是美国哥伦比亚大学的博士创业团队研发出来的自动化分析Android app性能指标的系统,分析的方式有静态和动态两种方式,其中静态分析可以分析出APK安装包中大文件排行榜,各种知名SDK的大小以及占代码整体的比例,各种类型文件的大小以及占排行,各种知名SDK的方法数以及占所有dex中方法数的比例,针对缓慢的方法,缓慢的第三方SDK和内存泄漏。
测量生成的速度、网络、内存和磁盘使用率。总之有非常多分析App性能的功能,如果要做性能优化,也可以尝试使用NimbleDroid。
查看详细的方法耗时
具体使用方法请看官网:
https://nimbledroid.com/
不过需要注意的是不要上传任何未发布的产品。
ClassShark
ClassShark 是一款查看Android执行文件(apk)的浏览工具,目前有两个android App(Apk)和桌面(jar)的版本。
使用这款工具,可以很方便的打开APK/Class/Jar/res
等 文件和分析里面的内容。
具体源码与使用方法详细在github中:
https://github.com/google/android-classyshark
通过以上任一工具分析我们知道我们项目中主要是以下文件占用APK大小:
classes.dex
classes.dex是java源码编译后生成的java字节码文件,res
主要是存放我们的图片资源resources.arsc
编译后的二进制资源文件,非常多无效资源文件(语言)assets
主要存放了我们的缓存数据文件,已做最优化压缩,我们考虑能否云端存放。lib
主要是存放我们的so库,目前我们已经优化了
既然知道了那些数据导致我们APK体积大,那么我们就着手瘦身了。
对APK进行瘦身
对资源进行极限压缩
对资源进行极限压缩,主要是对如:res里面用到的图片资源文件和assets文件夹下的一些html,db等一些缓存预留在APK的数据文件
- assets资源压缩,使用7zip或者lzma压缩方式最高,把文件打包压缩
- res 图片资源的压缩,使用tinypng优化Android的资源图片,通常我们可以在保证图片不失真的情况下,多压缩几次。目前tinypng已经支持png和jpg图片、.9图的压缩
- 将非alpha的图转换成jpg形式
通过以上方法我们图片降低了79%的大小。
使用WEBP,SVG图片资源格式
- WebP是谷歌研发出来的一种图片数据格式,它是一种支持有损压缩和无损压缩的图片文件格式,如果应用支持到Android 4.0+,那么我们可以使用WebP格式代替PNG,我们的资源大小能降低50%多。或者有些资源可以使用SVG图片资源更小。
以下是他们的对比图:
这里提供方便转换的WEBP资源的工具:
- https://isparta.github.io/
-
- 使用VectorDrawable和SVG图片来替换原有图片
使用SVG不用考虑屏幕适配问题,体积非常小。
- 使用VectorDrawable和SVG图片来替换原有图片
利用AndResGuard资源压缩打包工具
微信中的资源混淆工具主要为了混淆资源ID长度(例如将res/drawable/icon.png,png变成混淆为r/s/a.png),同时利用7z深度压缩、对png的存储方式做了改变占用内存更小,大大减少了安装包体积
具体源码与使用方法详细在github中:
https://github.com/shwenzhang/AndResGuard
清除你的代码和资源
通过上面的图片资源极限压缩能对APK减小不少,但这往往这些还是不够的,项目里还有很多未使用的资源文件,重复的资源等,这里主要参考Google官方文档https://developer.android.com/studio/build/shrink-code.html#shrink-code 部分,利用Android Plugin开启