Android APP 瘦身优化
1.APK组成
1.1 APK组成部分
- 如下所示
- res:包含未编译到的资源 resources.arsc,主要有图片资源文件;
- classes.dex:包含以Dalvik / ART虚拟机可理解的DEX文件格式编译的类;
- assets:包含应用可以使用AssetManager对象检索的应用资源;
- lib/:包含特定于处理器软件层的编译代码。该目录包含了每种平台的子目录,像armeabi,armeabi-v7a, arm64-v8a,x86,x86_64,和mips。大多数情况下我们可以只用一种armeabi-v7a,后面会讲到原因;
- resources.arsc:包含已编译的资源。该文件包含res/values/ 文件夹所有配置中的XML内容。打包工具提取此XML内容,将其编译为二进制格式,并将内容归档。此内容包括语言字符串和样式,以及直接包含在resources.arsc文件中的内容路径 ,例如布局文件和图像;
- META-INF/:包含CERT.SF和 CERT.RSA签名文件以及MANIFEST.MF 清单文件;
- AndroidManifest.xml:包含核心Android清单文件。该文件列出应用程序的名称,版本,访问权限和引用的库文件。该文件使用Android的二进制XML格式。
- 实际开发中
2.如何压缩优化apk
2.1 资源方面
1.删除无用资源
- 通过lint或resource shinking等删除无用资源。需要注意,别删错了!
2.压缩图片
- 1)无透明度的png转成jpg
- 2)通过tinypng, tinyjpg等进行有损压缩,或通过ImageOptim进行无损压缩
- 3)在不影响质量的提前下将大图转换成webp
3.压缩动画
- 压缩loading等gif动画,及其它较大的资源,如mp3
4.动态加载
- 对动态表情等特定业务场景才使用的动画等资源做动态加载,app启动后在线下载,不随apk发包。
5.使用微信资源压缩方案
6.glide配置
1
2
3
4
5
6
7buildTypes {
release {
minifyEnabled true //是否开启混淆
shrinkResources true //压缩
zipAlignEnabled true ////去掉无用的resourse文件
}
}
2.2 代码方面
- 1.开启proguard
- proguard不仅能够混淆,而且能够优化代码,可以大大减小dex文件的大小。
- 但需要对被反射引用的类需要做好keep
- 2.动态加载
- 对ocr(身份证识别)等较大的库做动态加载,app启动后在线下载,不随apk发包。
- 3.插件化
- 将相对独立的业务做成插件,app启动后在线下载,不随apk发包。
- 4.删除非必要的so库
- 很多app为了支持x86,apk至少包含arm和x86 2个ABI,甚至包括arm其实x86构架的手机也支持arm,可以删除x86 so,只保留arm。
- 有人认为x86手机以兼容模式运行arm so会影响效率,其实效率上的影响对用户并没有直接的感知。
- 删除x86 so可以大大减少apk size,特别是app集成了很多第三方so库的情况下,如fresco,rn等。
- 关于so的介绍详见Android 动态链接库加载原理及 HotFix 方案介绍
- 5.Facebook字节码优化方案redex
3.其他操作
3.1 lint检查
- 如下所示
3.2 如何检测哪些图片未被使用
点击菜单栏 Analyze -> Run Inspection by Name -> unused resources -> Moudule ‘app’ -> OK,这样会搜出来哪些未被使用到未使用到xml和图片,如下:
3.3 如何检测哪些无效代码
- 使用Android Studio的Lint,步骤:点击菜单栏 Analyze -> Run Inspection by Name -> unused declaration -> Moudule ‘app’ -> OK