Files
Obsidian/项目文档/徐工/X9HP开机时间优化分析报告.md
2026-11-05 14:35:04 +08:00

15 KiB
Raw Permalink Blame History

X9HP 开机时间优化分析报告

日期: 2026-06-04 平台: Semidrive X9HP (Android 10 + FreeRTOS SafetyOS on R5) 对比仓库: 徐工 (x9hp_xcmg) vs A6


一、概述

徐工仓库 (/users/lintenglong/x9hp/androd10_x9hp_ptg4.3p3) 的开机时间比 A6 仓库 (/users/lintenglong/x9hp/androd10_x9hp_ptg4.3) 慢约 3.5 秒。

经过两板 dmesg + logcat 逐段对比,定位到根因为徐工定制的 Launcher (com.yaxon.launcher) 第一帧绘制过慢。


二、原始数据

以下为两个板子上直接抓取的全部原始日志(按采集命令组织)。

2.1 dmesg 全日志

A6 dmesg

console:/ $ dmesg
[    2.113762] init: init first stage started!
[    2.543083] init: init second stage started!
[    2.840928] ueventd: Coldboot took 0.132 seconds
[    3.266118] start to do gpu hw reset !
[    3.282734] [drm] Initialized pvr ... on minor 1
[    3.319165] PVR_K: RGX Firmware image loaded
[    3.819167] e2fsck: Pass 1: Checking inodes, blocks, and sizes
[    4.024370] mkswap: Swapspace size: 2369596k
[    4.154427] apexd: Marking APEXd as starting
[    7.498030] === Current system mem: ...
[    7.540411] bcm89883_config_init: start...
[    7.863817] [A6]=== CPU_info: ...
[    8.039518] ---------- Current system time: 08:00:09 CST boot_completed checking ----------
[    9.708556] sdcardfs version 2.0
[   14.191638] [boot_completed] ANDROID_BOOT_STATUS set: id=16, val=0x10000

徐工 dmesg

console:/ $ dmesg
[    2.269841] init: init first stage started!
[    2.697998] init: init second stage started!
[    3.025057] ueventd: Coldboot took 0.194 seconds
[    3.457942] start to do gpu hw reset !
[    3.475247] [drm] Initialized pvr ... on minor 1
[    3.797422] PVR_K: RGX Firmware image loaded
[    4.010759] e2fsck: Pass 1: Checking inodes, blocks, and sizes
[    4.148274] Adding 2579104k swap ...
[    5.136792] update_verifier: Booting slot 0 ...
[    7.548430] ---------- Current system time: 08:00:08 CST boot_completed checking ----------
[    9.039796] sdcardfs version 2.0
[   17.333482] init: Received control message 'stop' for 'bootanim' from pid: 3300
[   17.521355] [boot_completed] ANDROID_BOOT_STATUS set: id=16, val=0x10000
[   18.350758] ---------- Current system time: 10:24:17 CST boot_completed done ----------

2.2 boot_progress 全日志

A6 boot_progress

console:/ $ logcat -b events -d | grep boot
01-01 08:00:06.641  2925  2925 I boot_progress_start: 5202
01-01 08:00:07.142  2925  2925 I boot_progress_preload_start: 5703
01-01 08:00:08.328  2925  2925 I boot_progress_preload_end: 6889
01-01 08:00:08.514  3276  3276 I boot_progress_system_run: 7075
01-01 08:00:08.779  3276  3276 I boot_progress_pms_start: 7339
01-01 08:00:09.068  3276  3276 I boot_progress_pms_system_scan_start: 7629
01-01 08:00:09.482  3276  3276 I boot_progress_pms_data_scan_start: 8043
01-01 08:00:09.485  3276  3276 I boot_progress_pms_scan_end: 8046
01-01 08:00:09.703  3276  3276 I boot_progress_pms_ready: 8264
05-25 21:49:45.099  3276  3276 I boot_progress_ams_ready: 9548
05-25 21:49:49.547  2753  2870 I sf_stop_bootanim: 13996

徐工 boot_progress

