文档章节

Android wifi打开流程(Android O)

天王盖地虎626
 天王盖地虎626
发布于 01/11 10:24
字数 1205
阅读 867
收藏 2

 

根据自己的理解整理了Android O的wifi启动流程,为便于理解,绘制了Android O wifi架构图。有理解不到之处和错误之处,请各位指出,一起学习。
一. Android O wifi 架构:

由于Android O的Treble化,Android O上Wifi架构变动也比较大,尤其是JNI层、Hal层、HIDL层。

下图是Android O Treble HIDL大致结构:

下图是Android O wifi架构:

下图是Android Wlan架构(from android官网)

二. 函数调用流程:

1. 在wifisettings activity的onStart函数中,创建一个WifiEnabler对象,用于实现wifi开关功能。

packages/apps/Settings/src/com/android/settings/wifi/WifiSettings.java

    onStart()

        mWifiEnabler = createWifiEnabler();

 

2. WifiEnabler开关SwitchToggled中会调用WifiManager.setWifiEnabled方法。

packages/apps/Settings/src/com/android/settings/wifi/WifiEnabler.java

    onSwithToggled(boolean isCkecked)

        mWifiManager.setWifiEnabled(isChecked)

 

3. WifiManager调用WifiService的方法。

frameworks/base/wifi/java/android/net/wifi/WifiManager.java

    setWifiEnabled(boolean enabled)

        mService.setWifiEnabled(mContext.getOpPackageName(), enabled)

 

4. WiFiManager使用aidl方式和WifiService进行通信。

frameworks/base/wifi/java/android/net/wifi/IWifiManager.aidl

     boolean setWifiEnabled(String packageName, boolean enable);

 

5. WifiServiceImpl中实现WifiService的方法,像WifiController发消息: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);

 

6. WifiController状态机处理消息:CMD_WIFI_TOGGLED

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

WifiController状态机的状态变化,这里我们只说softap关闭状态下打开sta的情况;有时间的话,可以跟一下softap打开状态下打开sta的流程。这里只需关注“Turn ON STA” .

     *                 ------------------

     *                  ApStaDisabledState

     *                   ------------------

     *                     /      \

     *   -> Turn ON STA   /        \ Turn on SAP <-

     *                   /          \

     *                  /            \

     *         ---------------     --------------

     *         StaEnabledState     ApEnabledState

     *         ---------------     --------------

     *                 \               /

     *                  \             /

     *    -> Turn ON SAP \           /  Turn on STA <-

     *                    \         /

     *                   ---------------

     *                   QcApStaEnablingState

     *                   ---------------

     *                        |     |

     *                        |     |

     * -> CMD_AP_STARTED      |     |    CMD_STA_STARTED <-

     *(SAP turn on completed) |     |    (STA turn on completed)

     *                        |     |

     *                  ---------------------

     *                   QcApStaEnabledState

     *                  ----------------------

     *                         /  \

                              /    \

     * -> Turn on OFF STA    /      \     Turn OFF SAP

     *                      /        \

     *                 ------------------------

     *                  QcApStaDisablingState

     *                 ------------------------

     *                           /\

     *                          /  \

     * -> CMD_WIFI_DISABLED    /    \    CMD_AP_STOPPED <-

     *(STA turn OFF completed)/      \   (SAP turn OFF completed)

     *                       /        \

     *                      /          \

     *      -------------------      -------------

     *         ApEnabledState        StaEnabledState

     *      -------------------      ---------------

 

6.1 ApStaDisabledState 状态下,不对CMD_WIFI_TOGGLED消息处理

6.2 转向StaEnabledState状态,在该状态的enter()函数中启动supplicant, processMessage中会根据扫描、sta/ap共存等条件做相应的状态处理。

    class StaEnabledState extends State

        enter()

            mWifiStateMachine.setSupplicantRunning(true);

        public boolean processMessage(Message msg)

            case CMD_WIFI_TOGGLED:

 

7. frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiStateMachine.java

    public void setSupplicantRunning(boolean enable)

        sendMessage(CMD_START_SUPPLICANT);

 

8. frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiStateMachine.java

又是状态机,这里简单给出wifi状态机的各状态及结构。感觉有必要专门讲一下状态机。

    WifiStateMachine state:

        |- DefaultState

            |-- InitialState

            |-- SupplicantStartingState

            |-- SupplicantStartedState

                |--- ScanModeState

                |--- ConnectModeState

                    |---- L2ConnectedState

                        |----- ObtainingIpState

                        |----- ConnectedState

                        |----- RoamingState

                    |---- DisconnectingState

                    |---- DisconnectedState

                    |---- WpsRunningState

                    |---- FilsState

                |--- WaitForP2pDisableState

            |-- SupplicantStoppingState

            |-- SoftApstate

