Android wifi disable分析

news2024/11/27 0:29:15

总体流程

  • 老套路基本不变: WifiSettings 通过 WifiManager 下cmd 给 WifiService
  • WifiService 收到cmd后,先完成一部分列行检查(如UID的权限、是否airPlayMode等等),之后将cmd下发给到WifiController
  • WifiController 收到cmd 之后,在内部状态机轮询一圈(就是将cmd送给对应的状态机进行处理,处理完后,送往下一个状态机进行加工),俨然很标准化的流水线工序,完成后再送到WifiStateMachinePrime处理
  • WifiStateMachinePrime 是P 版本新增的Prime状态机,分担了原来WifiStateMachine工作,同样按照标准化流水线工序加工,完成后送到WifiNative,
  • WifiNative是包工头,负责将活儿下发到工人(wpa_supplicant)身上,工人没完成一件任务,上报分销商(wifiMonitor),各大分销商又将结果按照约定的渠道上报包工头(wifiNative)、总经销商(wifiService、wifiScanningService)等等,完成此项工作的闭环。

代码流程

1. WifiEnabler --> WifiManager

  • 老规矩: WifiSettings --> WifiEnabler 调用wifiManager 来disable Wifi
packages/apps/Settings/src/com/android/settings/wifi/WifiEnabler.java
public boolean onSwitchToggled(boolean isChecked) {
  ..  
   mWifiManager.setWifiEnabled(isChecked);
}

2. WifiManager–> WifiService --> WifiServiceImpl

  • setWifiEnabled 函数里 前面有一大堆列行检查
  • 最后是关键,发送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);
}

3. WifiServiceImpl --> WifiController

  • 流水线上的标准加工: StaEnabledState --> StaDisabledState
  • 转入到wifiStateMachinePrime 处理wifi disable 事项
frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiController.java
class StaEnabledState extends State {
  switch (msg.what) {
          case CMD_WIFI_TOGGLED:
             if (! mSettingsStore.isWifiToggleEnabled()) {
                 if (checkScanOnlyModeAvailable()) {
                     transitionTo(mStaDisabledWithScanState);
                 } else {
                     transitionTo(mStaDisabledState); // 转入StaDisableState 处理 wifi disable 事项
                 }
             }

class StaDisabledState extends State {
	public void enter() {
	   mWifiStateMachinePrime.disableWifi(); // 转入wifiStateMachinePrime 处理wifi disable 
	   // Supplicant can't restart right away, so note the time we switched off
	   mDisabledTimestamp = SystemClock.elapsedRealtime();
	   mDeferredEnableSerialNumber++;
	   mHaveDeferredEnable = false;
	   mWifiStateMachine.clearANQPCache();
  }
}

4. WifiStateMachinePrime --> WifiScaningServiceImpl

  • WifiStateMachinePrime 发送CMD_DISABLE_WIFI给到内部状态机处理
  • WifiDisabledState 接领任务,先广播停掉Scan(WifiManager.EXTRA_SCAN_AVALIABLE),然后 clearScanResults
frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiStateMachinePrime.java
 public void disableWifi() {
 	changeMode(ModeStateMachine.CMD_DISABLE_WIFI);
 }
class WifiDisabledState extends ModeActiveState {
	 public void enter() {
	 mDefaultModeManager.sendScanAvailableBroadcast(mContext, false);
	 mScanRequestProxy.enableScanningForHiddenNetworks(false);
	 mScanRequestProxy.clearScanResults();
	 }
}

5. WifiScaningServiceImpl 善后

  • 接收到wifi disable 需求后,立即开始清掉ScanResults
frameworks/opt/net/wifi/service/java/com/android/server/wifi/scanner/WifiScanningServiceImpl.java{
public void onReceive(Context context, Intent intent){
	else if (state == WifiManager.WIFI_STATE_DISABLED) {
		  mBackgroundScanStateMachine.sendMessage(CMD_DRIVER_UNLOADED);
		  mSingleScanStateMachine.sendMessage(CMD_DRIVER_UNLOADED);
		  mPnoScanStateMachine.sendMessage(CMD_DRIVER_UNLOADED);
	}	
}

 class DefaultState extends State {
 	public void enter() {
	mActiveScans.clear();
	mPendingScans.clear();}
 }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1287137.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ORACLE数据库实验总集 实验三 Oracle数据库物理存储结构管理

一、实验目的 (1)掌握 Oracle数据库数据文件的管理 (2)掌握 Oracle数据库控制文件的管理 (3)掌握 Oracle数据库重做日志文件的管理 (4)掌握 Oracle数据库归档管理, 二、…

周周爱学习之Redis重点总结

redis重点总结 在正常的业务流程中,用户发送请求,然后到缓存中查询数据。如果缓存中不存在数据的话,就会去数据库查询数据。数据库中有的话,就会更新缓存然后返回数据,数据库中也没有的话就会给用户返回一个空。 1.缓…

springboot整合阿里云oss上传图片,解决无法预览的问题

1.前置工作 需要申请一个域名,需要备案,对接这个踩了不少坑,写的很详细,guan fang tong guo bu 了,各位参考别的博客结合看吧,主要是域名配置,还有看service里面的实现 2.进入控制台 bucket列表 选择bucket 选择域名管理 复制你申请的域名,比如域名:abkhkajs…

苹果iOS免签应用打包,书签类顶部域名如何隐藏?

在iOS开发中,由于App Store的严格审核流程和各种政策限制,免签打包成为一些企业和开发人员选择的方案,以便更灵活地分发iOS应用。在这个过程中,许多开发者希望隐藏或最小化安装过程中顶部域名的显示,以提供更加原生的用…

家用洗地机哪个品牌最好最实用?热门洗地机测评

随着社会的不断进步,我们逐渐意识到日常生活中的许多任务需要消耗大量的时间和体力。一个典型的例子是卫生清洁工作,尤其是在大面积地区,如大型建筑物、商场或工厂。这些任务不仅繁琐,还可能影响生活质量和工作效率。为了应对这一…

Hadoop学习笔记(HDP)-Part.06 安装OracleJDK

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

给腰不好的朋友设计和制作一个捡羽毛球的辅助装置

我们知道羽毛球运动不挑场地(有防风塑料球和业余使用的网子可以购买),不需要专业器材和场地,不需要跑多远就可以开展,非常方便普通人锻炼。 而且针对现在的不良生活方式:久坐,看电脑手机&#…

unity 2d入门飞翔小鸟按钮点击功能且场景切换(二)

1、素材包获取 链接: https://pan.baidu.com/s/1KgCtQ_7wt2mlbGbIaMVvmw 提取码: xxh8 2、将素材全部拉进去 3、创建新的场景 并且将场景添加到build settings里面 4、脚本 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityE…

JOSEF 单相电压继电器 WY-31A1 DC220V 过压动作,导轨安装

系列型号 单相 JY-45A1电压继电器;JY-45B1电压继电器; JY-45C1电压继电器;JY-45D1电压继电器; JY-41A1电压继电器;JY-41B1电压继电器; JY-41C1电压继电器;JY-41D1电压继电器; …

计算机毕业设计 基于SpringBoot的大学生双创竞赛项目申报与路演管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

深入探讨Guava的缓存机制

第1章:引言 大家好,我是小黑,今天咱们聊聊Google Guava的缓存机制。缓存在现代编程中的作用非常大,它能提高应用性能,减少数据库压力,简直就是性能优化的利器。而Guava提供的缓存功能,不仅强大…

【开源】基于JAVA的城市桥梁道路管理系统

项目编号: S 025 ,文末获取源码。 \color{red}{项目编号:S025,文末获取源码。} 项目编号:S025,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询城市桥…

数据结构(超详细讲解!!)第二十六节 图(中)

1.存储结构 1.邻接矩阵 图的邻接矩阵表示法(Adjacency Matrix)也称作数组表示法。它采用两个数组来表示图: 一个是用于存储顶点信息的一维数组;另一个是用于存储图中顶点之间关联关系的二维数组,这个关联关系数组被…

基于ROPNet项目训练modelnet40数据集进行3d点云的配置

项目地址: https://github.com/zhulf0804/ROPNet 在 MVP Registration Challenge (ICCV Workshop 2021)(ICCV Workshop 2021)中获得了第二名。项目可以在win10环境下运行。 论文地址: https://arxiv.org/abs/2107.02583 网络简介…

vue2项目中添加字体文件

vue2项目中添加字体文件 1、下载相关文件&#xff0c;放置文件夹中&#xff0c;这里我是在assets文件中新建了fontFamily 2、在assets文件中新建css文件 3、在页面中使用 <style lang"less" scoped> import ../../assets/css/fonts.less;.total-wrap {displa…

深度学习火车票识别系统 计算机竞赛

文章目录 0 前言1 课题意义课题难点&#xff1a; 2 实现方法2.1 图像预处理2.2 字符分割2.3 字符识别部分实现代码 3 实现效果4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 图像识别 火车票识别系统 该项目较为新颖&#xff0c;适…

详细介绍如何使用 SSD 进行实时物体检测:单次 MultiBox 探测器-含源码

介绍 在实时对象检测中,主流范例传统上采用多步骤方法,包括边界框、像素或特征重采样以及高质量分类器应用的提议。虽然这种方法已经实现了高精度,但其计算需求往往阻碍了其对实时应用的适用性。然而,单次多框检测器 (SSD) 代表了基于深度学习的对象检测的突破性飞跃。SSD…

rust中动态数组Vec的简单使用

在Rust中&#xff0c;Vector&#xff08;简称Vec&#xff09;是一个动态数组数据结构&#xff0c;它可以动态地增加或减少其容量。Vec是Rust标准库中的一个常见类型&#xff0c;非常适合用于存储和操作一系列相同类型的值。 Vec其实是一个智能指针&#xff0c;用于在堆上分配内…

自定义软件app定制开发的需求和趋势|企业网站小程序搭建

自定义软件app定制开发的需求和趋势|企业网站小程序搭建 随着智能手机的普及和移动互联网的快速发展&#xff0c;移动应用程序&#xff08;App&#xff09;成为人们日常生活和工作中必不可少的一部分。然而&#xff0c;市面上已有的应用程序并不能完全满足用户的个性化需求&…

编写测试用例的17个技巧

1、前言 测试用例是任何测试周期的第一步&#xff0c;对任何项目都非常重要。如果在此步骤中出现任何问题&#xff0c;则在整个软件测试过程中都会扩大影响。如果测试人员在创建测试用例模板时使用正确的过程和准则&#xff0c;则可以避免这种情况。 在本文中将分享一些简单而…