下班了,走在回家的大街上,夜色的北京还是很美的,少去了白天拥堵的交通,剩下了安静的甜蜜,路上的灯也全亮了,像一串串灯笼,挂在了城市的四面八方,北京,还是挺不错的....算了,不感慨了,快点回家吧,家里还有娇妻呢...嘿嘿...。
终于到家了,路上真是凉爽啊,老婆应该已经睡了吧,也好,这样我玩王者荣耀就没有人打扰我了。刚坐在凳子上,准备操作一把。突然,一个声音出现:"死鬼,这么晚才回来?",”嗯,今天又学习了一个新的东西,不知不觉就晚了,多学习一会,能力提升,涨工资,不就可以为老婆多买件新衣服吗?“。老婆说道:”那你每天都这么忙,你不觉得累吗?“,”累啊,我也不想工作,你养我啊!“,老婆说道:"那你还是好好工作吧....."。
坐在沙发上,想到白天工作的时候,平时笑眯眯的领导今天好像换了一个人,叫我过去,小陈啊,你看看人家美团买菜的App,只有20M,为什么我们的App要120M,有没有办法让我们的App减减肥?我说道,“您算是找对人了,App的瘦身我比较拿手,给我一星期,给你一个满意的答复”,领导满意的点点头,又透露了他迷人的微笑。
下面我将为有这方面需求的小伙伴提供App瘦身的原理和方法,希望这个分享也能让你的生活中处处遇见微笑。
瘦身是什么?
通俗点说,App的瘦身,就是减少App的大小,从100M瘦身到20M。
瘦身的意义?
干任何事,我们首先要知道,干这件事的意义是什么?那么App的瘦身,它的意义又是什么呢?
1、对于我们来说,相同功能的App,一个是20M,一个是100M,那么我们一定会选择20M的.
2、从公司角度来说,有更多的公户(人)下载了App,最终都会变相的转换为流量,流量就是钱。
3、有的时候和第三方平台合作,比如华为手机上要求安装抖音软件,但是你不能超过100M,这个时候对瘦身做出了要求。
瘦身是如何做的?
我们要想给App瘦身,首先我们要知道App的组成部分,然后对各个部分进行瘦身。
Apk组成
apk其实就是一个压缩包,在压缩包里面有下面的几块:
1、代码相关:classes.dex (项目中的java代码会经过编译,生成class文件、而所有的这些class文件最终都会编译生成一个dex文件)
2、资源相关:res、asserts、resources.arsc
3、so文件:lib目录下(优化空间比较大)
知道了Apk的组成,那么我们想要对Apk进行分析,那么我们该如何分析呢?必须引入分析工具
Apk分析工具
1、apktools
2、Analyze apk(AS 自带的分析工具,比较方便,建议使用这个)
3、使用分析网站 https://nimbledroid.com/
Analyze apk有什么功能?
1、分析这次版本和下次版本之间的区别。
2、分析里面有什么页面,有什么第三方库。
Analyze apk如何使用?
将apk拖入到AS中就好。
知道了Apk的构成、Apk分析的工具,下面我们将介绍Apk瘦身的办法。
Apk瘦身办法
代码方面
- 代码混淆
- 三方库处理
- 移除无用代码
- 冗余资源
- 图片压缩
- 资源混淆
- so移除
- 更优方案
- 其它方案
下面我将详细的介绍这些方式
代码方面
代码混淆
1、代码混淆是什么?
将代码转换为功能上等价,但是难以阅读的形式。
2、代码混淆的功能是什么?
1)、代码中的元素改成无意义的名字,比如context变成a。
2)、用更难理解的逻辑写部分代码。
3)、混淆让apk的体积减少。
3、代码混淆怎么用?
Android SDK中集成了一个工具 Proguard,Java类压缩和混淆的工具类。
可以让元素名称变短、移除冗余代码、增加代码反编译的难度。
1)、 在module的build.gradle中增加 minifyEnabled true,debug下不要配置
2)、proguard-rules中配置相应规则。
三方库的处理
1、三方库会有什么问题?
比如一个大型项目,你引入了Picasso框架,我引入了Glide框架,这样三方库重复了,包体积也就大了。
2、三方库如何处理?
1)、基础库要统一,还要对组员进行定期的培训。
2)、选择更小的库。
3)、仅引入所需要的的部分代码:按需引入,不要全员引入,比如Fresco的Webp的支持。
移除无用代码
1、无用代码的现状?
随着项目的一个迭代开发,项目中必然存在着一些无用的代码,有些代码你也不确定是否有用,所以也不敢删除。
2、那么该如何删除项目中的无用代码呢?
1)如果是Activity,那么它必然会走onCreate方法,所以我们在onCreate方法中增加统计。
资源方面
资源瘦身
1、资源瘦身的现状?
在项目的迭代开发中,资源文件也会像代码一样, 存在很多无用的文件,有些文件你也不知道是否有用,所以不能轻易的去删除它。
2、那么该如何检测哪些是无用资源呢?
右键文件夹-Refactor-remove unused resource
注意:这种方式适用于纯原生的项目,如果是跨平台的项目Weex、RN,可能不是很准确。
图片压缩
1、项目中图片的现状?
项目中的图片是非常多的,他们一般是比较大的,所以对他们的优化,收益是比较高的。
2、如何进行图片压缩?
1)这个网站可以进行图片压缩 https://tinypng.com/
我们看到,收益是比较大的,而且它在显示方面也没有什么区别。
2)TingPngPlugin插件:可以批量的压缩图片,非常好用。
3)采用Webp格式的图片它的体积会更小。
对于png格式来说,它是一个无损格式,jpg是有损格式,jpg在处理图片颜色的时候,有的时候会去掉一些肉眼识别差别比较小的一些中间颜色,所以在图片比较鲜艳的情况下,颜色比较多的情况下,Png格式的图片是远远 > jpg 格式的图片的。
资源混淆
1、如何进行资源的混淆?
https://github.com/shwenzhang/AndResGuard 工具,例如:将res/drawable/wechat变为r/d/a,这样减少了路径长度。
资源混淆其它方案
1、图片只放一份,比如放在xxhdpi下,然后在不同的分辨率上进行适配。
So方面
so移除
1、so的现状?
android有7种不同的CPU架构,x86,arm等,理论上,不同架构的手机对应不同的So库他们的执行效率是最好的,但是这样会导致包体积变大。
2、如何对so进行优化?
在build.gradle中设置需要留下的so架构,一般留下armeabi架构的即可
abiFilters "armeabi-v7a" (它是一个万金油架构,在别的平台上都可以运行,但是性能方面有所损耗)
更优方案
比如将armeabi架构的so和armeabi-v7a架构的so都放在armeabi文件夹下,在代码中根据CPU类型加载对应架构的So。
其它方案
1、So动态下发,在业务代码执行以前,从网上动态下发so文件。
这种方式不推荐,从网上下载比较大的文件,可能出现下载失败,影响业务的执行。
2、插件化来对代码结构进行调整,每一个功能都是可以从网上下发下来,那apk的包体积会小很多,大型App都会使用插件化,使用插件化来对包体积进行优化。
生活的感悟
App的减肥的奥秘也许已经参透,但是自己减肥仍在路上.....
联系方式
有什么关于这方面的问题可以联系我,免费帮你解答。
QQ:937682896