InitialState状态中处理消息:CMD_START_SUPPLICANT, 做加载驱动、启动supplicant操作,然后转向SupplicantStartingState状态。

    class InitialState extends State

        case CMD_START_SUPPLICANT:

            mClientInterface = mWifiNative.setupForClientMode();  // loadDriver

            mWifiNative.enableSupplicant()                    // start supplicant

            transitionTo(mSupplicantStartingState);

 

9. frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiNative.java

    public IClientInterface setupForClientMode()

        startHalIfNecessary(true))                            // start Hal

IClientInterface iClientInterface = mWificondControl.setupDriverForClientMode();

 

//启动Hal层。如果支持STA/AP共存,startConcurrentVendorHal;如果不支持共存:isStaMode=true启动sta模式,isStaMode=false启动ap模式。

    private boolean startHalIfNecessary(boolean isStaMode)

        if (mStaAndAPConcurrency)

// start ap & sta Concurrent Hal

            return mWifiVendorHal.startConcurrentVendorHal(isStaMode);

return mWifiVendorHal.startVendorHal(isStaMode); // start Hal. Here

 

10. 不同于android N,wifinative会调用JNI层com_android_server_wifi_WifiNative.cpp. Android O在framework增加了调用Hal层的相关接口及hal设备管理接口。

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

    public boolean startVendorHal(boolean isStaMode)

        mHalDeviceManager.start()  //start wifi vendor hal

        mIWifiStaIface = mHalDeviceManager.createStaIface(null, null); //loadDriver

 

11. 这个代码跟的有些凌乱

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

    public IWifiStaIface createStaIface(InterfaceDestroyedListener destroyedListener,

            Looper looper) {

        return (IWifiStaIface) createIface(IfaceType.STA, destroyedListener, looper);

    }

 

    private IWifiIface createIface(int ifaceType, InterfaceDestroyedListener destroyedListener, Looper looper)

         IWifiIface iface = createIfaceIfPossible(chipInfos, ifaceType, destroyedListener, looper);

    

    private IWifiIface createIfaceIfPossible(WifiChipInfo[] chipInfos, int ifaceType, InterfaceDestroyedListener destroyedListener, Looper looper)

         IWifiIface iface = executeChipReconfiguration(bestIfaceCreationProposal, ifaceType);

 

    private IWifiIface executeChipReconfiguration(IfaceCreationData ifaceCreationData, int ifaceType)

        WifiStatus status = ifaceCreationData.chipInfo.chip.configureChip(ifaceCreationData.chipModeId);

 

12. Android O不在使用之前版本的JNI com_android_server_wifi_WifiNative.cpp。而是用HIDL,其实现在/hardware/interfaces/.

hardware/interfaces/wifi/1.1/default/wifi_chip.cpp

    Return<void> WifiChip::configureChip(ChipModeId mode_id, configureChip_cb hidl_status_cb)

        return validateAndCall(this, WifiStatusCode::ERROR_WIFI_CHIP_INVALID, &WifiChip::configureChipInternal, hidl_status_cb, mode_id);

 

    WifiStatus WifiChip::configureChipInternal(ChipModeId mode_id)

         WifiStatus status = handleChipConfiguration(mode_id);

 

    WifiStatus WifiChip::handleChipConfiguration(ChipModeId mode_id)

        if (mode_id == kStaChipModeId) {

            success = mode_controller_.lock()->changeFirmwareMode(IfaceType::STA);

        } else {

            success = mode_controller_.lock()->changeFirmwareMode(IfaceType::AP);

        }

 

 

13. hardware/interfaces/wifi/1.0/default/wifi_mode_controller.cpp

    bool WifiModeController::changeFirmwareMode(IfaceType type)

        driver_tool_->LoadDriver()

        driver_tool_->ChangeFirmwareMode(convertIfaceTypeToFirmwareMode(type))

 

14. 最后调到hal层,android O的hal层也进行了重写。位置也从之前的版本中的hardware/libhardware_legacy/wifi/移到了frameworks/opt/net/wifi/libwifi_hal/

frameworks/opt/net/wifi/libwifi_hal/driver_tool.cpp

    bool DriverTool::LoadDriver()

        return ::wifi_load_driver() == 0;

 

15 frameworks/opt/net/wifi/libwifi_hal/wifi_hal_common.cpp

int wifi_load_driver()

