apk瘦身会带来哪些好处,本文就不赘述了,会依照下面的目录来对apk瘦身进行总结
目录
- apk都有啥?
- 从资源下手
- 从.so下手
- 从assets下手
- 总结
1.apk都有啥?
要想对apk进行瘦身,那首先需要了解apk都有啥?apk内由哪些组成,只有了解了这些才可以知道从何处下手来进行瘦身。
apk是一个zip的压缩包,只不过后缀改成了apk,利用android studio自带的分析工具可以看下apk的内容,如下图(微信apk):
如上图apk主要包含以下内容:
- lib 包含所有的.so文件
- assets 该文件夹下存放的文件不会被编译处理,比如音频文件,.js文件,字体等
- res 因为微信对res进行了混淆处理,因此在图中是r,该目录下包含apk的各种资源(比如图片,样式文件,字体等)
- classesXX.dex 代码
- META-INF 存放apk加密公钥等信息
- AndroidManifest.xml 合并后最终的配置清单文件
- resources.arsc 二进制文件存放了资源文件int(R.)与资源文件路径之间对应的关系
以上是apk的主要内容,如上图是可以看到每个文件或目录占用apk大小的百分比,因此可以根据自己apk的情况来进行瘦身,资源,.so瘦身会有比较明显的效果。
android studio自带的分析工具还可以与上个版本进行比较
2.从资源下手
移除无用资源(Refactor--> remove unused Resources)
-
国际化资源配置(主要是语言)
因为一些第三方库中会带有各种语言的资源,在build.gradle中根据自己apk的情况可以进行配置:
android{ // 支持英文,和中文 resConfigs 'en','cn' }
-
压缩资源
shrinkResources true
通过shrinkMode可以开启严格模式
-
图片相关的使用
svg:为Scalable Vector Graphics,意思为可缩放的矢量图形,它的特点占用很小的空间和内存,不会失真,在渲染上所用时间要略多于png等图,不能用于模糊,渐变等功能。 小图标等套图可以尽量使用它,因为占用空间确实很小,比如 > < 等
webp:它占用的空间比jpeg小,但是效果不属于它,它可以代替jpeg。
shape:一些简单的背景,使用Shape来绘制,效果更好。
jpeg,png:对jpeg使用一些压缩工具进行压缩,对png使用TinyPng等进行压缩
-
保留一套图片
android图片适配,官方建议是在不同的drawable-hdpi, drawable-mdpi, drawable-xxhdpi等存放对于的图片,但是这样完全会增加apk的体积,因此根据自己apk的情况在适应的目录下存放一份图片为好(一般存放在drawable-xxhdpi),对于一些需要进行特殊处理的图片可以放在不同的目录下。
不要使用帧动画,使用lottie-android代替
使用腾讯的AndResGuard进行深度压缩,混淆(主要是对资源文件重命名,如:drawable/ic_a.png --> d/a.png),最终达到resources.arsc中的字符串占用空间减少,从而达到减少体积目的。
3.从.so下手
从微信apk的截图可以看出.so占用的空间是非常大的,android官方建议是针对不同的cpu架构使用相应的.so,但是在不同的cpu架构目录下存放对应的.so势必会导致apk体积过大,因此做法也是在某一个cpu架构目录下(比如armeabi-v7a)存放一套.so,比如下图是微信的做法:
在build.gradle的配置是这样的:
ndk {
abiFilters "armeabi-v7a"
}
当然若so文件是自己编译的可以在编译过程中尽量往小的压缩,若是第三方库的看是否可以选择包体积更小的库。
也可以采用通过从服务器下载so的方式来做
4.从assets下手
assets目录下的文件是否可以考虑从服务器下载,这样也可以减小包体积
5.总结
apk瘦身总的来说从以下几方面入手:
- 从资源进行下手,进行国际化配置,图片资源使用一套,用sgv格式来做图标等套图,使用shape来做简单的背景,对jpeg和png进行压缩处理,若apk包很大,也可以考虑使用腾讯的AndResGuard来对资源进行混淆
- 从so文件下手
- 从assets下手
- 当然还需要自己在写代码的时候能严格要求自己对代码的质量等进行控制。
在项目开发过程中,需要有一种监控机制来监控apk的大小,或是制定规则在项目的测试阶段(当然也可以是别的阶段)由专人来对apk的大小进行检测。