Android 12 WiFi开启流程

这篇具有很好参考价值的文章主要介绍了Android 12 WiFi开启流程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 /*                                           ActiveModeWarden
 *                                      /                        \
 *                                     /                          \
 *                        ConcreteClientModeManager         DefaultClientModeManager
 *                      (Client Mode + Scan Only Mode)            (Wifi off)
 *                             /            \
 *                           /               \
 *                     ClientModeImpl       ScanOnlyModeImpl
 */
一、startHal
packages/apps/Settings/src/com/android/settings/wifi/WifiEnabler.java
frameworks/base/wifi/java/android/net/wifi/WifiManager.java
packages/modules/Wifi/service/java/com/android/server/wifi/WifiServiceImpl.java
packages/modules/Wifi/service/java/com/android/server/wifi/ActiveModeWarden.java
packages/modules/Wifi/service/java/com/android/server/wifi/ConcreteClientModeManager.java
packages/modules/Wifi/service/java/com/android/server/wifi/WifiNative.java
packages/modules/Wifi/service/java/com/android/server/wifi/WifiVendorHal.java
packages/modules/Wifi/service/java/com/android/server/wifi/HalDeviceManager.java

WifiEnabler.java ->mWifiManager.setWifiEnabled(isChecked)
---->WifiManager.java =>setWifiEnabled(boolean enabled)
--------->WifiServiceImpl.java =>setWifiEnabled(String packageName, boolean enable): mActiveModeWarden.wifiToggled(new WorkSource(Binder.getCallingUid(), packageName));
-------------->ActiveModeWarden.java =>wifiToggled(WorkSource requestorWs): mWifiController.sendMessage(WifiController.CMD_WIFI_TOGGLED, requestorWs);//发送CMD_WIFI_TOGGLED消息到EnabledState中
                                      -->ActiveModeWarden$DisabledState
                                         ->processMessageFiltered(Message msg)
                                           -->case CMD_WIFI_TOGGLED
                                              handleStaToggleChangeInDisabledState((WorkSource) msg.obj);;//接收到CMD_WIFI_TOGGLED消息
                                      -->handleStaToggleChangeInDisabledState((WorkSource) msg.obj):
                                         startPrimaryOrScanOnlyClientModeManager(requestorWs);
                                         transitionTo(mEnabledState);//将状态切换到EnabledState
                                      -->startPrimaryOrScanOnlyClientModeManager(WorkSource requestorWs):
                                         ->if (role == ROLE_CLIENT_PRIMARY)
                                           return startPrimaryClientModeManager(requestorWs);
                                         ->else if
                                           return startScanOnlyClientModeManager(requestorWs);
                                         ->else
                                           return false;
                                      -->startPrimaryClientModeManager(WorkSource requestorWs):
                                         ConcreteClientModeManager manager = mWifiInjector.makeClientModeManager(new ClientListener(), requestorWs, ROLE_CLIENT_PRIMARY, mVerboseLoggingEnabled);//创建对象
                                         mClientModeManagers.add(manager);//加入到ConcreteClientModeManager列表集合中
------------------->ConcreteClientModeManager.java =>mStateMachine.sendMessage(ClientModeStateMachine.CMD_START, mTargetRoleChangeInfo);//在构造方法里发送CMD_START消息
                                                -->ConcreteClientModeManager$IdleState->processMessage(Message message)
                                                   --->case CMD_START//接收CMD_START消息
                                                       mClientInterfaceName = mWifiNative.setupInterfaceForClientInScanMode( mWifiNativeInterfaceCallback, roleChangeInfo.requestorWs);
----------------------->WifiNative.java =>setupInterfaceForClientInScanMode(@NonNull InterfaceCallback interfaceCallback, @NonNull WorkSource requestorWs):startHal()
                                          ->startHal():mWifiVendorHal.startVendorHal()//开启vendor Hal
--------------------------->WifiVendorHal.java =>startVendorHal():mHalDeviceManager.start()
------------------------------->HalDeviceManager.java =>start():startWifi()
                                                        -->startWifi():
                                                           -> WifiStatus status = mWifi.start();//启动实际加载WiFi动作的调用,涉及HIDL机制调用

hardware/interfaces/wifi/1.5/IWifi.hal//编译的时候会生成IWifi.java中间文件,通过Binder调用到wifi.cpp中
hardware/interfaces/wifi/1.5/default/wifi.cpp
hardware/interfaces/wifi/1.5/default/wifi_mode_controller.cpp
frameworks/opt/net/wifi/libwifi_hal/driver_tool.cpp
frameworks/opt/net/wifi/libwifi_hal/wifi_hal_common.cpp

