Apk结构分析
我们可以通过Android Studio 直接分析Apk
- lib/: 包含特定于处理器软件层的编译代码,包含(armeabi, armeabi-v7a, arm64-v8a, x86, x86_64, 和mips)。大多数情况我们只用一种armeabi-v7a
- assets/: 包含应用可以使用AssetMananger对象检索的应用资源
- res/: 包含未编译到的资源 resources.arsc,主要有图片资源文件
- META-INF/: 包含CERT.SF和CERT.RSA签名文件,以及MANIFEST.MF清单文件
- resources.arsc: 包含已编译的资源
- classes.dex:包含以Dalvik/ART虚拟机可理解的DEX文件格式编译的类
- AndroidMainifest.xml:包含核心的Android清单文件
具体操作
1. 瘦身lib
修改前
ndk {
//设置支持的so库架构
abiFilters "armeabi-v7a", "x86", "arm64-v8a", "x86_64", "armeabi"
}
修改后:
ndk {
//设置支持的so库架构
abiFilters "armeabi-v7a"
}
接下来说明这么做的依据:
看上面图分析,armeabi-v7主要不支持ARMv5(1998年诞生)和ARMv6(2001年诞生).目前这两款处理器的手机设备基本不在我公司的适配范围(市场占比太少)。
而许多基于 x86 的设备也可运行 armeabi-v7a 和 armeabi NDK 二进制文件。对于这些设备,主要 ABI 将是 x86,辅助 ABI 是 armeabi-v7a。
最后总结一点:如果适配版本高于4.1版本,可以直接像我上面这样写,当然,如果armeabi-v7a不是设备主要ABI,那么会在性能上造成一定的影响。
2. 重新编译so文件,用更小的库代替
很多第三方我们导入进来只用到其中很小一部分功能,大部分功能都是我们用不上的。这时候我们找到源代码,将我们需要的那部分代码提取出来,重新编译成新的so文件,再导入到我们项目中。
3. 优化res,assets文件大小
- 手动lint检查,手动删除无用资源
- 使用tinypng等图片压缩工具对图片进行压缩
- 大部分图片使用Webp格式代替
- 尽量不要在项目中使用帧动画
- 使用gradle开启shrinkResources,移除无用资源文件
- 减少classes.dex大小