应用安装包过大会导致应用的安装、启动耗时增加,也会导致应用在使用时占用的内存大以及产生耗电问题。本文介绍应用安装包的结构,以及常用的包体积优化方法及原理。
1、APK组成结构
应用安装包就是APK,它是Android application package的缩写。它实际上是一个zip格式的压缩文件,包含应用运行所需的所有文件,如java类文件、资源文件、签名文件、so文件等。
我们解压缩一个.apk文件可以看到里面的内容。主要有如下几个目录和文件。
META-INT/:主要有包含CERT.SF、CERT.RSA以及MANIFEST.MF文件,这个目录主要提供apk签名相关信息。确保apk包是完整的,没有被篡改的。
assets/:资源文件目录,在应用程序中可以使用AssetManager检索和使用这个目录下的资源。
res/:资源目录,下面有drawable、xml、layout、color、mune等目录结构,将不同资源分开存放。
lib/:存放.so文件以及.jar、.aar文件。.so是跟底层库相关的,通常要区分编译平台分开存放,如armeabi-v7a、arm64-v8a、x86、x86_64。.jar和.aar是存放的java库文件。
resources.arsc:将res文件夹下所有XML文件中的内容进行整理编码,按照列表的形式记录在这个文件中。表项主要有ID、Name、Value几个。程序中可以方便的通过查表找到目标资源。
classes.dex:java编译后生成的字节码文件,它是在java文件编译生成的.class文件基础上,进一步使用dex工具进行编译得到的文件。这种文件是专门被Android虚拟机Dalvik/ART所识别是使用。
AndroidManifest.xml:Android应用的配置清单文件,主要列出应用的包名、版本、使用的权限、声明的窗口和服务等。
2、开启代码混淆与资源缩减
安装包中存在未使用的资源,会占用额外的空间,导致包体积增大。在build.gradle文件中通过设置minifyEnable true和shrinkResource true,分别开启代码混淆和资源缩减。在编译apk时,编译器会自动忽略没有使用的资源,避免将其打包进APK。
需要注意的是,启用资源缩减