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=1 | App 偏好已持久化(非缓存陈旧) |
教训与改进项
- 截图必须人工先读再派分析——旧版曾把这个偏好选择器误读成「移动网络→手动选网 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 selection | App | onResume 读缓存值 |
onTelephonySIMCardSelectChanged | App | 点击分发 |
setDefaultChannel(N) setChannelResult = X | App(:169 打点) | 平台调用结果 |
netIndex=... | App(:114 打点) | 平台权威值回读 |
setUserDefaultChannel, channel= | radio 进程 | 受理层入口 |
setApnDefaultChannel ignore due to rat= | radio 进程 | 执行层防护忽略 |
updateDataChannel | radio 进程 | 真正切通道 |
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