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_MILLIS10_000(10s 一扫)MiCarWifiUtils.kt:19
DEFAULT_MAX_SCAN_AGE_MILLIS15_000(扫描过期窗)MiWifiTrackerUtils.kt:29
MAX_SCAN_AGE_FOR_FAILED_SCAN_MS5min(失败兜底窗)ScanResultUpdater.java:36
EMPTY_DEFER_MS500L(空波复核)MiCarBaseWifiEntryController.kt:57
WIFI_PWD_LENGTH_RANGE8..63MiCarWifiUtils.kt:25
USER_RECENTLY_DISCONNECTED_TIMEOUT_MS10_000(canConnect 门槛)StandardWifiEntry.java:117
信号阈值(默认)2.4G{-91,-77,-65} / 5G{-91,-79,-65}WifiEntryUtilsStub.java:25-26(云控 cloud_wifi_signal_level)
扫描截断>200 条保 top200WifiPickerTracker.java:1256-1264
NetworkRequest 超时30_000NetworkRequestDialogActivity.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_titlemicarConnectionSettings 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_disableWifiTrackerLib zh:21
安全类型串(WPA3/WPA/WPA2-EAP…)wifitrackerlib_wifi_security_*:57-75
已连接族(“网络连接受限”等)getConnectedDescriptionUtils.java:278+
连接中 12 态表wifitrackerlib_wifi_statusarrays.xml:24-36
断开族(“已保存”/“请检查密码…”等)getDisconnectedDescriptionUtils.java:386+;串 :24-37

5. 广播/事件清单(库订阅的全部)

action/回调处理行(BaseWifiTracker f3dif)
WIFI_STATE_CHANGEDhandleWifiStateChangedAction:165-171
SCAN_RESULTS_AVAILABLE ∥ 高通 PARTIALhandleScanResultsAvailableAction:173-176
CONFIGURED_NETWORKS_CHANGEDhandleConfiguredNetworksChangedAction:177-178
NETWORK_STATE_CHANGEDhandleNetworkStateChangedAction:179-180
RSSI_CHANGED(仅 verbose)handleRssiChangedAction:181-182
DEFAULT_DATA_SUBSCRIPTION_CHANGEDhandleDefaultSubscriptionChanged: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
ConnectivityDiagnosticshandleConnectivityReportAvailable:301-319
App 自定义:micar.intent.action.WIFI_CONNECTION_FAILUREWifiSettingsActivity:42(框架发)

6. 一屏复习:五个最容易踩的认知坑

  1. connectedState 只有 3 态(无 DISCONNECTING;“正在断开连接…”文案来自 DetailedState 映射,不是枚举)。
  2. 已保存列表只显示在范围内的(没有全量配置建表;AP 出范围=从列表消失)。
  3. 列表刷新 = 全量重建无 diff;“不闪”是 ComparisonCallback+guard 两层补丁的功劳。
  4. 详情页没有独立 tracker(共享列表页 entry 引用;列表页 onStop 后详情页状态冻结)。
  5. slave/MLO/PasspointR1 在车机休眠(线程名不含 “slave”;反射类不存在),读代码别被这些分支带偏。