console:/ $ logcat -b events -d | grep boot
01-01 08:00:06.677  2913  2913 I boot_progress_start: 5238
01-01 08:00:07.183  2913  2913 I boot_progress_preload_start: 5744
01-01 08:00:08.196  2913  2913 I boot_progress_preload_end: 6757
01-01 08:00:08.391  3296  3296 I boot_progress_system_run: 6952
01-01 08:00:08.667  3296  3296 I boot_progress_pms_start: 7228
01-01 08:00:08.862  3296  3296 I boot_progress_pms_system_scan_start: 7423
01-01 08:00:09.158  3296  3296 I boot_progress_pms_data_scan_start: 7719
01-01 08:00:09.161  3296  3296 I boot_progress_pms_scan_end: 7722
01-01 08:00:09.354  3296  3296 I boot_progress_pms_ready: 7915
05-30 10:05:07.567  3296  3296 I boot_progress_ams_ready: 8645
05-30 10:05:10.701  3296  3322 I boot_progress_enable_screen: 11779
05-30 10:05:15.944  2734  3343 I sf_stop_bootanim: 17022
05-30 10:05:16.042  2736  4831 I sf_stop_bootanim: 17264
05-30 10:05:16.047  3299  3326 I wm_boot_animation_done: 17268

2.3 Launcher 启动日志

A6 Launcher

未抓取到特定日志(SDDemo 启动快)。

徐工 Launcher

console:/ $ logcat -d | grep "com.yaxon.launcher"
01-01 08:00:09.034  3299  3357 E PackageParser: wangsl find an home app,app is ApplicationInfo{... com.yaxon.launcher}
05-30 10:05:07.916  3299  3331 I ActivityManager: Start proc 3536:com.yaxon.launcher/1000
05-30 10:05:07.980  3299  3299 I ActivityTaskManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000100 cmp=com.yaxon.launcher/.main.LauncherActivity}
05-30 10:05:08.409  3536  3536 D IocContainer: inject key:...LauncherApplication
05-30 10:05:08.413  3536  3536 D UserCenterControllerImp: send broadcast
05-30 10:05:08.624  3589  3589 I CAR.AM  : Updating top task to: LauncherActivity
05-30 10:05:08.849  3536  3536 D IocContainer: inject key:...SoundSourceViewModel
05-30 10:05:08.897  3536  3536 D IocContainer: inject key:...SoundSourceViewModel
05-30 10:05:08.924  3536  3536 D IocContainer: inject key:...IntelligentDrivingCardViewModel
05-30 10:05:09.037  3536  3536 D IocContainer: inject key:...DisplayShareViewModel
05-30 10:05:09.058  3536  3536 D IocContainer: inject key:...DisplayShareViewModel
05-30 10:05:09.068  3536  3536 D DisplayShareBusyness: resolveDisplayShareViewModel3
05-30 10:05:09.117  3536  3536 D IocContainer: inject key:...IntelligentDrivingCardViewModel
05-30 10:05:09.300  3536  3536 D IocContainer: inject key:...IntelligentDrivingCardViewModel
05-30 10:05:09.862  3536  3536 W ContextImpl: ...LauncherActivity.sendHomeStatusBroadcast ...LauncherActivity.onResume
05-30 10:05:12.540  3892  3892 I ForegroundAppMonitor: Foreground app changed:  -> com.yaxon.launcher
05-30 10:05:19.087  3536  3536 D DisplayShareBusyness: resolveDisplayShareViewModel3
05-30 10:05:28.038  3299  3332 I ActivityTaskManager: Displayed com.yaxon.launcher/.main.LauncherActivity: +2s598ms

2.4 init 服务列表

A6 running services

console:/ $ getprop | grep "init.svc" | grep running
[init.svc.adbd]: [running]
[init.svc.apexd]: [running]
...共 75 个服务...
[init.svc.zygote_secondary]: [running]

徐工 running services

console:/ $ getprop | grep "init.svc" | grep running
[init.svc.adbd]: [running]
[init.svc.apexd]: [running]
...共 74 个服务...
[init.svc.zygote_secondary]: [running]

# 特有的服务:
[init.svc.check_data_partition]: [running]
[init.svc.logcollector]: [running]
[init.svc.ut-service]: [running]
[init.svc.yx_tbox]: [running]

# A6 有但徐工没有的服务:
# - [init.svc.evs_driver]: [running]
# - [init.svc.evs_manager]: [running]
# - [init.svc.gocsdk_auth]: [running]
# - [init.svc.vendor.sensors-hal-1-0]: [running]

2.5 进程数量

# A6
console:/ $ ps -A | wc -l
278

# 徐工
console:/ $ ps -A | wc -l
259

2.6 bootanim 状态

# 两个仓库
console:/ $ getprop init.svc.bootanim
stopped

2.7 数据分区大小

# A6
console:/ $ df -h /data
Filesystem            Size  Used Avail Use% Mounted on
/dev/block/mmcblk1p26  44G  438M   43G   1% /data

# 徐工
console:/ $ df -h /data
Filesystem            Size  Used Avail Use% Mounted on
/dev/block/mmcblk1p25  44G  438M   43G   1% /data

