App减肥之路(-_-)

435 阅读8分钟


       下班了,走在回家的大街上,夜色的北京还是很美的,少去了白天拥堵的交通,剩下了安静的甜蜜,路上的灯也全亮了,像一串串灯笼,挂在了城市的四面八方,北京,还是挺不错的....算了,不感慨了,快点回家吧,家里还有娇妻呢...嘿嘿...。

        终于到家了,路上真是凉爽啊,老婆应该已经睡了吧,也好,这样我玩王者荣耀就没有人打扰我了。刚坐在凳子上,准备操作一把。突然,一个声音出现:"死鬼,这么晚才回来?",”嗯,今天又学习了一个新的东西,不知不觉就晚了,多学习一会,能力提升,涨工资,不就可以为老婆多买件新衣服吗?“。老婆说道:”那你每天都这么忙,你不觉得累吗?“,”累啊,我也不想工作,你养我啊!“,老婆说道:"那你还是好好工作吧....."。

        坐在沙发上,想到白天工作的时候,平时笑眯眯的领导今天好像换了一个人,叫我过去,小陈啊,你看看人家美团买菜的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瘦身办法

代码方面

  1. 代码混淆
  2. 三方库处理
  3. 移除无用代码
资源方面
  1. 冗余资源
  2. 图片压缩
  3. 资源混淆
So方面
  1. so移除
  2. 更优方案
  3. 其它方案


下面我将详细的介绍这些方式

代码方面

代码混淆

    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