50 · WLAN 类地图与资源锚点速查卡
一页纸导航:类职责、关键常量、线程模型、zh 文案资源。代码基线 fuben_micarsettings @ dev,f3 flavor。
1. 类地图(按层)
App 层 settingsPage/micarConnectionSettings/.../miauto/wifi/
├─ view/
│ ├─ WifiSettingsActivity.kt 弹窗壳(842×864,singleTask,:WifiSettings);失败广播接收
│ ├─ MiCarWifiListFragment.kt 列表页(tracker 创建/销毁;ComparisonCallback;wifi-off tip)
│ ├─ MiCarWifiEntryDetailFragment.kt 详情页(共享 entry 引用;自动连接开关+改密/删除)
│ ├─ WifiPasswordDialog.kt 密码框(object;8~63 校验;企业网身份框)
│ ├─ WlanProvisionDialogActivity.kt 首开引导壳(singleInstance 全屏)
│ ├─ MiCarWifiProvisionFragment.kt 引导列表页(独立 tracker;继续按钮)
│ └─ networkrequest/*(6 文件) 第三方要网弹窗(30s 超时;select 交框架)
├─ controller/
│ ├─ WifiSwitchController.kt 总开关(唯一 setWifiEnabled 上游;三层防抖)
│ ├─ WifiConnectionStateController.kt 连接主页入口右侧文案(直收系统广播)
│ ├─ MiCarWifiAutoConnectController.kt 详情页自动连接(allowAutojoin)
│ ├─ MiCarBaseWifiEntryController.kt 列表基类(双线程刷新;点击三分支;空波防护)
│ ├─ MiCarSavedWifiListController.kt 已保存组(connected 置顶+saved)
│ ├─ MiCarAvailableWifiListController.kt 可用组(滤 isSaved;刷新动画)
│ └─ MiCarProvisionWifiListController.kt 引导单列表(无空波防护!)
├─ preference/
│ ├─ MiCarWifiEntryPreference.kt 条目(WifiEntryCallback 局部刷新;信号图标;详情按钮)
│ ├─ MiCarSavedWifiEntryPreference.kt 已保存条目(换布局)
│ └─ MiCarProvisionWifiEntryPreference.kt
├─ MiCarWifiUtils.kt WifiManager 薄封装(connect/startScan/开关/detailWifiEntry 单例)
├─ MiWifiTrackerUtils.kt tracker 持有者(HandlerThread;三取数 API;热点过滤)
├─ WifiExt.kt isConnected/isConnecting/isOpenNetwork 谓词
└─ f3dif/MiCarWifiCollinear.kt flavor 接缝:new WifiPickerTracker
库层 base/WifiTrackerLib/src/f3dif/.../wifitrackerlib/
├─ BaseWifiTracker.java 双线程骨架+广播分发+Scanner 循环(1200 行)
├─ WifiPickerTracker.java 列表数据引擎(拆快照/排序/回调,1634 行)
├─ WifiEntry.java 单网络状态机+门面(3 态 connectedState;1741 行)
├─ StandardWifiEntry.java 标准实现(connect 四分支/forget/level/security)
├─ ScanResultUpdater.java 扫描合并窗(SSID+BSSID 去重;15s/5min)
├─ WifiTrackerInjector.java 注入(Clock/wifi-state 缓存/verbose)
├─ Utils.java 文案映射族(getSecurityString/getConnectedDescription...)
├─ WifiEntryUtilsStub.java MIUI 信号格数云控换算
├─ CrossSubnetUtils.java 漫游补 VALIDATED(无条件生效的静态工具,非反射旁路)
├─ SlaveWifiUtilsStub/PasspointUtilsStub/IPasspointUtils 反射桩(车机休眠)
└─ NetworkDetailsTracker/SavedNetworkTracker/其余 Entry 子类 车机零引用(死代码可能性)
2. 关键常量
| 常量 | 值 | 位置 |
|---|
| DEFAULT_SCAN_INTERVAL_MILLIS | 10_000(10s 一扫) | MiCarWifiUtils.kt:19 |
| DEFAULT_MAX_SCAN_AGE_MILLIS | 15_000(扫描过期窗) | MiWifiTrackerUtils.kt:29 |
| MAX_SCAN_AGE_FOR_FAILED_SCAN_MS | 5min(失败兜底窗) | ScanResultUpdater.java:36 |
| EMPTY_DEFER_MS | 500L(空波复核) | MiCarBaseWifiEntryController.kt:57 |
| WIFI_PWD_LENGTH_RANGE | 8..63 | MiCarWifiUtils.kt:25 |
| USER_RECENTLY_DISCONNECTED_TIMEOUT_MS | 10_000(canConnect 门槛) | StandardWifiEntry.java:117 |
| 信号阈值(默认) | 2.4G{-91,-77,-65} / 5G{-91,-79,-65} | WifiEntryUtilsStub.java:25-26(云控 cloud_wifi_signal_level) |
| 扫描截断 | >200 条保 top200 | WifiPickerTracker.java:1256-1264 |
| NetworkRequest 超时 | 30_000 | NetworkRequestDialogActivity.java:29 |
3. 线程模型(一图)
主线程(mainLooper)
├─ Fragment/Controller 生命周期、Preference UI
├─ WifiPickerTracker 回调(mMainHandler.post)
├─ WifiEntry 局部刷新(mCallbackHandler=mainHandler post)
└─ MiCarBaseWifiEntryController.mHandler(UPDATE_MESSAGE_WHAT=0x101 重建)
worker 线程 "MiWifiTrackerTools{hash}"(BACKGROUND,每页一个)
├─ BaseWifiTracker 全部广播 onReceive
├─ WifiPickerTracker handleXxx/扫描循环(Scanner postDelayed 自驱 10s)
└─ 库内 binder 调用(getScanResults/getConfiguredNetworks)
ThreadPoolUtils.SINGLE_ASYNC(App 单线程池)
└─ MiCarBaseWifiEntryController.fillWifiEntries(读 tracker 拷贝)
ThreadPoolUtils.ASYNC(App 通用池)
└─ WifiSwitchController.setWifiEnable(binder)
4. zh 文案资源锚点(高频)
| 文案 | 资源 | 位置 |
|---|
| ”WLAN”(标题/入口) | wifi_entry_title | micarConnectionSettings zh:6 |
| ”已开启”/“已关闭” | wifi_state_on/off_summary | :55/:56 |
| ”可用网络” | micar_connection_wifi_nearby_network | :109 |
| ”自动连接”(详情页) | micar_wifi_entry_detail_auto_connect | :108 |
| ”修改密码”/“删除网络” | micar_wifi_entry_btn_modify_ps 等 | :111/:112 |
| ”密码错误,请重新输入”(红字) | micar_connection_wifi_password_wrong | :150 |
| ”已关闭自动连接” | wifitrackerlib_auto_connect_disable | WifiTrackerLib zh:21 |
| 安全类型串(WPA3/WPA/WPA2-EAP…) | wifitrackerlib_wifi_security_* | :57-75 |
| 已连接族(“网络连接受限”等) | getConnectedDescription | Utils.java:278+ |
| 连接中 12 态表 | wifitrackerlib_wifi_status | arrays.xml:24-36 |
| 断开族(“已保存”/“请检查密码…”等) | getDisconnectedDescription | Utils.java:386+;串 :24-37 |
5. 广播/事件清单(库订阅的全部)
| action/回调 | 处理 | 行(BaseWifiTracker f3dif) |
|---|
| WIFI_STATE_CHANGED | handleWifiStateChangedAction | :165-171 |
| SCAN_RESULTS_AVAILABLE ∥ 高通 PARTIAL | handleScanResultsAvailableAction | :173-176 |
| CONFIGURED_NETWORKS_CHANGED | handleConfiguredNetworksChangedAction | :177-178 |
| NETWORK_STATE_CHANGED | handleNetworkStateChangedAction | :179-180 |
| RSSI_CHANGED(仅 verbose) | handleRssiChangedAction | :181-182 |
| DEFAULT_DATA_SUBSCRIPTION_CHANGED | handleDefaultSubscriptionChanged | :183-185 |
| MIUI slave×5(SLAVE_STATE/AML_NETWORK_SLAVE/WIFI_SLAVE/AML_WIFI_SLAVE/SLAVE_RSSI) | isSlave 才生效;SLAVE_RSSI 无分支(死) | :187-202 |
| NetworkCallback(TRANSPORT_WIFI) | onCapabilitiesChanged/onLinkProperties/onLost | :238-282 |
| DefaultNetworkCallback | — | :284-298 |
| ConnectivityDiagnostics | handleConnectivityReportAvailable | :301-319 |
| App 自定义:micar.intent.action.WIFI_CONNECTION_FAILURE | WifiSettingsActivity:42(框架发) | — |
6. 一屏复习:五个最容易踩的认知坑
- connectedState 只有 3 态(无 DISCONNECTING;“正在断开连接…”文案来自 DetailedState 映射,不是枚举)。
- 已保存列表只显示在范围内的(没有全量配置建表;AP 出范围=从列表消失)。
- 列表刷新 = 全量重建无 diff;“不闪”是 ComparisonCallback+guard 两层补丁的功劳。
- 详情页没有独立 tracker(共享列表页 entry 引用;列表页 onStop 后详情页状态冻结)。
- slave/MLO/PasspointR1 在车机休眠(线程名不含 “slave”;反射类不存在),读代码别被这些分支带偏。