Speed SystemUI .dex mmap

mmap高 内存 dex高

TMG评审决策

内存TMG评审的结论是这部分.dex mmap增量需要单独制定标准,先扣除.dex mmap部分走澄清流程

方案背景

SystemUI预编译方案不完善导致的流畅度问题,主要原因有如下两点:

  1. SystemUI JIT阻塞绘帧导致丟帧
  2. 使用低效的解释执行导致Running时间长

1.SystemUI JIT阻塞导致丟帧

黑花闪场景 SystemUI JIT 阻塞 出现次数 6次 ,在所有 聚类 问题中排名第 15

SystemUI JIT线程阻塞RenderThread,编译方法来源是miui.systemui.plugin

SurfaceFlinger等待SystemUI的binder线程,SystemUI的binder线程被JIT阻塞

2.使用低效的解释执行导致Running时间长

预编译方案不完善导致大量SystemUI代码只能使用低效率的解释执行,如下O3机型核心场景流畅度中是否正常加载插件OAT文件SystemUI首帧Running时长差异超过30% (从102 ms 降低到68ms)

存在问题

1.插件的odex文件无法正常加载

抓开机trace可以看到SystemUI在加载插件时odex文件没有正常加载(AOSP原生设计问题,竞品中只有小米存在这个问题)

![http://minio.898311.xyz/blogimg/1768223197947_864367.png)

修复方案细节:https://xiaomi.f.mioffice.cn/docx/doxk4Z2HRESwfLAbLWbt9ap6tjf,修复后可以正常加载

相关代码:https://gerrit.pt.mioffice.cn/q/topic:load_systemui_plugin_oat_file

2.没有对SystemUI预编译

谷歌建议在新机/OTA升级场景,开机时直接对SystemUI进行speed编译

小米之前并没有对SystemUI进行预编译,存在大量的JIT且Running时间较长

修复方案如下:跟随谷歌建议将dalvik.vm.systemuicompilerfilter设置为speed

相关代码:https://gerrit.pt.mioffice.cn/c/device/xiaomi/dada/+/5930951

Speed SystemUI与之前的变更

性能收益

黑花闪场景下 SystemUI JIT引发的卡顿性能问题 清零 ,当前已进版O1、O2、O3媒体分支

数据来源【高密级】【O1】【稳定流畅宣发场景】

以O3为例核心场景流畅度丢帧率 下降17%

https://xiaomi.f.mioffice.cn/sheets/shtk4Nm8AkfgLGi4LqcyuTk2luf?sheet=bWe4EU

开机内存变更

  1. 正常加载插件miui.systemui.plugin和com.miui.aod的odex和vdex文件
    1. 开机时正常加载product@app@MIUISystemUIPlugin@MIUISystemUIPlugin.apk@classes.dex
    2. 开机时正常加载product@app@MIUISystemUIPlugin@MIUISystemUIPlugin.apk@classes.vdex
    3. 开机时正常加载product@priv-app@MIUIAod@MIUIAod.apk@classes.dex
    4. 开机时正常加载product@priv-app@MIUIAod@MIUIAod.apk@classes.vdex
  2. 和谷歌建议同步,将SystemUI的预编译动作提前到OTA后的第一次开机,不需要等到闲时编译
    1. 开机时正常加载SystemUI和Plugin已经编译过的dex文件(直接执行机器码,不经过解释执行+JIT)

开机内存变更:主要影响.dex mmap

![http://minio.898311.xyz/blogimg/1768223413531_306110.png)

同时由于已经进行了预编译,因此不再需要运行过程中对主APK进行JIT,因此在老化测试中,JIT CodeCache不会明显增加(JIT CodeCache这部分内存占用是算在Dalvik Heap名下),同时.apk mmap也会有一定的减少

.dex mmap在内存压力场景下可以被回收

竞品对比

VIVO的灵动岛、息屏显示部分功能并没有算在SystemUI部分,而是独立的进程

  • SystemUI:android.systemuii
  • 灵动岛:com.vivo.systemuiplugin:island
  • 息屏显示:com.vivo.nightpearl
  • 锁屏编辑器:com.bbk.theme

同样的编译选项下,.dex mmap数据对比

VIVOVIVOO3 speedO3 speedO3 verifyO3 verify
.dex mmapTOTAL.dex mmapTOTAL.dex mmapTOTAL
com.android.systemui79M244M103M3788M276M
com.vivo.systemuiplugin:island17M48M////
com.vivo.nightpearl28M59M////

编译调试

# 查看插件编译产物是否正常加载
adb shell 'pmap `pidof com.android.systemui`' | grep 'MIUISystemUIPlugin@\|MIUIAod@'
 
# 打开编译
adb shell setprop persist.pm.mock-upgrade true
adb reboot
 
# 清除编译产物
adb shell setprop persist.pm.mock-upgrade false
adb shell cmd package compile -m verify -f com.android.systemui
adb shell cmd package compile -m verify -f com.miui.aod
adb shell cmd package compile -m verify -f miui.systemui.plugin
adb reboot

代办:VIVO通控中心/岛/息屏显示实现方式

小米当前使用插件实现的功能模块

  • SystemUI Plugin
    • miui-controlcenter
    • miui-notification
    • miui-devicecenter
    • miui-devicecontrols
    • miui-volumepanel
    • miui-quicksettings
    • miui-flashlight
    • miui-miplay
  • MIUIAod
    • app
    • keyguardeditor(锁屏编辑) (com.miui.aod:keyguardeditor)
    • keyguardshotcuts

VIVO

通控中心、状态栏:SystemUI

灵动岛:com.vivo.systemuiplugin:island

AOD:com.vivo.nightpearl

锁屏编辑器:com.bbk.theme

VIVO的SystemUI默认是使用speed-profile编译,灵动岛是speed编译,AOD是speed-profile

VIVOO3 speedO3 verify
.dex mmapTOTAL.dex mmapTOTAL.dex mmapTOTAL
com.android.systemui36M209M103M3788M276M
com.vivo.systemuiplugin:island17M48M////
com.vivo.nightpearl28M59M////

OPPO 对比

Oppo find x8u coloros16

Systemui .dex mmap 74M