Speed SystemUI .dex mmap
TMG评审决策

内存TMG评审的结论是这部分.dex mmap增量需要单独制定标准,先扣除.dex mmap部分走澄清流程
方案背景
SystemUI预编译方案不完善导致的流畅度问题,主要原因有如下两点:
- SystemUI JIT阻塞绘帧导致丟帧
- 使用低效的解释执行导致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原生设计问题,竞品中只有小米存在这个问题)

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
开机内存变更
- 正常加载插件miui.systemui.plugin和com.miui.aod的odex和vdex文件
- 开机时正常加载product@app@MIUISystemUIPlugin@MIUISystemUIPlugin.apk@classes.dex
- 开机时正常加载product@app@MIUISystemUIPlugin@MIUISystemUIPlugin.apk@classes.vdex
- 开机时正常加载product@priv-app@MIUIAod@MIUIAod.apk@classes.dex
- 开机时正常加载product@priv-app@MIUIAod@MIUIAod.apk@classes.vdex
- 和谷歌建议同步,将SystemUI的预编译动作提前到OTA后的第一次开机,不需要等到闲时编译
- 开机时正常加载SystemUI和Plugin已经编译过的dex文件(直接执行机器码,不经过解释执行+JIT)
开机内存变更:主要影响.dex mmap

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

竞品对比
VIVO的灵动岛、息屏显示部分功能并没有算在SystemUI部分,而是独立的进程
- SystemUI:android.systemuii
- 灵动岛:com.vivo.systemuiplugin:island
- 息屏显示:com.vivo.nightpearl
- 锁屏编辑器:com.bbk.theme
同样的编译选项下,.dex mmap数据对比
| VIVO | VIVO | O3 speed | O3 speed | O3 verify | O3 verify | |
|---|---|---|---|---|---|---|
| .dex mmap | TOTAL | .dex mmap | TOTAL | .dex mmap | TOTAL | |
| com.android.systemui | 79M | 244M | 103M | 378 | 8M | 276M |
| com.vivo.systemuiplugin:island | 17M | 48M | / | / | / | / |
| com.vivo.nightpearl | 28M | 59M | / | / | / | / |
编译调试
# 查看插件编译产物是否正常加载
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


| VIVO | O3 speed | O3 verify | ||||
|---|---|---|---|---|---|---|
| .dex mmap | TOTAL | .dex mmap | TOTAL | .dex mmap | TOTAL | |
| com.android.systemui | 36M | 209M | 103M | 378 | 8M | 276M |
| com.vivo.systemuiplugin:island | 17M | 48M | / | / | / | / |
| com.vivo.nightpearl | 28M | 59M | / | / | / | / |
OPPO 对比
Oppo find x8u coloros16
Systemui .dex mmap 74M

