性能优化(七):APK瘦身优化
APK基础知识
1.APK结构
AS > Build > Analyze APK
-
lib/
存放ndk编译出来的so文件 -
assets/
一些配置文件、资源文件,不会自动生成对应的ID,而是通过AssetManager访问 -
res/
存放编译后的资源文件,如drawable,layout等,会自动生成对应的ID并映射到.R文件中,访问直接使用资源ID(R.xxx.id) -
classes.dex
.class文件处理后的产物,Android系统的可执行文件 -
resources.arsc
记录着资源文件和资源ID之间的映射关系,用来根据资源ID寻找资源 -
META-INF/
保存应用的签名信息,签名信息可以验证apk文件的完整性 -
AndroidManifest.xml
Android清单文件,用来描述Android应用的配置信息、一些组件的注册信息、可使用权限等
2.APK打包流程
1、打包资源文件,生产R文件
aapt打包res资源文件,生成R.java、resources.arsc和res文件
2、处理aidl文件,生成相应的Java文件(没有aidl则跳过)
3、编译源代码,生产class文件
所有的java代码(包含R.java和aidl文件),由javac编译成.class文件(目录:bin/classes)
4、处理.class文件,生成classes.dex文件
dx工具将.class文件处理生成classes.dex文件
5、打包生成apk文件
6、对APK文件进行签名
7、对签名后的APK文件进行对齐处理
将apk包中的所有资源文件距离文件起始偏移为4字节整数倍,这样通过内存映射访问apk文件时的速度会更快。
APK瘦身
1.混淆和资源压缩
buildTypes {
release {
//混淆
minifyEnabled true
//资源压缩
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.config
}
}
2.Lint检查
Lint 是AS提供的静态代码分析工具,他能帮助我们发现代码结构和质量问题,并提供一些解决方案。
Android studio > Analyze > Run inspection By Name > 搜索 Unused resources
然后删除⽆⽤的资源
3.配置打包资源
android {
defaultConfig {
//配置只打包默认和简体中文资源
resConfigs "zh-rCN"
}
}
打包apk资源文件会映射到resources.arsc,通过AS来查看该文件中的string文件,可以看到少了很多国家的语言
4.so库配置
android {
defaultConfig {
ndk{
abiFilters "armeabi-v7a"
}
}
}
对于一些第三方服务会提供全平台的cpu架构,进行上面配置后,只会把armeabi-v7a 打进apk。
对于arm64架构的设备,使用arm64的so性能会更好,也可以多渠道的方式打包(主流应用市场会要求32位和64位的包)
android {
defaultConfig {
flavorDimensions ""
}
productFlavors{
arm32{
ndk { abiFilters 'armeabi-v7a' }
}
arm64{
ndk { abiFilters 'arm64-v8a' }
}
}
}
5.图片相关
5.1 png压缩
5.2 使用webp格式
webp格式相比png和jpg格式的图片体积小很多,并且图片质量损失很小。
AS提供了Convert to WebP功能,右键一个图片文件或图片文件夹,然后Convert to WebP,瘦身效果非常明显。
5.3 使用SVG
矢量图可以创建与分辨率无关的图标,不会降低图片的质量。
矢量图在Android中以vector
为标签的xml文件来使用。不过,系统渲染VectorDrawable对象需要花费大量的时间,较大的图片需要更多的时间显示到屏幕上,因此建议仅在小图标时使用,新工程默认icon就是矢量图。
AS提供了相应工具:右键res文件夹 > New > Vector Asset
5.4 重用资源
如上下三角按钮,可以用一张图旋转
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:drawable="@drawable/ic_thumb_up"
android:pivotX="50%"
android:pivotY="50%"
android:fromDegrees="180" />
同一图像着色不同,可以使用Tint着色器处理
6.其它
资源混淆:https://github.com/shwenzhang/AndResGuard
解析resources.arsc , 混淆资源ID长度(替换为a/b等无意义字符),利用7zip深度压缩,减少包体积,同时提升反破解难度。