if (is_wifi_driver_loaded())  return 0;

        insmod(DRIVER_MODULE_PATH, DRIVER_MODULE_ARG)

 

除了一些打开wifi时的消息通知、广播、状态变化,这里没有详细描述;至此,wifi打开的相关工作已经完成。

Qcom平台把加载wifi驱动的动作放在了开机时,在init.target.rc文件中:

insmod /vendor/lib/modules/qca_cld3_wlan.ko

根据实际情况,可能需要将开机加载驱动改为原来的动态加载。只需要做两处改动:

A. init脚本中删除加载wlan driver的行

B. 确认如下几个宏是打开和正确定义,在产品平台对应的makefile文件中加入即可:

    WIFI_DRIVER_MODULE_PATH := "/vendor/lib/modules/wlan.ko"

    WIFI_DRIVER_MODULE_NAME := "wlan"

    WIFI_DRIVER_MODULE_ARG := ""
 

本文转载自:https://blog.csdn.net/h784707460/article/details/79572861

天王盖地虎626

天王盖地虎626

粉丝 34
博文 554
码字总数 21592
作品 0
南京
私信 提问
Android 8.0 上面关于wifi 的一些坑

背景 现在安卓系统已经更新到8.0了。曾经打开手机wifi以及搜索wifi的方法可能对8.0的安卓系统不管用了。这里就提一些在开发中遇到的坑。 一. 打开wifi 以及 关闭wifi 首先需要开启修改系统设...

Andrewniu
03/20
0
0
Android WIDGETS 下的Power control修改的流程

WIDGETS packagesappsLaunchersrccomandroidlauncher2AppsCustomizeTabHost.java " private static final String WIDGETSTABTAG = ""WIDGETS""; " Power control packagesappsSettingsresval......

佳期如梦
2013/07/01
331
0
Android WiFi--系统架构

系统架构 Android WiFi系统引入了wpasupplicant,它的整个WiFi系统以wpasupplicant为核心来定义上层用户接口和下层驱动接口。整个WiFi系统架构如下图所示: 一切尽在上图中,下面将对每部分进...

sflfqx
2014/04/10
435
0
GMS认证-Android VTS测试

1、VTS简介 VTS的全称是 Vendor Test Suite(供应商测试套件)。 为何引入VTS测试? 目前Android的系统升级是很麻烦的,为了能更快的将设备升级到新的Android版本,Android O 开始新引入了 ...

天王盖地虎626
06/06
59
0
android中wifi原理及流程分析(很经典)

在网上找的一篇好文章,分析的很详细,自己再加了些东西,图片有点大,不能完全显示,点击图像拖动鼠标直接查看图像。 wifi相关的文件位置: WIFI Settings应用程序位于 packages/apps/Sett...

天王盖地虎626
01/09
85
0

没有更多内容

加载失败,请刷新页面

加载更多

学习记录(day05-标签操作、属性绑定、语句控制、数据绑定、事件绑定、案例用户登录)

[TOC] 1.1.1标签操作v-text&v-html v-text:会把data中绑定的数据值原样输出。 v-html:会把data中值输出,且会自动解析html代码 <!--可以将指定的内容显示到标签体中--><标签 v-text=""></......

庭前云落
30分钟前
3
0
支撑微博亿级社交平台,小白也能玩转Redis集群(实战篇)

上篇文章《支撑微博亿级社交平台,小白也能玩转Redis集群(原理篇)》介绍了Redis集群相关原理,这篇文章将介绍Redis Cluster集群的搭建、配置,运维、扩容等具体操作 集群搭建 2018年10月 Re...

分布式系统架构
31分钟前
5
0
JVM -- 垃圾回收算法及分代垃圾收集器

Hello,今天记录下 Java虚拟机中的其中一个重点知识 --> 垃圾回收算法及分代垃圾收集器。 一起学习,一起进步。继续沉淀,慢慢强大。希望这文章对您有帮助。若有写的不好的地方,欢迎评论给建...

猫狗熊
44分钟前
3
0
ERC-777以太坊新代币标准解读

ERC777是一个新的高级代币标准,可以视为ERC20的升级版本,因此它解决了ERC20以及ERC223存在的一些问题,开发者可以根据自己的具体需求进行选型。 1、使用ERC820进行合约注册 有别于ERC20的自...

汇智网教程
今天
8
0
代理模式之JDK动态代理 — “JDK Dynamic Proxy“

动态代理的原理是什么? 所谓的动态代理,他是一个代理机制,代理机制可以看作是对调用目标的一个包装,这样我们对目标代码的调用不是直接发生的,而是通过代理完成,通过代理可以有效的让调...

code-ortaerc
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部