当前位置: 首页 > article >正文

Android wifi disable分析

总体流程

  • 老套路基本不变: WifiSettings 通过 WifiManager 下cmd 给 WifiService
  • WifiService 收到cmd后,先完成一部分列行检查(如UID的权限、是否airPlayMode等等),之后将cmd下发给到WifiController
  • WifiController 收到cmd 之后,在内部状态机轮询一圈(就是将cmd送给对应的状态机进行处理,处理完后,送往下一个状态机进行加工),俨然很标准化的流水线工序,完成后再送到WifiStateMachinePrime处理
  • WifiStateMachinePrime 是P 版本新增的Prime状态机,分担了原来WifiStateMachine工作,同样按照标准化流水线工序加工,完成后送到WifiNative,
  • WifiNative是包工头,负责将活儿下发到工人(wpa_supplicant)身上,工人没完成一件任务,上报分销商(wifiMonitor),各大分销商又将结果按照约定的渠道上报包工头(wifiNative)、总经销商(wifiService、wifiScanningService)等等,完成此项工作的闭环。

代码流程

1. WifiEnabler --> WifiManager

  • 老规矩: WifiSettings --> WifiEnabler 调用wifiManager 来disable Wifi
packages/apps/Settings/src/com/android/settings/wifi/WifiEnabler.java
public boolean onSwitchToggled(boolean isChecked) {
  ..  
   mWifiManager.setWifiEnabled(isChecked);
}

2. WifiManager–> WifiService --> WifiServiceImpl

  • setWifiEnabled 函数里 前面有一大堆列行检查
  • 最后是关键,发送CMD_WIFI_TOGGLED
frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiServiceImpl.java
public synchronized boolean setWifiEnabled(String packageName, boolean enable){
	.... 
	mWifiController.sendMessage(CMD_WIFI_TOGGLED);
}

3. WifiServiceImpl --> WifiController

  • 流水线上的标准加工: StaEnabledState --> StaDisabledState
  • 转入到wifiStateMachinePrime 处理wifi disable 事项
frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiController.java
class StaEnabledState extends State {
  switch (msg.what) {
          case CMD_WIFI_TOGGLED:
             if (! mSettingsStore.isWifiToggleEnabled()) {
                 if (checkScanOnlyModeAvailable()) {
                     transitionTo(mStaDisabledWithScanState);
                 } else {
                     transitionTo(mStaDisabledState); // 转入StaDisableState 处理 wifi disable 事项
                 }
             }

class StaDisabledState extends State {
	public void enter() {
	   mWifiStateMachinePrime.disableWifi(); // 转入wifiStateMachinePrime 处理wifi disable 
	   // Supplicant can't restart right away, so note the time we switched off
	   mDisabledTimestamp = SystemClock.elapsedRealtime();
	   mDeferredEnableSerialNumber++;
	   mHaveDeferredEnable = false;
	   mWifiStateMachine.clearANQPCache();
  }
}

4. WifiStateMachinePrime --> WifiScaningServiceImpl

  • WifiStateMachinePrime 发送CMD_DISABLE_WIFI给到内部状态机处理
  • WifiDisabledState 接领任务,先广播停掉Scan(WifiManager.EXTRA_SCAN_AVALIABLE),然后 clearScanResults
frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiStateMachinePrime.java
 public void disableWifi() {
 	changeMode(ModeStateMachine.CMD_DISABLE_WIFI);
 }
class WifiDisabledState extends ModeActiveState {
	 public void enter() {
	 mDefaultModeManager.sendScanAvailableBroadcast(mContext, false);
	 mScanRequestProxy.enableScanningForHiddenNetworks(false);
	 mScanRequestProxy.clearScanResults();
	 }
}

5. WifiScaningServiceImpl 善后

  • 接收到wifi disable 需求后,立即开始清掉ScanResults
frameworks/opt/net/wifi/service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java{
public void onReceive(Context context, Intent intent){
	else if (state == WifiManager.WIFI_STATE_DISABLED) {
		  mBackgroundScanStateMachine.sendMessage(CMD_DRIVER_UNLOADED);
		  mSingleScanStateMachine.sendMessage(CMD_DRIVER_UNLOADED);
		  mPnoScanStateMachine.sendMessage(CMD_DRIVER_UNLOADED);
	}	
}

 class DefaultState extends State {
 	public void enter() {
	mActiveScans.clear();
	mPendingScans.clear();}
 }

http://www.kler.cn/a/158501.html

相关文章:

  • 小米路由器用外网域名访问管理界面
  • 前后端学习
  • MySQL数据库3——函数与约束
  • Pytest 学习 @allure.severity 标记用例级别的使用
  • SSD固态硬盘删除文件基本无法恢复
  • 领海基点的重要性-以黄岩岛(民主礁)的领海及专属经济区时空构建为例
  • luceda ipkiss教程 39:修改版图text字体的粗细
  • AI:大语言模型LLM
  • 代码随想录训练营第五十六天583. 两个字符串的删除操作72. 编辑距离
  • 我最喜欢的白版应用,AI加持的新功能开源!强烈推荐
  • 开发的客户收到样品表示质量不如原供应商如何应对
  • Javafx实现浏览器
  • 数字ic设计技巧:添加debug信号
  • 记录 | CUDA编程中的 __host__ __device__ 双重修饰
  • 360公司-2019校招笔试-Windows开发工程师客观题合集解析
  • 智慧物联可视化大屏赋能设备管理和城市运行
  • 利大于弊:物联网技术对电子商务渠道的影响
  • BLUE引擎开始游戏没反应如何解决
  • MYSQL8用户权限配置详解
  • Proteus8.16仿真软件安装图文教程(Proteus 8 Professional)
  • 图书馆智能密集书架怎么用的
  • MIT_线性代数笔记:第 12 讲 图、网络、关联矩阵
  • 常见的DOS命令、Java开发环境搭建、配置Path环境变量
  • 行业内卷严重到什么程度了?
  • 代码随想录 509. 斐波那契数
  • 01_W5500简介