• 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格式。

  1. 手动编译和清除一个APK:profile模式
    cmd package compile -m speed-profile -f com.whatsapp
    cmd package compile --reset com.whatsapp
  2. 手动编译和清除所有APK:profile模式
    cmd package compile -m speed-profile -f -a
    cmd package compile --reset -a
  3. 查看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