一、为什么要将apk进行体积优化?
1.手机存储空间有限,业务方和开发法方都希望apk体积尽可能小
2.可以减下用户的下载成本,利于app的用户的扩展。
二、app组成结构
三、针对文件结构采取优化措施
1. asserts优化:
(1)删除无用字体,如果项目中必须要用到特殊字体,可以用FontZip进行字体提取。
(2)asserts中的资源,能动态获取的尽量动态获取,比如HTML文件、图片……
(3)能压缩存储的文件尽量压缩后放进去,要用时再通过代码解压。
2.lib优化:
(1)尽量不要使用功能重复的jar包
(2)mips、arm、x86的so库不要每种都配置,现在一般只配置主流的arm即可,其他可兼容。
(3)避免复制so库,在Android 6.0之前,so文件会压缩到apk中。系统在安装应用的时候,会把so文件解压到data分区,这样同一个so文件会有两份存在,一个在apk里,一个在data中。这也导致多占用了一倍的空间,而且会出现各种诡异的错误。在6.0+中,可以通过如下的方式进行申明:
<application
android:extractNativeLibs=”false”>
3.优化resources.arsc:
(1)删除无用的资源文件
(2)**进行资源名称混淆,混淆工具AndresGuard.
4.优化META-INF
(1)META-INF文件夹中有三个文件,分别是
MANIFEST.MF:存放所有文件通过sha1加密后的值在进行base64加密
CERT.SF:存放所有文件通过sha1加密后的值在进行base64加密,再加上MANIFEST.MF
CERT.RSA:包含了公钥、所采用的加密算法等信息。
除了CERT.RSA没有压缩机会外,其余的两个文件都可以通过混淆资源名称的方式进行压缩。
5.优化res
(1)打包时剔除无用资源,方法:
(2)删除无用的语言,在打包的时候就会排除私有项目、android系统库和第三方库中非中文的资源文件了配置方法
(3)控制raw中资源的大小,raw下一般放音频文件,在音频文件格式的选择上需要考究一番,有wav、mp3、ogg等格式可供选择,一般优先选择ogg。
(4)减少layout文件,融合和复用(include)
(5)动态下载图片
(6)图片不同分辨率的放置
a.聊天表情就出一套图,放在hdpi中
b.纯色小icon用svg做
c.背景等大图,出一套放在xhdpi中
d.logo等权重较大的图片可针对hdpi,xhdpi做两套图
e.如果某些图在真机中确实展示异常,那就用多套图
f.如果遇到奇葩机型,可针对性的补图
(7)优化图片
这是谷歌给出的建议,简单来说就是:VD->WebP->Png->JPG
a.如果是纯色的icon,那么用svg
b.如果是两种以上颜色的icon,用webp(将图片批量转换成webp的插件WebpConvert_Gradle_Plugin)
c.使用Tint
d.如果图片没有alpha通道,可以考虑jpg
7.优化dex
(1)利用Lint分析无用代码,查找未用到资源和代码
(2)通过proguard来删除无用代码