APK瘦身攻略

为什么apk越来越大?

1.项目不断发展,功能越多,代码量增加的同时,资源文件也在不断的增多。

2.app支持的主流dpi越来越多,如ldpi、mdpi、hdpi、xh xxh xxxh等等,间接导致资源增多。

3.引入的第三方sdk或开源库越来越多,增加了很多重复的资源或方法以及无效代码。

4.用于体验要求高,图片资源为保证清晰度会使用分辨率更高的图片。

5.版本不断迭代,无效代码和图片资源不断积累

 

apk瘦身的切入点

解压一个没有加固过的apk文件我们会看到下边的内容,相信你对这些文件或目录的含义都已经清楚,

接下来我们将会从三个方面进行apk的瘦身操作:

1.Java代码,对应classes.dex文件,我们要剔除无效代码,减小dex文件大小。

2.资源文件,对应res文件夹,assets目录。

3.减小lib中引入的so大小。

 

开始瘦身

接下来我们将分别针对上边的三个切入点进行apk瘦身。

一、资源文件瘦身

优先采用WebP图片

资源文件是apk中体积占用较大的一部分,尤其是图片资源,所以我们首要以图片的瘦身为主。首先要对图片编码格式有简单了解。Android平台支持的格式有:JPEG,PNG,GIF,BNP,WebP(4.0开始支持WebP),但是Android应用开发中,Bitmap所支持的只有三种JPEG,PNG,WebP,从Bitmap类的CompressFormat枚举可以看出。

JPEG:有损压缩,不支持透明通道和多帧动画(RGB)

PNG:无损压缩,支持透明通道(ARGB),PNG大小大于JPEG

WebP:支持有损和无损压缩,支持透明通道和多帧动画,4.0以上是开发首选,Google官方测试,WebP比PNG能减少45%大小,即便PNG经过压缩,也能相比PNG减小28%

PNG格式图片尽量使用NinePatch格式

9图具有体积小,拉伸不变形的特点,并且Android studio可以一键转换,使用起来相当方便。

二、减小代码的体积

随着项目的不断推进,编码过程中会产生很多的冗余代码,比如该删掉的没有删掉,过多的重复性功能的工具类,无效的引用等,这还是其次,比较大的一个问题是,随着你引入的开源库不断增多,无效代码的出现几乎是必然事件,过多的重复方法还会导致64k方法数的问题。

1.resConfigs剔除去除第三方库或者SDK中的资源

第三方库中包含的无效资源通常包含以下两点:

  • dpi目录,第三方库通常会提供所有的dpi目录以及对应的资源文件,因为它是针对大众使用的,而我们未必都需要,这时候需要选择性的移除。
  • 由于第三方库,如appcompat-v7的引入,库中包含了大量的国际化资源,而我们可能用不到,此时可以根据情况配置删除国际化资源。

defaultConfig {

       ... ...

      resConfigs "zh" //表示只使用中文,去除多语言

      resConfigs "xxhdpi" // 表示只是用xxhdpi目录下的资源文件

}

2.开启混淆

  1. 开启minifyEnable :minifyEnable true

3.资源压缩

shrinkResources标识是否去除无用的resource文件,它需要配合minifyEnable使用,同样存在反射机制引用的问题,这种情况会被误删

4.移除无用资源

①一键移除无用资源(不推荐)

②Lint检查

Lint可以检查res目录下的无效资源(无法检查assets),然后将其删除,但是有一点要注意,如果资源文件是通过反射机制调用的,Lint是无法知道的,所以使用lint检查出的每一个资源都需要人工进行确认,防止发生异常删除。

 

三、libs目录瘦身

so文件最终会被打包到libs目录中,我们针对libs目录的瘦身主要是去除不必要的平台ABI的so文件,例如我们只保留v7a和x86平台的so。

defaultConfig {

    ndk {

          abiFilters "armeabi-v7a","x86"

      }

}   

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值