05 · 排障实战与常见问题

历史 JIRA 定案复盘 + 通用排查 playbook。新单先跑第 3 节的决策树。

1. 案例一:N801PROB-138847 点「中国移动」不生效(定案置信度 high)

现象

  • 环境:台架 Lemans_25B_RC09(suiren/YU7, A14),设置→连接→蜂窝网络「优先运营商」
  • 点「中国移动」后 Tab 蓝色选中,但网络/右侧面板恒为中国电信,5/5 必现
  • JIRA 上「是否误报=误报」是模板默认值,不作依据;现象真实

定案(三层责任)

层结论
主因=测试环境台架卡 2 在 modem/UICC 层根本不存在:slot1 CARDSTATE_ABSENT、无 ATR/eid、整机 mHasBuiltInEuicc=false。「点移动能切过去」的测试前提不成立
次因=平台契约缺陷MultiInternetRouteController.setUserDefaultChannel 受理即 true(:409),执行层 SmartDataChannelController 因目标卡 rat=0 防护性 ignore(:1716),false 无人接
次因=App UX 缺陷三 Tab 硬编码无在位卡门控(TeleCommunicationSelectController.kt:80-97),点了不可达偏好零反馈

机制链:点击 → App 乐观选中 → 反射 setUserDefaultChannel(1) → 受理层写 HMI_DATA_SIM_APN=1 返回 true → App 持久化保持选中 → 执行层 rat=0 ignore → 路由/DDS 从未离开电信。App 功能链路(反射/持久化/onResume 校准)全部按设计正确执行,无功能 bug。

裁决性证据(bugreport 行号)

证据说明
slot1 CARDSTATE_ABSENT,iccid/atr/eid 全空卡 2 物理不存在(dumpsys UICC)
mActiveSubInfos 仅 1 条(电信 460/11)活跃订阅只有电信
setDefaultChannel(1) setChannelResult = true(三次恒 true)平台受理层恒 true
SmartDataChannelController: setApnDefaultChannel ignore due to rat=0 !执行层防护忽略(与 App 调用同毫秒)
current route map={MULTI_INTERNET_1=0,...}、defaultDataSubId=1 恒路由/DDS 从未迁移
Settings.Global: VEHICLE_MOBILE_NETWORK_SELECTION=1App 偏好已持久化(非缓存陈旧)

教训与改进项

  • 截图必须人工先读再派分析——旧版曾把这个偏好选择器误读成「移动网络→手动选网 PLMN 列表」,方向全错
  • CARDSTATE_ABSENT = modem 说没卡;射频屏蔽只能造成”有卡无服务”,不可能报 ABSENT, 别把锅甩给台架铁盒屏蔽
  • 改进项(已提):App 按活跃 sub 数门控 Tab;平台无卡通道返回 false
  • 分析产物:车机JIRA/jira-data/N801PROB-138847/analysis/(含 platform-evidence-package)

2. 案例二:N801PROB-132397 切「优先运营商」偶现 16s 无响应(现象实锤,机理待埋点)

现象与实锤

  • 设置页(swim)切换运营商时偶现 16s 无任何响应(Repro=Once)
  • 实锤:car.settings 主线程冷启动期冻结 ~16s(11:37:44→11:38:00),23 次触摸 全进窗口 0 次消费,无 ANR。推翻了”点击区域过小”的猜测

已排除项(都验证过,别再怀疑)

怀疑对象排除依据
telephony 切换调用setDefaultChannel 异步执行,实测 17ms
VoiceSearch 锁竞争parseWidgets 仅 276ms
GC / 内存无 GC 记录,内存还在降
SystemUI 直接致因无交互时序

机理方向(未锁定)

唯一线程栈抓于恢复后 78s(bugreport 触发太晚),方向性怀疑主线程同步 binder 等待 (旁证:radio.extphone.common / vendor.qti.data.nwmgr)。下一步方案=主 Looper 看门狗 埋点(>500ms dump 栈)等复现。

附带发现

  • SystemUI 独立 Minor 缺陷已拆出:TBoxSignalDialog.onClick 拿 statusCode=5+全 null 缓存仍两次拉起 NetworkFlowGuideDialog 并冷启动 car.settings
  • 教训:[PAUSE_TIMEOUT] removed for 是看门狗正常取消日志,不是超时;真实超时 格式是 Activity pause timeout for

3. 新单排查决策树

flowchart TD
    Start[收到蜂窝网络相关单] --> Q1{现象类型?}
    Q1 -- "点了不切/不生效" --> C1["① 查卡在位:<br/>dumpsys telephony.registry | grep -i cardstate<br/>settings get global HMI_DATA_SIM_APN"]
    C1 --> C2{卡2在位?}
    C2 -- "ABSENT" --> Env["测试环境前提不满足<br/>(参照 138847 关单话术)"]
    C2 -- "在位" --> C3["② 查受理:<br/>logcat 找 setUserDefaultChannel / setChannelResult<br/>radio 进程找 setApnDefaultChannel"]
    C3 --> C4{"有 ignore due to rat? "}
    C4 -- 有 --> Rat["目标卡无服务<br/>=平台正确防护,查卡2为何无服务"]
    C4 -- "无" --> C5["③ 查路由迁移:<br/>dumpsys 里 defaultDataSubId /<br/>current route map 是否动"]
    Q1 -- "点击无响应/冻结" --> F1["主线程冻结方向<br/>查触摸事件消费/主 Looper<br/>(参照 132397,telephony 本身 17ms 已排除)"]
    Q1 -- "Tab 选中态错乱/丢失" --> U1["查双 key 一致性:<br/>VEHICLE_MOBILE_NETWORK_SELECTION vs HMI_DATA_SIM_APN<br/>+ onResume 校准日志"]
    Q1 -- "反射异常" --> R1["logcat 找 ClassNotFound/NoSuchMethod<br/>= ROM 平台 API 缺失或改名<br/>核对 flavor 用对没有"]

4. 日志关键字速查

关键字出处含义
TeleCommunicationSelectController 或 get mobile network selectionApponResume 读缓存值
onTelephonySIMCardSelectChangedApp点击分发
setDefaultChannel(N) setChannelResult = XApp(:169 打点)平台调用结果
netIndex=...App(:114 打点)平台权威值回读
setUserDefaultChannel, channel=radio 进程受理层入口
setApnDefaultChannel ignore due to rat=radio 进程执行层防护忽略
updateDataChannelradio 进程真正切通道
CARDSTATE_dumpsys telephony.registry卡在位态

release ROM 上 CarSettings 的 I 级 MLog 未裁剪(138847 实证),D 级需 setprop log.tag.TeleCommunicationSelectController D。

5. 甩单/协查口径

  • 平台 telephony(选卡/路由/智能双卡策略/无卡返回 false 改进):庄员 zhuangyuan@xiaomi.com
  • App 侧(Tab 门控/反馈/文案):MiCarSettings 自己
  • 测试环境(eSIM 到位/台架卡形态):台架维护方 + TBox 侧查 eSIM provisioning