三、对比分析

3.1 内核时间戳对比 (dmesg)

事件 A6 徐工 差
init first stage 2.11s 2.27s +0.16s
init second stage 2.54s 2.70s +0.16s
ueventd coldboot 0.132s (2.84s) 0.194s (3.03s) +0.06s
GPU 驱动初始化 3.28s 3.48s +0.20s
GPU 固件加载 3.32s 3.80s +0.48s
GPU 完成 3.28s→3.32s (0.04s) 3.48s→3.80s (0.32s) +0.28s
e2fsck data 分区 3.82s→3.83s 4.01s→4.13s +0.30s
swap 开启 4.02s 4.15s +0.13s
update_verifier 完成 ~5.14s 5.14s 持平
sdcardfs 挂载 9.71s 9.04s -0.67s ✅
boot_completed checking 7.50s 7.55s +0.05s
boot_completed 到达 14.19s 17.52s +3.33s ❌

3.2 Boot Progress 对比

将 logcat 时间戳转为开机后秒数:

阶段 A6 (ms) A6 (s) 徐工 (ms) 徐工 (s) 差(s)
boot_progress_start 5202 5.20 5238/5385 5.39 +0.19
preload_start 5703 5.70 5744/5854 5.85 +0.15
preload_end 6889 6.89 6757/6886 6.89 0.00
system_run 7075 7.08 6952/7089 7.09 +0.01
pms_start 7339 7.34 7228/7338 7.34 0.00
pms_system_scan_start 7629 7.63 7423/7522 7.52 -0.11
pms_data_scan_start 8043 8.04 7719/7850 7.85 -0.19
pms_scan_end 8046 8.05 7722/7853 7.85 -0.20
pms_ready 8264 8.26 7915/8048 8.05 -0.21
ams_ready 9548 9.55 8645/8791 8.79 -0.76 ✅
enable_screen - - 11779/11813 11.81 -
sf_stop_bootanim 13996 14.00 17022/17264 17.26 +3.26 ❌
wm_boot_animation_done - - 17268 17.27 -

注:徐工 boot_progress 有两组时间戳(logcat 时间±开机时间),这里取开机时间换算值。

3.3 各阶段耗时对比

阶段 A6 耗时 徐工耗时 差 结论
start→preload_start 0.50s 0.46s -0.04s ✅ 正常
preload_start→end (Zygote预加载) 1.19s 1.04s -0.15s ✅ 正常
preload_end→system_run 0.19s 0.20s +0.01s ✅ 正常
system_run→pms_start 0.26s 0.25s -0.01s ✅ 正常
pms_start→pms_ready (PMS扫描) 0.93s 0.69s -0.24s ✅ 徐工略快
pms_ready→ams_ready 1.28s 0.73s -0.55s ✅ 徐工快
ams_ready→sf_stop (总耗时) 4.45s 8.47s +4.02s ❌ 问题区间
ams_ready→enable_screen - 3.02s - 正常范围
enable_screen→sf_stop - 5.45s - 等待Launcher
总 (start→sf_stop) 8.80s 11.87s +3.07s ❌

3.4 init 服务差异

差异项 A6 徐工 影响
总进程数 278 259 −19(正常)
running services 75 74 基本相同
特有服务 evs_driver, evs_manager, gocsdk_auth, sensors-hal check_data_partition, logcollector, ut-service, yx_tbox, StrLink 差异微小,非导致3.5s的原因
bootanim 状态 stopped stopped 一致

3.5 Launcher 启动耗时(根因)

徐工 com.yaxon.launcher 启动时间线:

时间 事件 距开机(s)
10:05:07.916 进程启动 ~9s
10:05:07.980 START LauncherActivity ~9s
10:05:08.409 IocContainer 注入开始 ~9.5s
10:05:08.413 UserCenterController ~9.5s
10:05:08.624 CAR.AM 更新前台任务 ~9.5s
10:05:08.892 SoundSourceViewModel ×2 ~10s
10:05:08.924 IntelligentDrivingCardViewModel ~10s
10:05:09.037 DisplayShareViewModel ×N ~10s
10:05:09.862 onResume ~10.5s
10:05:12.540 ForegroundAppMonitor 确认前台 ~13.5s
10:05:19.087 DisplayShareBusyness resolve ~20s
10:05:28.038 Displayed: +2s598ms ~29s

A6 用的是 SDDemo MainActivity(简单 Demo 列表),没有复杂的依赖注入开销,启动极快,不影响 bootanim 停止时间。


四、根因结论