wifi.cpp =>Return<void> Wifi::start(start_cb hidl_status_cb) => return validateAndCall(this, WifiStatusCode::ERROR_UNKNOWN,&Wifi::startInternal, hidl_status_cb);
           ==> WifiStatus Wifi::startInternal() => WifiStatus wifi_status = initializeModeControllerAndLegacyHal();
              ==> WifiStatus Wifi::initializeModeControllerAndLegacyHal() => legacy_hal::wifi_error legacy_status = hal->initialize()
---->wifi_mode_controller.cpp =>bool WifiModeController::initialize() => driver_tool_->LoadDriver()
-------->driver_tool.cpp => bool DriverTool::LoadDriver()//加载wifi驱动
------------->wifi_hal_common.cpp => int wifi_load_driver() =>insmod(DRIVER_MODULE_PATH, DRIVER_MODULE_ARG)//处理完成CMD_START消息,状态机将执行IdleState.exit()->StartedState.enter()->StartedState.exit()->ScanOnlyModeState.enter()

二、启动supplicant文章来源地址https://www.toymoban.com/news/detail-434347.html

-------------->ActiveModeWarden.java =>ActiveModeWarden$EnabledState
                                       -->processMessageFiltered(Message msg)
                                          ->case CMD_WIFI_TOGGLED
                                            handleStaToggleChangeInEnabledState((WorkSource) msg.obj);
                                       -->handleStaToggleChangeInEnabledState(WorkSource requestorWs):
                                          ->if (shouldEnableSta())
                                            -->if (hasAnyClientModeManager())
                                               switchAllPrimaryOrScanOnlyClientModeManagers();
                                            -->else
                                               startPrimaryOrScanOnlyClientModeManager(requestorWs);
                                          ->else
                                            stopAllClientModeManagers();
                                       -->switchAllPrimaryOrScanOnlyClientModeManagers():switchPrimaryOrScanOnlyClientModeManagerRole(clientModeManager)
                                       -->switchPrimaryOrScanOnlyClientModeManagerRole(@NonNull ConcreteClientModeManager modeManager):
                                          ->modeManager.setRole(role, lastRequestorWs);
------------------>ConcreteClientModeManager.java =>setRole(@NonNull ClientRole role, @NonNull WorkSource requestorWs):setRole(role, requestorWs, null);
                                                    ->setRole(@NonNull ClientRole role, @NonNull WorkSource requestorWs,@Nullable Listener<ConcreteClientModeManager> modeListener):
                                                      -->if (role == ROLE_CLIENT_SCAN_ONLY)
                                                         mStateMachine.sendMessage(ClientModeStateMachine.CMD_SWITCH_TO_SCAN_ONLY_MODE);
                                                      -->else
                                                         mStateMachine.sendMessage(ClientModeStateMachine.CMD_SWITCH_TO_CONNECT_MODE,mTargetRoleChangeInfo);
                                       -->ConcreteClientModeManager$StartedState->processMessage(Message message):
                                          ->case CMD_SWITCH_TO_CONNECT_MODE
                                            mWifiNative.switchClientInterfaceToConnectivityMode(mClientInterfaceName, roleChangeInfo.requestorWs);
                                            transitionTo(mConnectModeState);//将状态切换到connectmodestate
---------------------->WifiNative.java =>switchClientInterfaceToConnectivityMode(@NonNull String ifaceName,@NonNull WorkSource requestorWs):startSupplicant()
                                         -->startSupplicant():startAndWaitForSupplicantConnection()
                                         -->startAndWaitForSupplicantConnection():
                                            mSupplicantStaIfaceHal.initialize();
                                            mSupplicantStaIfaceHal.startDaemon();
-------------------------->SupplicantStaIfaceHal.java => startDaemon():
                                                         -->if (isV1_1())
                                                            Log.i(TAG, "Starting supplicant using HIDL");
                                                            return startDaemon_V1_1();
                                                         -->else
                                                            Log.i(TAG, "Starting supplicant using init");
                                                            return mFrameworkFacade.startSupplicant();
                                                         -->startDaemon_V1_1():getSupplicantMockableV1_1();
                                                         -->getSupplicantMockableV1_1()//通过HIDL来打开supplicant
//注册wpa_supplicant:main.c ==> wpa_supplicant.c->wpa_supplicant_init() ==> notify.c->wpas_notify_supplicant_initialized() ==> hidl.cpp->wpas_hidl_init() ==> Hidl_manager.cpp->registerHidlService()

