性能优化-安装包大小优化

安装包大小优化

安装包大小对应用的使用没什么影响,但提高来用户的下载门槛。减少安装包大小用户更愿意下载和体验。减少安装包大小之前先了解安装包(APK文件)的构成。

应用装包的构成

APK是一个压缩文件,包含Android应用程序的所有内容,是Android平台用于安装应用程序的文件。

  1. assets

assets目录可以根据应用需求存放任何文件夹架构,如配置文件、资源文件,这些文件的内容可通过AssetManager类获得。和res的不同点在于,res目录下的文件会在.R文件中生成对应的资源ID,assets不会自动生成对应的ID,而是通过AssetManager类的接口获取。

  1. lib

存放应用程序依赖的用C/C++编写的native库文件。

  1. res

这个目录存放资源文件,在这个文件夹下的所有文件都会生成对应的ID映射到Android工程的.R文件中。

  1. META-INF

保存应用的签名信息,签名信息可以验证APK文件的完整性。

  1. AndroidManifest.xml

是用来描述Android应用“整体资讯”的设定文件,文件名是固定的不能修改。

  1. classes.dex

Java可执行程序,需要先把Java文件编译成class文件,字节码都保存在class文件中,Android虚拟机把Java字节码转为Dalvik字节码。

  1. proguard.cfg

代码混淆配置文件

  1. 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应用性能优化最佳实践》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vinson武

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值