【Android S WiFi Framework】我的一份笔记

昨天出差来了重庆,组里有意让我给新人简单介绍下Android WiFi Framework。
然鹅,我对fwk的理解还停留在Android R上,所以写一份笔记简单记录下我对Android S WiFi Framework的一些理解,这篇文章不放入任何专栏,且长期更新。(主要看心情)
由于是笔记,所以写的比较随意,不会用心去画什么图来详细展示。

代码结构

packages/modules/Wifi/ 路径下

  • framework 上层可见,Binder服务的c端,比如WifiManager
  • service 上层不可见,Binder服务的s端,比如WifiService
WifiService的创建和初始化

在这里插入图片描述
开机时,SystemServer会去 load wifi service jar,创建WifiService,然后startService(WifiService)
如下代码,总共有五种service,不过这里我只关注 WifiService(其实WifiScanningService后面可以好好研究下)

private static final String WIFI_APEX_SERVICE_JAR_PATH =
        "/apex/com.android.wifi/javalib/service-wifi.jar";
private static final String WIFI_SERVICE_CLASS =
        "com.android.server.wifi.WifiService";
private static final String WIFI_SCANNING_SERVICE_CLASS =
        "com.android.server.wifi.scanner.WifiScanningService";
private static final String WIFI_SCANNING_SERVICE_CLASS =
        "com.android.server.wifi.scanner.WifiScanningService";
private static final String WIFI_RTT_SERVICE_CLASS =
        "com.android.server.wifi.rtt.RttService";
private static final String WIFI_AWARE_SERVICE_CLASS =
        "com.android.server.wifi.aware.WifiAwareService";
private static final String WIFI_P2P_SERVICE_CLASS =
        "com.android.server.wifi.p2p.WifiP2pService";

如图,mSystemServiceManager.startServiceFromJar()的时候,WifiService就被创建好了
WifiService的创建做两件事

  1. new WifiInjector,它持有wifi各种服务的线程,以及各种wifi服务相关的“组件”,相当于一个“百宝库”
  2. new WifiServiceImpl,从名字可以看出,它可“直接”实现wifi各种服务操作

WifiServiceImpl extends BaseWifiService 而 BaseWifiService extends IWifiManager.Stub
所以WifiServiceImpl和WifiManager分别是Binder概念里的c端和s端
读者可自行找文章了解Binder这种奇妙的IPC机制

SystemServer.startService(WifiService)时,WifiService就执行 publishBinderService(mImpl),即发布其绑定的接口

ActiveModeWarden

SystemServiceManager.startBootPhase() 会遍历起来的service,调用它们的onBootPhase()方法,对于WifiService来说,主要是 checkAndStartWifi()
在这里插入图片描述
checkAndStartWifi() 里 ActiveModeWarden.start() -> WifiController.start()
在这里插入图片描述
尝试理解这一段话
WifiService: Implements the IWifiManager 3rd party API. The API and the device state information (screen on/off, battery state, sleep policy) go as input into the WifiController which tracks high level states as to whether STA or AP mode is operational and controls wifi to handle bringup and shut down

ActiveModeWarden: Tracks the various states on STA and AP connectivity and handles bring up and shut down

WifiController: Acts as a controller to the ActiveModeWarden based on various inputs (API and device state). Runs on the same thread created in WifiService

WifiService(Impl)被用户调用,用来干活,而ActiveModeWarden只是“纯粹”的数据集合体(当然它有自己的逻辑)
WifiController是ActiveModeWarden内部的HSM,即层次状态机,只有一种父状态DefaultState,和两个子状态DisabledState,EnabledState

ActiveModeWarden维护一个DefaultClientModeManager以及两个set(为什么是set,当然是聪明的google猜到了未来多wlan,多ap接口的机器会出现啦)

// Holder for active mode managers
private final Set<ConcreteClientModeManager> mClientModeManagers = new ArraySet<>();
private final Set<SoftApManager> mSoftApManagers = new ArraySet<>();