前 9.5 秒两个仓库几乎一致,甚至徐工还快 1 秒。3.5 秒的差距全部集中在 ams_ready (8.79s) 到 sf_stop_bootanim (17.26s) 之间。

具体链路:

ams_ready (8.79s)
  → system_server 启动各种服务
  → Launcher 启动 (9s)
  → enable_screen (11.81s) → 屏幕亮起(R5 彩条/动画)
  → WindowManager 等待 Launcher 绘制第一帧
  → Launcher 还在 IocContainer 注入中...
  → LauncherActivity onResume (10.5s)
  → Displayed (29s) ← 绘制完成!
  → sf_stop_bootanim (17.26s) ← WMS 等不及了,超时停止
  → boot_completed (17.52s)

根本原因:com.yaxon.launcher 的 IocContainer 依赖注入太重,大量 ViewModel 同步初始化(SoundSourceViewModel ×2、IntelligentDrivingCardViewModel ×2、DisplayShareViewModel ×N),拖慢了首帧绘制,导致 WindowManager 等待超时。


五、优化建议

5.1 治本:优化 Launcher 启动(推荐,预期收益 2-3s)

优化项 说明 预期收益 难度
非首屏 ViewModel 懒加载 DisplayShareViewModel 等延后到主界面显示后注入 ~1-2s 中
减少同步 IocContainer DI 注入 改为异步/懒加载 ~0.5-1s 中
移除不必要的 broadcast sendHomeStatusBroadcast 等 ~0.1s 低

5.2 治标:提前停 bootanim(预期收益 3-4s)

在 enable_screen 后就 stopBootAnim(),不等 Launcher 绘制。但 boot_completed 会在桌面未完全渲染时发出。

5.3 其他优化(组合使用可达 1-2s)

优化项 路径 说明 预期
bootlogo 4s hardcode bootlogo.c thread_sleep(4000) 改 500ms ~3.5s
R5 动画提前结束 已实现彩条测试 收到 boot_completed 立即清屏 视觉改善

六、验证方式

# 1. boot_completed 内核时间戳
dmesg | grep "boot_completed"

# 2. Launcher 第一帧绘制时间
logcat -d | grep "Displayed.*launcher"

# 3. boot_progress 全链路
logcat -b events -d | grep "boot_progress\|sf_stop"

目标:将 sf_stop_bootanim 从 17.26s 降低到 14s 以内。


七、附录

7.1 R5 开机动画流程

LK Boot → FreeRTOS SafetyOS (lk_main)
  → apps_init() 启动 APP_START
    ├── bootlogo     → 显示 YUV 图片, thread_sleep(4000)
    ├── USM          → Unified Service Manager
    │   ├── SplashScreen   → 显示 RGB 品牌图
    │   └── Animation      → 播放 MJPEG 动画
    │       ├── 新路径: ani_app_5.c (ANI_APP_MODE==5)
    │       └── 通过 DCF property 监听 Android 启动状态
    │           - DMP_ID_ANDROID_BOOT_STATUS (ID=16)
    │           - 收到 boot_completed → 结束动画 → 清屏

7.2 Android Boot Completed 信号链路

sys.boot_completed=1
  → bootnotify.rc: start bootnotify
  → BootNotifyMain.cpp: setAndroidBootStatus(1)
  → ioctl(/dev/property, DCF_IOC_SET_PROPERTY, id=16)
  → 内核 DCF 驱动 (sdrv_property_client.c)
  → rpmsg 跨核通信
  → R5 property 回调 (android_changed_cb)
  → 结束动画 / 刷彩条

7.3 涉及源码路径

路径 说明
android10/vendor/semidrive/tools/BootNotify/ Boot Completed 通知
android10/vendor/semidrive/tools/ScreenTrigger/ 屏幕触发通知
android10/vendor/semidrive/tools/SDDemo/ 测试 Demo / A6 Launcher
rtos/freertos_safetyos/application/early_app/Animation/ R5 动画服务
rtos/freertos_safetyos/application/early_app/bootlogo/ Bootlogo 显示
rtos/freertos_safetyos/application/early_app/SplashScreen/ 品牌图显示
rtos/freertos_safetyos/top/main.c R5 主入口

7.4 抓取数据所用命令

# 内核日志
dmesg

# Android boot stages
logcat -b events -d | grep -E "boot_progress|sf_stop|wm_boot"

# Launcher 日志
logcat -d | grep "com.yaxon.launcher"

# init 服务列表
getprop | grep "init.svc" | grep running

# bootanim 状态
getprop init.svc.bootanim

# 进程数
ps -A | wc -l

# 磁盘
df -h /data