某物业Apk减肥 从5344KB到3009KB

1,783 阅读3分钟

最近开发某物业公司的APP,项目写完后感觉Apk安装包肥了点,给它做个减肥套餐。

image

优化的目的

减少APK文件大小、下载、安装时间。

1、可以看到主要是以下部分占用了应用大小

image

  1. classes.dex: Java字节码文件
  2. res: 资源文件、xml、图片等其他文件。
  3. lib: so库、jar包。
  4. resources.arsc: 二进制资源映射表
  5. assets: 存储音视频等原始资源文件。

1. 优化Dex文件

  1. minifyEnabled true proguard混淆、剔除代码。
  2. zipAlignEnabled true 4字节对齐提高运行效率(如果在Google play上架必须开启)
  3. 多余依赖库(项目基础框架包含较多库,部分库可能这个项目没有使用到)

image

External Libraries可以看到jar,根据项目检查是不是所用到的。

经优化减少5344-4087=1257kb

image

2、优化Res文件夹

  1. 尽量保留一套图片资源、会自动根据高低密度缩放,主流720P 、1080P放xhdpi或xxhdpi。
  2. 开启shrinkResources true 剔除无效资源
  3. png图片压缩、www.tinypng.com
  4. webp格式 在4.2.1以上会支持比较好,4.0~4.1不支持无损、透明通道(该方案暂未使用)。

image

经优化减少4087-3899=188kb

3、优化so库

  1. abiFilters 配置支持的cpu架构类型

so库有很多CPU架构的如:'armeabi','armeabi-v7a', 'x86', 'x86_64', 'mips', 'mips64', 'arm64-v8a'等,一般armeabi是兼容armeabi-v7a的,v7在图形渲染方面做了优化,如果没有特别要求可以不需要。

经优化减少3899-3591=308kb

4、优化resources.arsc

  1. 有美团方案、微信方案,我选择微信方案,关闭V2签名。
  2. resConfigs zh 由于项目没有国际化,暂支持中文

按官网配置后,选择构建即可。

image

构建后可以看到,资源混淆成功。

image

image

经优化减少3591-3009=582kb

5、其它优化

  1. 使用自己资源覆盖第三方未使用到的资源,比如第三方有大图在aar里面,但是这张大图并没有实际展示出来,可以放1x1大小图片覆盖,从而减少apk大小。

image

可以解压apk文件查看有哪些大图,创建1*1放到对应目录覆盖。

小结

最终APK大小 5.21M瘦身到2.93M,其实还可以再优化比如剔除R文件等,这些下次再好好琢磨补充文章。

2、其他建议

  1. 使用插件化(上架Google Play慎用)
  2. 尽量使用xml文件代替图片(shape,selector等)
  3. 剔除R文件(这次优化还没有用上)。
  4. 使用Webp格式(这个坑还没有掌握,项目要求4.0+,还有国产手机改了rom不支持webp)
  5. 使用点9图
  6. 使用常量代替枚举
  7. HTML混合开发。

参考资料

  1. 老司机谈APK瘦身套路-项目优化篇 http://blog.csdn.net/mynameishuangshuai/article/details/51766185
  2. 【推荐】 Android APP终极瘦身指南 https://mp.weixin.qq.com/s/3oSsVY5mbPUdZ-jW5T-0kQ
  3. 爱奇艺Android移动客户端app瘦身经验 http://blog.csdn.net/wenyiqingnianiii/article/details/52152091
  4. Android资源混淆打包方案 http://blog.csdn.net/xiangzhihong8/article/details/54989020
  5. 微信资源混淆工具 https://github.com/shwenzhang/AndResGuard
  6. 剔除R文件 https://github.com/meili/ThinRPlugin/blob/master/README.zh-cn.md
  7. 四字节对齐 http://blog.csdn.net/liujianli123/article/details/47045929

打个广告: Square开源交流 QQ群166354503 (Rxjava Retrofit EventBus MVP OKHttp等等交流)。