到了这里,关于Android 12 WiFi开启流程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • android源码学习- APP启动流程(android12源码)

    百度一搜能找到很多讲APP启动流程的,但是往往要么就是太老旧(还是基于android6去分析的),要么就是不全(往往只讲了整个流程的一小部分)。所以我结合网上现有的文章,以及源码的阅读和调试,耗费了3整天的时间,力求写出一篇最完整,最详细,最通俗易懂的文章,

    2024年02月11日
    浏览(46)
  • Android 12.0默认开启无障碍服务权限和打开默认apk无障碍服务

    在12.0的系统rom定制化开发中,在第三方app开发中,需要开启无障碍服务功能,就不需要在代码中开启无障碍服务了, 为了简便就需要在系统中开启无障碍服务,来实现开启无障碍服务功能

    2024年02月07日
    浏览(55)
  • 【Android12】Monkey压力测试源码执行流程分析

    Monkey是Android提供的用于应用程序自动化测试、压力测试的测试工具。 其源码路径(Android12)位于 部署形式为Java Binary 通过Monkey,可以模拟用户的Touch(单指、多指、手势)、按键(key)事件等,检测应用程序发生的ANR、Crash事件,并收集相关Debug信息等。 例如测试应用com.packa

    2024年03月22日
    浏览(43)
  • Android 12 S HIDL Service创建流程

    系列文章 Android 12 S ServiceManager原理 Android 12 S Native Service的创建流程 Android 12 S Binder原理之BpBinder,BnBinder以及IInterface介绍 Android 12 S HIDL Service创建流程 Android 12 S 自定义Hal服务selinux权限添加 Android 12 S 自定义Native服务selinux权限添加 Android 12 S java服务调用native服务 Android 12 S 自定

    2024年02月02日
    浏览(36)
  • HIDL Service创建流程 - 基于Android 12 S分析

    系列文章 Android 12 S ServiceManager原理 Android 12 S Native Service的创建流程 Android 12 S Binder原理之BpBinder,BnBinder以及IInterface介绍 Android 12 S HIDL Service创建流程 Android 12 S 自定义Hal服务selinux权限添加 Android 12 S 自定义Native服务selinux权限添加 Android 12 S java服务调用native服务 Android 12 S 自定

    2024年02月11日
    浏览(40)
  • 【Android12】Android Framework系列---Adb和PMS安装apk源码流程

    通过adb install命令可以将apk安装到Android系统(注意:特定类型的apk,比如persist类型是无法通过adb安装的) 下述命令中adb解析install命令,并调用Android PackageManagerService进行apk安装。 基于Android12,分析从adb install到 PakcageManagerService安装apk的流程。 adb install命令的源码实现 Andro

    2024年01月22日
    浏览(62)
  • 荣耀平板5鸿蒙降级安卓并刷入原生Android12系统——麒麟659,4+64G,10英寸wifi版本

      在学习Linux时,一边看手册和教程,一边写代码,一边还要远程控制另一台设备进行烧写和操作串口,一个屏幕有些不够用,再买一个又囊中羞涩,扒了扒杂货堆找到一个很老的荣耀平板5,10英寸用来看个手册刚刚好。   使用spacedesk把平板拓展成了个显示器,但是经常

    2024年02月04日
    浏览(115)
  • Android 12系统源码_窗口管理(一)WindowManagerService的启动流程

    WindowManagerService是Android系统中重要的服务,它是WindowManager的管理者,WindowManagerService无论对于应用开发还是Framework开发都是重要的知识点,究其原因是因为WindowManagerService有很多职责,每个职责都会涉及重要且复杂的系统,这使得WindowManagerService就像一个十字路口的交通灯一样

    2024年02月11日
    浏览(46)
  • 蓝牙开发之-Android12及以下权限申请 及蓝牙详细流程图

    一、蓝牙开发之-权限申请, 直接上代码 第一步、在 AndroidManifest.xml 中 声明下需要的权限 第三步、权限拿到了,就扫描、连接、进行通信 吧 附上流程图

    2024年04月13日
    浏览(54)
  • 深入Android S (12.0) 探索Framework之输入子系统InputReader的流程

    第一篇 深入Android S (12.0) 探索Framework之输入系统IMS的构成与启动 第二篇 深入Android S (12.0) 探索Framework之输入子系统InputReader的流程 上一篇文章深入探索了 Android Framework 的输入系统 IMS 的构成与启动,对 IMS 的重要成员有了初步的理解,然后通过源码对 IMS 的整个启动流程进行

    2024年01月20日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包