文章目录

    • 流框架程图
    • 代码流程
      • 1. WifiEnabler --> WifiManager
      • 2. WifiManager--> WifiService --> WifiServiceImpl
      • 3. WifiServiceImpl --> WifiController
      • 4. WifiStateMachinePrime --> WifiScaningServiceImpl
      • 5. WifiScaningServiceImpl 善后

流框架程图

Android P 版本变化还是比较大的,代码不再像以前N、L 版本那么好看了,一个简单的wlan0 bring up/down
都封装的一层又一层,所以看代码需要一点技巧,这里将Wifi Disable 的涉及的关键代码以及流程进行总结
期望对各位有帮助~~
老习惯: 先上一张图,有图理这些东西,心不慌~~

  • 可以先参考下 Android P WiFi 框架
  • 老套路基本不变: 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.javapublic 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.javapublic 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.javaclass 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();} }

更多相关文章

  1. android EditText设置不可写
  2. android 使用html5作布局文件: webview跟javascript交互
  3. android studio调试c/c++代码
  4. IM-A820L限制GSM,WCDMA上网的原理(其他泛泰机型可参考)7.13
  5. 锁屏界面
  6. android(NDK+JNI)---Eclipse+CDT+gdb调试android ndk程序
  7. Android(安卓)version and Linux Kernel version
  8. Android(安卓)闹钟管理类的使用
  9. Android学习篇之Menu的使用

随机推荐

  1. html常用标签之表格、表单的学习
  2. 【阿里云镜像】配置阿里云RepoForge 镜像
  3. 【阿里云镜像】使用阿里云oVirt镜像部署o
  4. 【阿里云镜像】安装编译Apache环境
  5. 【阿里云镜像】下载安装KaOS镜像
  6. 表单提交与内联框架及列表集(内置课程表及
  7. 用table做课程表、用表单做注册界面
  8. 盘点|2021年最受欢迎Linux桌面操作系统前
  9. Android中WebView的简单使用
  10. Android(安卓)读取已知包名的uses-permis