技术标签: Android WIFI
这一篇简单分析点击WIFI开关后的代码执行流程,直接从WifiManager开始。
路径:framework/base/wifi/java/android/net/wifi/WifiManager.java
WifiManager.setWifiEnabled()设置WIFI开启。
路径:/frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiServiceImpl.java
WifiServiceImpl的setWifiEnabled方法中主要做了下面的事情:
enforceChangePermission 判断调用的进程是否有权限。想要开关wifi需要CHANGE_WIFI_STATE 权限。
isAirplaneModeOn 判断飞行模式。
handleWifiToggled 保存wifi 操作的状态。
最后向WifiController发送CMD_WIFI_TOGGLED消息。
路径:frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiController.java
WifiController是一个高级别的wifi状态机,它管理的状态是wifi开关,wifi热点开关等状态;它是在WIfiServiceImpl的构造函数中初始化、并开始运行。
它里面的方法调用逻辑如下:
这里是转换到了DeviceActiveState状态;
这里执行了mWifiStateMachinePrime.enterClientMode()。
路径:/frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiStateMachinePrime.java
WifiStateMachinePrime在changeMod()方法中向ModeStateMachine发送了ModeStateMachine.CMD_START_CLIENT_MODE。
最终进入了ModeStateMachine中,ModeStateMachine是一个比较简单的状态机。
这里是转向ClientModeActiveState状态。
在ClientModeActiveState的enter()方法中调用了mManager.start()方法。这里的mManager是ActiveModeManager,我们继续走下去,去看ClientModeManager。
路径:frameworks/opt/net/wifi/service/java/com/android/server/wifi/ClientModeManager.java
ClientModeStateMachine也是个状态机,它有两个状态。下面是代码执行片段。
这里发送了消息ClientModeStateMachine.CMD_START。
这里执行了一个重要的方法mWifiNative.setupInterfaceForClientMode();我们接着去看WifiNative。
路径:frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiNative.java
这里就可以看到一些关键性的操作:
启动WifiMonitor:WifiMonitor.startMonitoring();startMonitoring()是在WifiMonitor中建立与wpa_supplicant通信的socket通道、创建一个线程接收底层事件并分发处理。这里会创建两个socket通道与wpa_s通信,一个用于下发指令,另一个用于接收事件。成功后WifiMonitor会向WifiStateMachine发送一个代表socket通信建立成功的消息:SUP_CONNECTION_EVENT;收到这个消息就表示Wifi已经启动成功了。
启动Hal:startHal()
启动supplicant:startSupplicant()
加载驱动(loadDriver):setupInterfaceForClientMode()
Wifi启动源码到这里就结束了,后面就是底层逻辑了。
Golang安装Golang下载:https://golang.google.cn/dl/。操作系统 包名 Windows go1.4.windows-amd64.msi Linux go1.4.linux-amd64.tar.gz Mac go1.4.darwin-amd64-osx10.8.pkg FreeBSD go1.4.freebsd...
一、ImageDataGeneratordef image_preprocess(): # 训练集的图片生成器,通过参数的设置进行数据扩增 train_datagen = ImageDataGenerator( preprocessing_function=preprocess_input, rotation_range=30, ...
ERROR context.ContextLoader - Context initialization failed org.springframework.beans.factory.BeanCreationException: Error creating bean with nam...
clang -bundle -undefined dynamic_lookup build/temp.macosx-10.14-x86_64-3.7/_mysql.o -L/usr/local/Cellar/mysql/8.0.16/lib -lmysqlclient -lssl -lcrypto -o build/lib.macosx-10.14-x86...
故事主角用A ,B,C ,D代表本故事 是不是 虚构 巧不巧和 你心里没点b数吗?故事一开始 A,B,C 同时入职了,一家刚成立的创业公司。创业公司(人工智能公司) ,有三个老板,年龄和C相仿,年龄A>B>C(你们猜猜谁最狗),那么也不难猜出三个人来这个公司的原因,先说A是一个喜欢旅游的人,所以猜测一下工作也是如此,干的时间都不长,以前的人工智能公司工作了两个月,辞职了(辞职原因应该是年龄和能力问题),刚到这个公司由于三个老板年轻非常不懂技术,所以招聘了A想让A做技术总监,A来着里的目
QQ:809205580Email:[email protected]目 录1 内核配制和编译-- 41.1修改顶层Makefile- 41.2修改arch/arm/boot/Makefile 增加一行,方便操作--51.3匹配机器码-- 51.4修改系统时钟-- 51.5执行默认配制-- 51.6配制内核-- 51.7编译内核-- 6...
51Nod 1090 3个数和为0基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 收藏 关注给出一个长度为N的无序数组,数组中的元素为整数,有正有负包括0,并互不相等。从中找出所有和 = 0的3个数的组合。如果没有这样的组合,输出No Solution。如果有多个,按照3个数中最小的数从小到大排序,如果最小的数相等则
Fail的一些修改 1、直接设置问题estUnknownSourcesOffByDefaultfailjunit.framework.AssertionFailedError: Deviceshould not ship with 'Unknown Sources' enabled by default.expected: butwas:
小马哥93年毕业,95~98年在润迅工作,98年开始考虑创业,向公司上层提出QQ的想法,但是没人理睬,于是开始出来单干。公司刚开始做润迅配套的服务,后来是一个偶然的机会,让马化腾接触到internet即时通讯,
在做的过程中,发现了一个很简单却又很多人应该碰到的问题,设置Z-INDEX属性无效。在CSS中,只能通过代码改变层级,这个属性就是z-index,要让z-index起作用有个小小前提,就是元素的position属性要是relative,absolute或是fixed。
时间限制:1 秒内存限制:32 兆特殊判题:否提交:2396解决:1507题目描述:给定一个正整数a,以及另外的5个正整数,问题是:这5个整数中,小于a的整数的和是多少?输入:输入一行,只包括6个小于100的正整数,其中第一个正整数就是a。输出:可能有多组测试数据,对于每组数据,输出一行,给出一个正
文章目录使用Java读取.properties文件的内容并封装成JavaBean使用SpringBoot的@ConfigurationProperties进行配置绑定@[email protected](prefix = "mycar")使用Java读取.properties文件的内容并封装成JavaBean新建Maven项目:demo1。修改pom.xml,添加依赖。<?xml version="1.0" encoding="U