为什么apk越来越大?
1.项目不断发展,功能越多,代码量增加的同时,资源文件也在不断的增多。
2.app支持的主流dpi越来越多,如ldpi、mdpi、hdpi、xh xxh xxxh等等,间接导致资源增多。
3.引入的第三方sdk或开源库越来越多,增加了很多重复的资源或方法以及无效代码。
4.用于体验要求高,图片资源为保证清晰度会使用分辨率更高的图片。
apk瘦身的切入点
解压一个没有加固过的apk文件我们会看到下边的内容,相信你对这些文件或目录的含义都已经清楚,接下来我们将会从三个方面进行apk的瘦身操作:
1.java代码,对应classes.dex文件,我们要剔除无效代码,减小dex文件大小。
2.资源文件,对应res文件夹,assets目录。
3.减小lib中引入的so大小。
开始瘦身
接下来我们将分别针对上边的三个切入点进行apk瘦身。
一.减小java代码的体积
有人认为这个方面的处理很鸡肋,因为每一行代码都对应相应的功能,这里能有多大的精简空间,其实并非完全如此,随着项目的不断推进,编码过程中会产生很多的冗余代码,比如该删掉的没有删掉,过多的重复性功能的工具类,无效的引用等,这还是其次,比较大的一个问题是,随着你引入的开源库不断增多,无效代码的出现几乎是必然事件,过多的重复方法还会导致64k方法数的问题。接下来进入正题。
开启minifyenable
它的作用不仅仅是混淆代码,还有压缩优化的功能,他会遍历所有代码并找出没有引用到的代码,这些代码不会生成在apk中;另外混淆的效果是使用简短的字母替代原来的类名属性名等,一定程度上也可以减小代码体积。
定期review重构代码
对代码的不断优化是提升个人能力的有效手段,同时优化的结果也会间接的对apk进行精简。
慎重选择你使用的开源库
很多开源库针对不同平台提供了精简版,目的就是移除在本平台上不需要的代码,例如fastjson,我们选择精简版就可以使开源代码缩小一倍左右,另外针对没有精简版的开源库,需要根据场景考虑是否使用源码依赖,手动移除不必要的文件资源。
二.资源文件瘦身
优先采用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可以一键转换,使用起来相当方便。
lint查找无效资源
lint可以检查res目录下的无效资源(无法检查assets),然后将其删除,但是有一点要注意,如果资源文件是通过反射机制调用的,lint是无法知道的,所以使用lint检查出的每一个资源都需要人工进行确认,防止发生异常删除。
开启shrinkresources功能
shrinkresources标识是否去除无用的resource文件,它需要配合minifyenable使用,同样存在反射机制引用的问题,这种情况会被误删
```
android {
buildtypes {
release {
minifyenable true
shrinkresources true
}
}
}
```
resconfigs剔除第三方库或者sdk中的资源
第三方库中包含的无效资源通常包含以下两点:
dpi目录,第三方库通常会提供所有的dpi目录以及对应的资源文件,因为它是针对大众使用的,而我们未必都需要,这时候需要选择性的移除。
很多第三方sdk是做了国际化,而我们可能用不到,此时也需要删除国际化资源。
```
defaultconfig {
。。。
resconfigs zh //表示只使用中文
resconfigs xxhdpi // 表示只是用xxhdpi目录下的资源文件
}
```
三.libs目录瘦身
so文件最终会被打包到libs目录中,我们针对libs目录的瘦身主要是去除不必要的平台abi的so文件,例如我们只保留v7a和x86平台的so
```
defaultconfig {
ndk {
abifilters armeabi-v7a,x86
}
}
```
四.其他的一些优化
1.不涉及透明图层的图片可以转换为jpg格式,比如欢迎页的图片。
2.使用shape(vector)替换图片。
3.删除或者替换兼容包中无用的一些图(v4.v7.v13)。
4.删除第三方aar库中使用的大图。
5.把so文件放置在网上或者sd卡内。
RCD吸收电路EMI影响与参数调整影响分析
聚焦离子束显微镜(FIB-SEM)材料分析
电感器芯的发展
智能感知与物联网技术研究所2021级硕士研究生中期报告(三)
关于微型电机马达的市场前景的分析
Android apk三大瘦身步骤
昆明机场发生多起无人机事件 公安部介入调查
如何使用运算放大器设计一个简单的12V电池电量指示器
4月智能音箱继续增长,品牌突围效果明显
引流系统组件泄漏测试仪检测原理有哪些?
美光CEO认为中国存储器不具威胁 2032年自驾车传感器规模770亿
折衍射混合成像光学系统设计
微风吊扇温度控制电路图
新一代EliteSiC功率模块助力电动汽车高效充电
程序员的15个编程障碍
LED封装设备如何封装元件?
LG 想干吗?新折叠屏专利不仅加入隐藏辅屏,还可360度旋转
单/多输出40-W电源ECP40系列
输出电压微调 微逆变器修整
华为与手机网络之间没有任何接口与中国政府也没有关联