安装包大小优化
安装包大小对应用的使用没什么影响,但提高来用户的下载门槛。减少安装包大小用户更愿意下载和体验。减少安装包大小之前先了解安装包(APK文件)的构成。
应用装包的构成
APK是一个压缩文件,包含Android应用程序的所有内容,是Android平台用于安装应用程序的文件。
- assets
assets目录可以根据应用需求存放任何文件夹架构,如配置文件、资源文件,这些文件的内容可通过AssetManager类获得。和res的不同点在于,res目录下的文件会在.R文件中生成对应的资源ID,assets不会自动生成对应的ID,而是通过AssetManager类的接口获取。
- lib
存放应用程序依赖的用C/C++编写的native库文件。
- res
这个目录存放资源文件,在这个文件夹下的所有文件都会生成对应的ID映射到Android工程的.R文件中。
- META-INF
保存应用的签名信息,签名信息可以验证APK文件的完整性。
- AndroidManifest.xml
是用来描述Android应用“整体资讯”的设定文件,文件名是固定的不能修改。
- classes.dex
Java可执行程序,需要先把Java文件编译成class文件,字节码都保存在class文件中,Android虚拟机把Java字节码转为Dalvik字节码。
- proguard.cfg
代码混淆配置文件
- rsources.arsc
记录资源文件和资源ID之间的映射关系,用来根据资源ID寻找资源。
以上APK组成中,classes.dex、lib、资源文件是大头,AKP瘦身主要就是优化这三类。
减少安装包大小的常用方案
1. 代码混淆
ProGuard是一个开源的Java代码混淆器,默认集成到Android SDK中,主要具有以下功能:
- 压缩:移除无效的类、属性、方法等
- 优化:移除没有的结构
- 混淆:把类名、属性名、方法名替换为一到两个字母
ProGuard配置参数非常多,具体可参考网站
按照语法规则编写proguard-rules.pro后,需要在build.gradle中配置,同时设置minifyEnabled为true,在编译工程时自动混淆代码,代码如下:
buildTypes{
debug{
minifyEnabled false
}
release{
signingConfig signingConfigs.release
minifyEnabled true
proguardFiles 'proguard-rule.pro'
}
}
2. 资源优化
ProGuard只能对代码进行分析和优化,但对资源文件没有类似的效果。
- 使用Android Lint检测并删除冗余资源
(1)单击菜单栏中的Analyze -> Run Inspection by Name,弹出工具选择框;
(2)在弹出的输入框中输入Unused resources,回车;
(3)选择要扫描的目录或整个工程,单击OK开始扫描;
(4)扫描完生成报告,可在AS中直接查看并删除确认无用的资源文件。
Android Lint不会分析assets文件夹下的资源,因为它们不需要通过具体的引用,Lint无法判断资源是否被用到。
- 资源文件最少化
如果为了适配不同屏幕,每个文件夹都放一套图,对安装包大小影响很大。虽然Android支持很多中屏幕密度,但不代表应用为没一个屏幕都提供一套资源,在这方面可以参考以下几点:
(1)尽量使用一套图片资源,遇到一些图片在不同分辨率手机变化过大时,在考虑在相应文件放入特定图片;
(2)使用一套图、一套布局、多套dimens.xml文件,在使用最小资源都情况下,解决多分辨率适配;
(3)使用轻量级的第三方库;
(4)减少项目中预置图片,改成服务下发。
- 图片优化
对于非透明大图,JPG文件会比PNG小很多,一般情况下能用JPG代替PNG就用JPG,如果用PNG可以用工具降低图片色彩位数和压缩(Zopfli和PNGoo)。
WebP是一种新的图片格式,支持透明度,压缩比JPG更高,但效果不比JPG差,是一种更好的选择。(但只能4.2.2以上版本使用)
3. 其他优化
- 避免重复功能的库:比如几种图片库,最好只选择一种,如果有业务无法满足,最好在这个基础上扩展而不是加入另一个库。不仅增加体检也增加维护成本。
- 插件化
本文参考书籍《Android应用性能优化最佳实践》
网友评论