前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android 10.0热点为Enhanced Open模式时不允许WiFI和热点同时开启代码流程梳理

Android 10.0热点为Enhanced Open模式时不允许WiFI和热点同时开启代码流程梳理

作者头像
用户7557625
发布2020-07-15 10:54:47
2.8K0
发布2020-07-15 10:54:47
举报

前言:

WLAN Enhanced Open :WiFi增强开放,这个功能就是当手机开启热点时,Securty的一个选项,与WPA2/WPA3同级,Enhanced Open就是不设置密码,但是增强了安全性。

我们知道Android 9 引入了可让设备同时在 STA 和 AP 模式下运行的功能,也就是可以同时连接WiFi和开启热点。但是在Android 10中,如果手机热点的安全选项为Enhanced Open,则不支持WiFi和热点同时开启。如果热点的安全选项为WPA2或者WPA3,则可以同时开启热点和WiFi。

代码流程:

下面我们来看这个功能在代码中是怎么设置的: 1、开启热点我们直接看WifiServiceImpl的startSoftApInternal,至于打开热点流程以及怎么走到这个函数的,可以看我之前的总结 热点开启流程。 startSoftApInternal会调用setDualSapMode函数,这个函数是干什么的呢,我们后面会讲,这个很关键。 如果validateApWifiConfiguration函数返回true,则发送CMD_SET_AP的消息,由WifiController处理。 android/frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiServiceImpl.java

代码语言:javascript
复制
private boolean startSoftApInternal(WifiConfiguration wifiConfig, int mode) {
        setDualSapMode(wifiConfig);
   .............
        // null wifiConfig is a meaningful input for CMD_SET_AP
        if (wifiConfig == null || WifiApConfigStore.validateApWifiConfiguration(wifiConfig)) {
            SoftApModeConfiguration softApConfig = new SoftApModeConfiguration(mode, wifiConfig);
            mWifiController.sendMessage(CMD_SET_AP, 1, 0, softApConfig);
            return true;
        }
        Slog.e(TAG, "Invalid WifiConfiguration");
        return false;
}

2、WifiController一开始是在DefaultState ,我们看CMD_SET_AP的处理过程: 看这个判断语句 if (msg.arg1 == 1 && mWifiApConfigStore.getDualSapStatus()) ,这个如果返回true,则 mActiveModeWarden.disableWifi ,也就是关闭 WiFi 。 msg.arg1 的值就是 CMD_SET_AP 的第一个参数,我们可以从上面 mWifiController.sendMessage(CMD_SET_AP, 1, 0, softApConfig) 看到是 1 。然后再看 mWifiApConfigStore.getDualSapStatus ,这个函数为什么返回的是 true 呢?

android/frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiController.java

代码语言:javascript
复制
class DefaultState extends State {
     @Override
     public boolean processMessage(Message msg) {
         switch (msg.what) {
         
             case CMD_SET_AP:
                 if (msg.arg1 == 1 && mWifiApConfigStore.getDualSapStatus()) {
                     mActiveModeWarden.disableWifi();
                     transitionTo(mStaDisabledState);
                 }

                 if (msg.arg1 == 1) {
                     SoftApModeConfiguration config = (SoftApModeConfiguration) msg.obj;
                     mActiveModeWarden.enterSoftAPMode((SoftApModeConfiguration) msg.obj);
                 } else {
                     mActiveModeWarden.stopSoftAPMode(msg.arg2);
                 }
                 break;

3、getDualSapStatus 函数就是获取 mDualSapStatus 的值。mDualSapStatus 的值是谁设的呢?这里就明白我们一开始说的 WifiServiceImpl 的 startSoftApInternal 函数中一开始执行的 setDualSapMode 的。setDualSapMode 把 mDualSapStatus 设为了 true。 android/frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiApConfigStore.java

代码语言:javascript
复制
public synchronized boolean getDualSapStatus() {
    return mDualSapStatus;
}

4、我们看 setDualSapMode 函数,apConfig.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.OWE) 这个函数就是判断AP是否是OWE模式,OWE也就是我们所说的 Enhanced Open 。所以当AP为Enhanced Open时,会把 mDualSapStatus 设为 true 。 android/frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiServiceImpl.java

代码语言:javascript
复制
private void setDualSapMode(WifiConfiguration apConfig) {
       if (apConfig == null)
           apConfig = mWifiApConfigStore.getApConfiguration();

       if (apConfig.apBand == WifiConfiguration.AP_BAND_DUAL
               || apConfig.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.OWE)) {
           mLog.trace("setDualSapMode uid=%").c(Binder.getCallingUid()).flush();
           mWifiApConfigStore.setDualSapStatus(true);
       } else {
           mWifiApConfigStore.setDualSapStatus(false);
       }
}

分析到这里,也就很清楚为什么 AP 设为 Enhanced Open 模式的时候不支持 WiFi 和 热点共存了。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-01-06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言:
  • 代码流程:
相关产品与服务
命令行工具
腾讯云命令行工具 TCCLI 是管理腾讯云资源的统一工具。使用腾讯云命令行工具,您可以快速调用腾讯云 API 来管理您的腾讯云资源。此外,您还可以基于腾讯云的命令行工具来做自动化和脚本处理,以更多样的方式进行组合和重用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档