接下来我们会聊一聊Android的应用瘦身。
1、Apk结构
上图是我用android studio打开一个apk文件所展示的截图,从上图我们可以看到,一个apk中有res、lib、dex、assets等文件组成,其中res、lib占了整个apk的70%左右的空间。
lib: 包含特定于处理器软件层的编译代码。该目录包含了每种平台的子目录,像armeabi,armeabi-v7a, arm64-v8a,x86,x86_64,和mips。大多数情况下我们可以只用一种armeabi-v7a,但目前各大应用市场都要支持64位,所以也会加上arm64-v8a。
assets: 包含应用可以使用AssetManager对象检索的应用资源。
res: 包含未编译到的资源 resources.arsc,主要有图片资源文件。
META-INF:包含CERT.SF和 CERT.RSA签名文件以及MANIFEST.MF 清单文件。
resources.arsc: 包含已编译的资源。该文件包含res/values/ 文件夹所有配置中的XML内容。打包工具提取此XML内容,将其编译为二进制格式,并将内容归档。此内容包括语言字符串和样式,以及直接包含在resources.arsc文件中的内容路径 ,例如布局文件和图像。
classes.dex: 包含以Dalvik / ART虚拟机可理解的DEX文件格式编译的类。
AndroidManifest.xml: 包含核心Android清单文件。该文件列出应用程序的名称,版本,访问权限和引用的库文件。该文件使用Android的二进制XML格式。
我们从上面结构图可以知道,我们需要重点的优化对象是res、lib、asset、classes.dex等文件。
2、lib瘦身
lib文件瘦身的,我们可以根据场景设置合适的支持so架构
如:
早些时候,我们一般只需要支持armeabi-v7a就可以,但是随着近年来64位的设备越来越多,从性能和体验上出发,越来越多的应用市场要求必须支持64位的架构即arm64-v8a,所以一般要配置armeabi-v7a、arm64-v8a两种类型。
我们如何根据自己的产品去适配呢?
手机架构APP适配 | armeabi | armeabi-v7a | arm64-v8a |
---|---|---|---|
armeabi | 可以 | 可以 | 可以 |
armeabi-v7a | 不可以 | 可以 | 可以 |
arm64-v8a | 不可以 | 不可以 | 可以 |
- 只适配armeabi的APP可以跑在armeabi,armeabi-v7a,arm64-v8上
- 只适配armeabi-v7a可以运行在armeabi-v7a和arm64-v8a
- 只适配arm64-v8a 可以运行在arm64-v8a上
3、classes.dex优化
我们classes.dex文件是程序编译后的字节码文件,所以要减少他的大小的,主要是通过减少代码来实现。
-
减少三方库的依赖;三方库功能比较齐全,但是我们只需要用到其中一个小功能点,此时我们可以通过借鉴三方库来实现我们的功能。
-
同一个功能使用了不同的三方库,例如图片即使用了glide库,又使用了fresco,同时又用了picasso,这就没必要了,完全可以合并一个库来使用。
-
去除andorid support库,当然现在大家都开始用androidx了。