Framework把wifi状态分为三类,ClientMode,ScanOnlyMode,以及SoftApMode
所以Google设计了 ConcreteClientModeManager,内置一个状态机ClientModeStateMachine,其层次如下

	         IdleState
	             |
	        StartedState
	        /          \
	       /            \
	      /              \
 ScanOnlyModeState     ConnectModeState

最下层的两种状态分别对应(wifi on)仅作扫描,无连接 和 已在一个具体的连接上

铺垫已经够了,回到 WifiController.start()
它start的时候,会根据SettingsStore里记录的wifi开关状态以及 scanAlways 开关状态来创建ClientRole并决定初始状态
有以下几种情形

  1. wifi toggle on->ROLE_CLIENT_PRIMARY->EnabledState
  2. wifi toggle off but scanAlways on -> ROLE_CLIENT_SCAN_ONLY->EnabledState
  3. wifi toggle off and scanAlways off-> null->DisabledState

这个过程里还会创建对对应mode的ClientModeManager,并添加进set里(方便后续的各种操作)
以第一种情况为例,会执行 startPrimaryClientModeManager

ConcreteClientModeManager manager = mWifiInjector.makeClientModeManager(new ClientListener(), requestorWs, ROLE_CLIENT_PRIMARY, mVerboseLoggingEnabled);
mClientModeManagers.add(manager);

//再看ConcreteClientModeManager 的构造函数
ConcreteClientModeManager (..,@NonNull ClientRole role,..){
	//传入的 role == ROLE_CLIENT_PRIMARY 会被用来生成 TargetRoleChangeInfo
	mTargetRoleChangeInfo = new RoleChangeInfo(role, requestorWs, listener);
	//最后给内部状态机 ClientModeStateMachine 发 CMD_START 消息,携带 mTargetRoleChangeInfo
	mStateMachine.sendMessage(ClientModeStateMachine.CMD_START, mTargetRoleChangeInfo);
}

//CMD_START消息在IdleState时被接受并处理,按mTargetRoleChangeInfo分流,transitionTo(对应state)

值得一提的在,在WifiController.start()里调用 super.start()(即让自己这个状态机跑起来之前),还调用了

// Initialize the lower layers before we start.
mWifiNative.initialize();

今天就先写到这里吧。日后再研究。
后续的整理计划

  1. 包含WifiConnectiviyManager等在内的一个大图
  2. WifiMonitor、WifiNative
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Framework核心知识笔记是一本介绍Android Framework核心知识的pdf文档。Android FrameworkAndroid系统的基础,它包含了一系列的类库和API,为开发Android应用程序提供了基本的功能和特性。 这本笔记首先介绍了Android Framework的概述,包括其组成部分和架构。然后详细讲解了Android四大组件(Activity、Service、Broadcast Receiver和Content Provider)的实现原理和使用方法。这些组件是Android应用程序的基本构建模块,理解它们的工作原理对于开发高质量的Android应用程序至关重要。 接着,笔记Android Framework中的UI设计进行了深入讲解。它介绍了View和ViewGroup的层次结构以及布局管理器的使用方法,帮助开发者实现灵活且具有吸引力的用户界面。此外,它还讨论了Android的绘图机制和动画效果,使开发者能够创建更加生动和吸引人的界面。 另外,笔记还包含了关于Android Framework中的数据存储和访问的内容。它介绍了SharedPreferences、SQLite数据库以及Content Provider等数据持久化的方法,帮助开发者存储和管理应用程序的数据。 此外,笔记还涵盖了与Android Framework相关的其他主题,如网络通信、多媒体处理、传感器和位置服务等。它们帮助开发者实现更多样化和功能强大的应用程序。 总结来说,Android Framework核心知识笔记是一本全面介绍Android Framework的教程,帮助开发者掌握Android应用程序开发的基本技能。对于想要成为Android开发专家的人来说,这是一本不可或缺的参考资料。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值