- Android 4.4及之前,默认的虚拟机还是 dalvik。
- 优点:通用性与可移植性强
- 缺点:dalvik字节码执行效率低
- Android 5.0 开始使用ART为默认虚拟机,在Android 7.0 之前,使用的是AOT。
- 优点:AOT在编译或者安装阶段将dalvik字节码编译成本地码,提高性能
- 缺点:占用存储空间增大,第一次开机时间和应用安装时间变长
- Android 7.0及之后,使用profile的方式,只编译常用的类和方法
- 优点:性能和占用存储空间,第一次开机时间和应用安装时间取得平衡
- 缺点:优化需要用户使用应用一段时间之后才执行
- Android 9/10 通过GooglePlay收集每个应用版本对应的记录用户手机的热类和方法的profile信息,其他用户可以通过GooglePlay下载profile信息,在安装时根据profile优化对应的类和方法。
- 优点:应用安装时执行优化,用户即时可以体验。
- 缺点:依赖GooglePlay。
Android 9/10 通过云端(GooglePlay)提供的profile文件优化应用性能
Google Play现在除了APK文件之外,还会交付一套基于云的ART Profile配置文件Dex Metadata(.dm)。
这个dm文件是从大数据用户那里搜集整理的APK对应的"热代码"文件,在通过GP安装apk时,会跟据dm文件提前进行优化编译,而不必等到用户使用一段时间生成热代码后再编译,可以显著提升首次启动速度。
Android P或更高版本系统的设备目前已提供相关支持。
1. 查看.prof、.dm文件
dex metadata(.dm)内容跟.prof一致,其实是一个jar(zip)压缩包,里面包含一个primary.prof。
安装apk时传.prof不识别,只识别.dm格式。
- 手动编译和清除一个APK:profile模式
cmd package compile -m speed-profile -f com.whatsapp
cmd package compile --reset com.whatsapp - 手动编译和清除所有APK:profile模式
cmd package compile -m speed-profile -f -a
cmd package compile --reset -a - 查看profile、dex metadata文件
profman --profile-file=xxx.prof --dump-only
profman --profile-file=xxx.dm --dump-only
=== profile ===
ProfileInfo:
base.apk [index=0]
hot methods:
startup methods:XXXXXXX,
post startup methods: XXXXXXXXXXXXXX,
classes: XXXXXXXXXX,
- 不需要应用开发者做额外的工作
- 工作模型
- Existing Devices 上传应用的 profile 信息 到 GooglePlay
- New Devices 通过 GooglePlay 下载安装应用时,GooglePlay 同时下载 Profile 信息
- 安装时通过 Profile 信息指导 ART 优化指定类和方法,生成APP images和oat文件
- 优势
- 使用预编译的本地码,不需要JIT参于,加快执行效率
- 通过直接将App images 预填充的堆加载到内存,提高加载速度
- 通过Profile提供的[startup code, post startup code, the rest of non profiled code],识别dex字节码,可以加载更少的内容,减少IO