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 用户切换清理
}

二、逐项拆解表

#初始化项实现位置职责标注耗时二次切线程外部依赖
1SettingsTrack.initbase/.../track/SettingsTrack.kt:25-69埋点 SDK,创建 4 个 OneTrack 实例4ms是(ASYNC 打日志)OneTrack SDK
2VoiceAssistProvider.initializebase/.../voiceassist/VoiceAssistProvider.kt:81-98语音助手 Provider,连接语音服务中心6ms是(异步 connect+重试)VoiceAssist ServiceCenter / 蓝牙 PBAP
3(条件块)账号同步04注册 12 个 SyncHandler + DB 监听 + 账号监听5ms是(refreshModeList / updateAvm)账号服务 / Car 服务
4VoiceSearchManagerbase/.../voiceassist/VoiceSearchManager.java:140-164语音搜索初始化,注册拦截器0ms是(ASYNC 加载缓存)本地 DB
5initHudConfigbase/.../display/CarHudControlCompatManager.kt:17-27 + HudSettingsUtils.kt:69-78HUD 兼容管理器 + 下发关闭对话框命令17ms否(同步)Car.HUD_SERVICE
6initLinkManagerAsyncThreadStartTask.java:217-220Link SDK MisComplexSdk.init(app,false,false)19ms(合计)否(同步)MisComplexSdk(外部 AAR)
7MQTTManagerHelper.initMQTTManagerbase/.../push/MQTTManagerHelper.java:20-25MQTT 推送,绑定 push 服务19ms(合计)否(同步)ReportManager(Push 服务)
8GlobalCarAudioControlManager.initbase/.../volume/GlobalCarAudioControlManager.kt:16-23全局 CarAudioControl,触发 Car 连接19ms(合计)否(Car 连接阻塞)Car.AUDIO_SERVICE
9TrackTrigger.initsettingsPage/micarSnapshot/.../TrackTrigger.kt:29-34快照打点,注册 ACC 信号监听(含61ms内)是(postOnBackgroundThread)Car 服务(POWER_MODE)
10UserSwitchCleanerManager.addListenersettingsPage/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,ProjectId xiaomiev-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(合计)

实现说明
initLinkManagerMisComplexSdk.getInstance().init(app, false, false)小米车机 Link SDK,实现在外部 AAR。两个 false 参数:推测为「不自动连接」「非调试模式」
MQTTManagerHelper.initMQTTManagerMQTTManager.java:39-84注册推送处理器(MiCarNicknameProcessor 车机昵称更新),ReportManager.init 同步绑定 push 服务,连接通过回调通知,支持延迟队列(未连接时缓存消息)
GlobalCarAudioControlManager.initGlobalCarAudioControlManager.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.init4msOneTrack 实例创建
VoiceAssistProvider.init6msProviderClient 创建
账号同步块5ms04
VoiceSearch0ms完全异步
initHudConfig17msHUD 服务连接 + 监听注册
Link+MQTT+AudioControl19ms(三项合计)注释未拆分
TrackTrigger + UserSwitchCleaner(含61ms内)未单独标注
合计~61ms与类注释一致

⚠️ 以上为代码注释标注值,无 bugreport 独立实测。实际工况(Car 服务启动晚、binder 竞争、thermal)下可能更高。


六、风险点

风险位置说明
Car 服务依赖阻塞initHudConfig / AudioControl / UserSwitchCleanerCar 启动晚时同步等待,可能逼近 latch 1000ms 超时
网络依赖失败VoiceAssist / MQTT启动时网络未就绪;VoiceAssist 有 5 次重试
UserSwitchCleaner 频繁建连UserSwitchCleanerManager.getCarUserManager每次新建 Car 连接再断开,有开销
状态不一致initHudConfig 已缓解(下发关闭命令)Car 断线重连时其他监听器状态可能不一致
权限静默失败UserSwitchCleaner跨用户权限不足时静默 return,只记日志

七、关键源码行号索引

方法/行号
AsyncThreadStartTask.executeAsyncThreadStartTask.java:74-108
SettingsTrack.initSettingsTrack.kt:25-69
VoiceAssistProvider.initializeVoiceAssistProvider.kt:81-98
VoiceSearchManager.SearchInitBuilderVoiceSearchManager.java:140-164
initHudConfig(调用)AsyncThreadStartTask.java:200-204
CarHudControlCompatManager.initCarHudControlCompatManager.kt:17-27
HudSettingsUtils.putHudCommandHudSettingsUtils.kt:69-78
initLinkManagerAsyncThreadStartTask.java:217-220
MQTTManagerHelper.initMQTTManagerMQTTManagerHelper.java:20-25
MQTTManager.initMQTTManager.java:39-84
GlobalCarAudioControlManager.initGlobalCarAudioControlManager.kt:16-23
TrackTrigger.initTrackTrigger.kt:29-34
UserSwitchCleanerManager.addListenerUserSwitchCleanerManager.java:40-70
ThreadPoolUtils.ASYNCThreadPoolUtils.java:19-22