03 - 异步任务耗时项深挖
维度 C:逐项剖析
AsyncThreadStartTask.execute()中每一项初始化的实现、耗时、所属线程与外部依赖 入口:app/src/main/java/com/android/car/settings/miauto/AsyncThreadStartTask.java:74-108总耗时注释标注 ~61ms(无 bugreport 独立实测,以下耗时均为代码注释值)
一、execute() 执行序列
@Override
protected void execute() {
SettingsTrack.init(mApplication.getApplicationContext()); // :76 4ms
VoiceAssistProvider.initialize(mApplication.getApplicationContext()); // :77 6ms
// 多用户条件块(见 04):仅当前用户非 SYSTEM 且为活动用户时执行,5ms
if (mApplication.getUserId() != UserHandle.USER_SYSTEM &&
mApplication.getUserId() == ActivityManager.getCurrentUser()) {
initCustomSyncHandler();
registerNormalRecordDataListenerAndRefreshModeName();
registerAccountsUpdateListener();
initDrivingConfig();
} else {
SteeringModeTypeAdjustHelper.getInstance().release();
}
new VoiceSearchManager.SearchInitBuilder() // :89-91 0ms
.registSearchResultInterceptor(new SpecialResultDataListInterceptor())
.initSearchManager();
initHudConfig(); // :94 17ms
// 耗时19MS ---------start-----------
initLinkManager(); // :97
MQTTManagerHelper.initMQTTManager(); // :98
GlobalCarAudioControlManager.init(mApplication); // :101
// 耗时19MS ---------end-----------
TrackTrigger.INSTANCE.init(); // :105 快照打点
UserSwitchCleanerManager.addListener(); // :107 用户切换清理
}二、逐项拆解表
| # | 初始化项 | 实现位置 | 职责 | 标注耗时 | 二次切线程 | 外部依赖 |
|---|---|---|---|---|---|---|
| 1 | SettingsTrack.init | base/.../track/SettingsTrack.kt:25-69 | 埋点 SDK,创建 4 个 OneTrack 实例 | 4ms | 是(ASYNC 打日志) | OneTrack SDK |
| 2 | VoiceAssistProvider.initialize | base/.../voiceassist/VoiceAssistProvider.kt:81-98 | 语音助手 Provider,连接语音服务中心 | 6ms | 是(异步 connect+重试) | VoiceAssist ServiceCenter / 蓝牙 PBAP |
| 3 | (条件块)账号同步 | 见 04 | 注册 12 个 SyncHandler + DB 监听 + 账号监听 | 5ms | 是(refreshModeList / updateAvm) | 账号服务 / Car 服务 |
| 4 | VoiceSearchManager | base/.../voiceassist/VoiceSearchManager.java:140-164 | 语音搜索初始化,注册拦截器 | 0ms | 是(ASYNC 加载缓存) | 本地 DB |
| 5 | initHudConfig | base/.../display/CarHudControlCompatManager.kt:17-27 + HudSettingsUtils.kt:69-78 | HUD 兼容管理器 + 下发关闭对话框命令 | 17ms | 否(同步) | Car.HUD_SERVICE |
| 6 | initLinkManager | AsyncThreadStartTask.java:217-220 | Link SDK MisComplexSdk.init(app,false,false) | 19ms(合计) | 否(同步) | MisComplexSdk(外部 AAR) |
| 7 | MQTTManagerHelper.initMQTTManager | base/.../push/MQTTManagerHelper.java:20-25 | MQTT 推送,绑定 push 服务 | 19ms(合计) | 否(同步) | ReportManager(Push 服务) |
| 8 | GlobalCarAudioControlManager.init | base/.../volume/GlobalCarAudioControlManager.kt:16-23 | 全局 CarAudioControl,触发 Car 连接 | 19ms(合计) | 否(Car 连接阻塞) | Car.AUDIO_SERVICE |
| 9 | TrackTrigger.init | settingsPage/micarSnapshot/.../TrackTrigger.kt:29-34 | 快照打点,注册 ACC 信号监听 | (含61ms内) | 是(postOnBackgroundThread) | Car 服务(POWER_MODE) |
| 10 | UserSwitchCleanerManager.addListener | settingsPage/settingsSystem/.../cleaner/UserSwitchCleanerManager.java:40-70 | 用户切换时停止清理任务 | (含61ms内) | 否(Car.createCar 同步) | Car.CAR_USER_SERVICE |
三、重点项详解
3.1 SettingsTrack.init —— 4ms
文件:base/settingsBaseLib/src/main/java/com/android/micar/settings/track/SettingsTrack.kt:25-69
创建 4 个 OneTrack(小米统计 SDK)实例:
- 主应用埋点(APP 模式,AppId
31000401514,ProjectIdxiaomiev-cockpit-intl) - CarManager 埋点(PLUGIN 模式)
- 语音埋点(SDK 模式)
- 主动智能埋点(SDK 模式)
4ms 耗时主要在同步创建实例;日志打印二次切到 ASYNC。
3.2 VoiceAssistProvider.initialize —— 6ms
文件:base/settingsBaseUi/src/main/java/com/android/car/settings/miauto/voiceassist/VoiceAssistProvider.kt:81-98
- 创建
ProviderClient,注册VoiceProviderCallback connect()异步连接语音服务中心,支持 QABOT(语音问答)+ SETTINGS(页面导航)- 重试机制:连接失败最多重试 5 次,每次
Handler.postDelayed(5000L)间隔 5s - 6ms 仅是创建 ProviderClient,实际连接在后台
3.3 initHudConfig —— 17ms(最大单项)
文件:CarHudControlCompatManager.kt:17-27 + HudSettingsUtils.kt:69-78
fun init(application: Application) {
HudSettingsCompat.init(application) {
// 注销旧监听器后重新注册
HudSettingsCompat.registerHudCustomSettingsListener(mIHudCustomThemeListener)
HudSettingsCompat.registerParkingViewEnableListener(mIParkingViewEnableListener)
HudSettingsCompat.registerArViewEnableListener(mIArViewEnableListener)
}
}为何主动下发关闭对话框命令(AsyncThreadStartTask.java:200-204):
private void initHudConfig() {
CarHudControlCompatManager.INSTANCE.init(mApplication);
// 防止因断电导致 QNX HUD 与 Settings 状态不一致
HudSettingsUtils.INSTANCE.putHudCommand(HUD_DIALOG_OFF_TYPE, "");
}- 车机突然断电时,QNX 侧 HUD 可能保持对话框打开状态
- Android Settings 重启后状态已重置,但 QNX 侧未重置
- 主动下发
HUD_DIALOG_OFF_TYPE强制关闭,确保双端状态一致
风险:依赖 Car.HUD_SERVICE,HudSettingsCompat.init 可能同步阻塞等待 Car 连接(CAR_WAIT_TIMEOUT_WAIT_FOREVER)。
3.4 initLinkManager + MQTT + AudioControl —— 19ms(合计)
| 项 | 实现 | 说明 |
|---|---|---|
initLinkManager | MisComplexSdk.getInstance().init(app, false, false) | 小米车机 Link SDK,实现在外部 AAR。两个 false 参数:推测为「不自动连接」「非调试模式」 |
MQTTManagerHelper.initMQTTManager | MQTTManager.java:39-84 | 注册推送处理器(MiCarNicknameProcessor 车机昵称更新),ReportManager.init 同步绑定 push 服务,连接通过回调通知,支持延迟队列(未连接时缓存消息) |
GlobalCarAudioControlManager.init | GlobalCarAudioControlManager.kt:16-23 | 创建 CarAudioControlManager(继承 NewBaseCarServiceManager),构造时 LocalCarManager.getInstance().createCar(...) 触发 Car 连接,SoftReference 持有 |
3.5 TrackTrigger.init —— 快照打点
文件:settingsPage/micarSnapshot/src/main/java/com/micar/settings/snapshot/TrackTrigger.kt:29-34
完全异步(postOnBackgroundThread):
- 注册
POWER_MODE信号监听 - 执行
TriggerSource.AppBoot应用启动打点 - ACC 状态变化时执行
TriggerSource.PowerAcc打点
3.6 UserSwitchCleanerManager.addListener
文件:settingsPage/settingsSystem/src/main/java/com/android/car/settings/storage/micarstorage/cleaner/UserSwitchCleanerManager.java:40-70
public static synchronized void addListener() {
if (sListenerRegistered) return;
if (!hasRequiredPermissions(...)) return; // 需 INTERACT_ACROSS_USERS(_FULL)
CarUserManager carUserManager = getCarUserManager(...);
carUserManager.addListener(ThreadPoolUtils.ASYNC, event -> {
if (event.getEventType() == USER_LIFECYCLE_EVENT_TYPE_SWITCHING) {
CleanManagerFactory.stopAllCleanTasks(); // 用户切换时停止清理
}
});
}注意:getCarUserManager 每次都 Car.createCar() 新建连接并 disconnect() —— 用完即断,但创建 Car 连接有开销。
四、外部依赖关系图
graph TB subgraph Task["AsyncThreadStartTask.execute (ASYNC线程池)"] A["SettingsTrack.init 4ms"] B["VoiceAssistProvider.init 6ms"] C["账号同步 5ms"] D["VoiceSearch 0ms"] E["initHudConfig 17ms★"] F["initLinkManager"] G["MQTTManagerHelper"] H["GlobalCarAudioControlManager"] I["TrackTrigger"] J["UserSwitchCleanerManager"] end subgraph Car["Car 服务依赖"] C1[Car.HUD_SERVICE] C2[Car.AUDIO_SERVICE] C3[Car.CAR_USER_SERVICE] C4["VehicleProperty<br/>POWER_MODE"] end subgraph SDK["外部 SDK"] S1[OneTrack 统计] S2[MisComplexSdk Link] end subgraph Other["其他依赖"] O1[VoiceAssist ServiceCenter] O2[蓝牙 PBAP] O3[ReportManager Push] O4[本地 DB] end A --> S1 B --> O1 B --> O2 C -.-> C4 D --> O4 E --> C1 F --> S2 G --> O3 H --> C2 I --> C4 J --> C3 E -.->|"主动下发关闭命令<br/>防 QNX 断电状态不一致"| C1 B -.->|"异步连接+重试5次×5s"| O1 classDef hot fill:#ffe1e1,stroke:#cc0000 class E hot
五、耗时拆解汇总
| 初始化项 | 标注耗时 | 备注 |
|---|---|---|
| SettingsTrack.init | 4ms | OneTrack 实例创建 |
| VoiceAssistProvider.init | 6ms | ProviderClient 创建 |
| 账号同步块 | 5ms | 见 04 |
| VoiceSearch | 0ms | 完全异步 |
| initHudConfig | 17ms | HUD 服务连接 + 监听注册 |
| Link+MQTT+AudioControl | 19ms(三项合计) | 注释未拆分 |
| TrackTrigger + UserSwitchCleaner | (含61ms内) | 未单独标注 |
| 合计 | ~61ms | 与类注释一致 |
⚠️ 以上为代码注释标注值,无 bugreport 独立实测。实际工况(Car 服务启动晚、binder 竞争、thermal)下可能更高。
六、风险点
| 风险 | 位置 | 说明 |
|---|---|---|
| Car 服务依赖阻塞 | initHudConfig / AudioControl / UserSwitchCleaner | Car 启动晚时同步等待,可能逼近 latch 1000ms 超时 |
| 网络依赖失败 | VoiceAssist / MQTT | 启动时网络未就绪;VoiceAssist 有 5 次重试 |
| UserSwitchCleaner 频繁建连 | UserSwitchCleanerManager.getCarUserManager | 每次新建 Car 连接再断开,有开销 |
| 状态不一致 | initHudConfig 已缓解(下发关闭命令) | Car 断线重连时其他监听器状态可能不一致 |
| 权限静默失败 | UserSwitchCleaner | 跨用户权限不足时静默 return,只记日志 |
七、关键源码行号索引
| 类 | 方法/行号 |
|---|---|
| AsyncThreadStartTask.execute | AsyncThreadStartTask.java:74-108 |
| SettingsTrack.init | SettingsTrack.kt:25-69 |
| VoiceAssistProvider.initialize | VoiceAssistProvider.kt:81-98 |
| VoiceSearchManager.SearchInitBuilder | VoiceSearchManager.java:140-164 |
| initHudConfig(调用) | AsyncThreadStartTask.java:200-204 |
| CarHudControlCompatManager.init | CarHudControlCompatManager.kt:17-27 |
| HudSettingsUtils.putHudCommand | HudSettingsUtils.kt:69-78 |
| initLinkManager | AsyncThreadStartTask.java:217-220 |
| MQTTManagerHelper.initMQTTManager | MQTTManagerHelper.java:20-25 |
| MQTTManager.init | MQTTManager.java:39-84 |
| GlobalCarAudioControlManager.init | GlobalCarAudioControlManager.kt:16-23 |
| TrackTrigger.init | TrackTrigger.kt:29-34 |
| UserSwitchCleanerManager.addListener | UserSwitchCleanerManager.java:40-70 |
| ThreadPoolUtils.ASYNC | ThreadPoolUtils.java:19-22 |