目录
1. 压缩APK体积的意义
- 随着项目的不断迭代,功能越来越多,构建出来的apk文件的大小也会越来越大,这样会导致在移动网络情况下下载时,使用的网络流量会增大,并且apk太大,导致下载的时间也增加,虽然当前每个人的手机的流量都很多,对用户流量影响不大,但是据一些网站统计,安装包越大,用户的转化率是在降低的,所以减少apk的体积,可以让更多的用户愿意去下载和体验产品;[1]
- 压缩APK体积还有个很重要的意义在于节省手机的内存空间以及存储空间,APK体积压缩之后,运行APP时的资源加载少了,占用的手机内存也会变少,整体运行更为流畅;
- 对于一些功能比较丰富的软件可能内部采用了多插件的架构,而这些插件可能也是由一个个独立APK组成,那么在用户下载软件后第一次使用插件对应的功能时,也就是冷启动的时候,APK太大就会带来加载过慢的问题,会严重影响用户体验。
2. APK的构成与打包
这里拿自己的一个Demo编译生成的release版本的APK作为例子,来看看一个APK里面到底装了什么:
这里详细介绍一下APK里面的组成:[2]
- lib:存放so文件,可能会有armeabi、armeabi-v7a、arm64-v8a、x86、x86_64、mips,大多数情况下只需要支持armabi与x86的架构即可,如果非必需,可以考虑拿掉x86的部分;
- res:存放编译后的资源文件,例如:drawable、layout等等;
- assets:应用程序的资源,应用程序可以使用AssetManager来检索该资源;
- META-INF:该文件夹一般存放于已经签名的APK中,它包含了APK中所有文件的签名摘要等信息;
- kotlin:这些文件包含用于声明标准(“内置”)Kotlin类的数据,这些类未编译为.class文件,而是映射到平台上的现有类型(在本例中为JVM)。例如,kotlin / kotlin.kotlin_builtins包含kotlin包中的非物理类的信息:Int,String,Enum,Annotation,Collection等;
- classes(n).dex:classes文件是Java Class,被DEX编译后可供Dalvik/ART虚拟机所理解的文件格式;
- resources.arsc:编译后的二进制资源文件;
- AndroidManifest.xml:Android的清单文件,格式为AXML,用于描述应用程序的名称、版本、所需权限、注册的四大组件。
这里补充一下App资源被打包进APK的过程,Android构建工具链使用AAPT工具来对资源进行处理,来看下图:
3. res资源的压缩和优化
3.1 删除没有被引用的资源
一个Android项目中或多或少都会存在没被引用的资源文件,Android Studio就内置了查找无效资源的Lint工具,下面还