android 网络错误分析,android wifi打开过程源码解析及Wifi打开失败原因分析
在android中wifi打开的状态从DISABLED--ENABLING--ENABLED 1 WifiSettings.java--wifi界面wifi开关 wifi开关定义在SettingsActivity.java中,传入WifiEnabler.ja
在android中wifi打开的状态从DISABLED-->ENABLING-->ENABLED
1 WifiSettings.java--wifi界面wifi开关
wifi开关定义在SettingsActivity.java中,传入WifiEnabler.java,并在WifiEnabler.java中响应。
private SwitchBar mSwitchBar;
public SwitchBar getSwitchBar() {
return mSwitchBar;
}
mSwitchBar = (SwitchBar) findViewById(R.id.switch_bar);
private SwitchBar mSwitchBar;
public SwitchBar getSwitchBar() {
return mSwitchBar;
}
mSwitchBar = (SwitchBar) findViewById(R.id.switch_bar);
2 WifiEnabler.java--响应点击wifi开关
WifiEnabler.java实际处理开关wifi的消息。
@Override
public void onSwitchChanged(Switch switchView, boolean isChecked) {
Log.d(TAG, "mWifiManager.setWifiEnabled");
if (!mWifiManager.setWifiEnabled(isChecked)) {
// Error
Log.d(TAG, "set wifi enabled error");
mSwitchBar.setEnabled(true);
Toast.makeText(mContext, R.string.wifi_error, Toast.LENGTH_SHORT).show();
}
}3 WifiManager.java和WifiService.java
WifiEnabler.java调用WifiManager,WifiManager调用WifiService.
mService.setWifiEnabled(enabled); public synchronized boolean setWifiEnabled(boolean enable) {
Slog.d(TAG, "setWifiEnabled: " + enable + " pid=" + Binder.getCallingPid()
+ ", uid=" + Binder.getCallingUid());
if (DBG) {
Slog.e(TAG, "Invoking mWifiStateMachine.setWifiEnabled\n");
}
if (!mIsControllerStarted) {
Slog.e(TAG,"WifiController is not yet started, abort setWifiEnabled");
return false;
}
mWifiController.sendMessage(CMD_WIFI_TOGGLED);
return true;
}
4 WifiController.java
WifiController.java处理开关wifi 的消息CMD_WIFI_TOGGLED,从ApStaDisabledState-->StaEnabledState-->DeviceActiveState,
class ApStaDisabledState extends State {
@Override
public boolean processMessage(Message msg) {
switch (msg.what) {
case CMD_WIFI_TOGGLED:
case CMD_AIRPLANE_TOGGLED:
if (mSettingsStore.isWifiToggleEnabled()) {
if (doDeferEnable(msg)) {
if (mHaveDeferredEnable) {
// have 2 toggles now, inc serial number an ignore both
mDeferredEnableSerialNumber++;
}
mHaveDeferredEnable = !mHaveDeferredEnable;
break;
}
if (mDeviceIdle == false) {
transitionTo(mDeviceActiveState);
} else {
checkLocksAndTransitionWhenDeviceIdle();
}
} else if (mSettingsStore.isScanAlwaysAvailable()) {
transitionTo(mStaDisabledWithScanState);
}
break;
}
class StaEnabledState extends State {
@Override
public void enter() {
mWifiStateMachine.setSupplicantRunning(true);
}
}
在进入StaEnabledState时由WifiStateMachine启动supplicant,,进入DeviceActiveState时启动driver。
/* Parent: StaEnabledState */@OverridemWifiStateMachinemWifiStateMachinemWifiStateMachine}}
5 WifiStateMachine.java
WIFI_STATE_ENABLED由SupplicantStartingState发出, CMD_START_SUPPLICANT-->startMonitoring-->WifiMonitor.SUP_CONNECTION_EVENT-->WifiManager.WIFI_STATE_ENABLED,到此wifi开关完全打开。
class InitialState extends State {
@Override
public boolean processMessage(Message message) {
switch (message.what) {
case CMD_START_SUPPLICANT:
if (mWifiNative.loadDriver()) {
mNwService.wifiFirmwareReload(mInterfaceName, "STA");
if(mWifiNative.startSupplicant(mP2pSupported)) {
setWifiState(WIFI_STATE_ENABLING);
mWifiMonitor.startMonitoring();
transitionTo(mSupplicantStartingState);
}
}
break;
}
}
@OverridesetWifiStatebreak;
}
}
6 SoftAP打开失败wifi不能打开原因分析
SoftAP打开过程:
WifiService的setWifiApEnabled-->WifiController的CDM_SET_AP-->WifiStateMachine的CMD_START_AP
class SoftApStartingState extends State {
@Override
public void enter() {
if (message.what == CMD_START_AP) {
final WifiConfiguration config = (WifiConfiguration) message.obj;
if (config == null) {
mWifiApConfigChannel.sendMessage(CMD_REQUEST_AP_CONFIG);
}
}
}
@Override
public boolean processMessage(Message message) {
switch(message.what) {
case CMD_START_AP:
deferMessage(message);
break;
case WifiStateMachine.CMD_RESPONSE_AP_CONFIG:
WifiConfiguration config = (WifiConfiguration) message.obj;
if (config != null) {
startSoftApWithConfig(config);
}
break;
case CMD_START_AP_FAILURE:
setWifiApState(WIFI_AP_STATE_FAILED);
transitionTo(mInitialState);
break;
}
}
}
CMD_REQUEST_AP_CONFIG-->CMD_RESPONSE_AP_CONFIG-->startSoftApWithConfig-->CMD_START_FAILURE
由于WifiService没有收到WIFI_AP_START_FAILED,导致WifiController处于ApEnabledState,无法接收CMD_WIFI_TOGGLED消息,从而无法进入WifiStateMachie打开WIfi。
android 网络错误分析,android wifi打开过程源码解析及Wifi打开失败原因分析相关推荐
- android 网络通信方式,Android中基于TCP协议的网络通信
一.Android网络简介 Android与服务器的通信方式主要有两种,一种是Http通信,另一种是Socket通信. HTTP通信:Android中内置HttpClient,这样可以发方便的发送Ht ...
- Android Launcher启动应用程序流程源码解析
带着问题看源码 点击桌面Launcher图标后做了哪些工作? 应用程序什么时候被创建的? Application和MainActivity的onCreate()方法什么时候被调用的? 概述 在Andr ...
- 【Android 逆向】启动 DEX 字节码中的 Activity 组件 ( 使用 DexClassLoader 获取组件类失败 | 失败原因分析 | 自定义类加载器没有加载组件类的权限 )
文章目录 一.使用 DexClassLoader 获取组件类失败报错 二.失败原因分析 一.使用 DexClassLoader 获取组件类失败报错 在上一篇博客 [Android 逆向]启动 DEX ...
- Android View体系(五)从源码解析View的事件分发机制
Android View体系(一)视图坐标系 Android View体系(二)实现View滑动的六种方法 Android View体系(三)属性动画 Android View体系(四)从源码解析Sc ...
- Android多页蒙版遮罩引导功能(源码+解析)
#Android多页蒙版遮罩引导功能(源码+解析) 需求:博主前段时间做的教育类型APP,需要引导用户(低龄化小朋友),播放器的播放,页面可以左右滑动,以及右上方进入答题卡入口(小朋友都是很聪明的,引 ...
- php7应用程序无法启动,window_win7系统打开软件提示应用程序无法启动的故障原因分析及2种解决方法, nbs - phpStudy...
win7系统打开软件提示应用程序无法启动的故障原因分析及2种解决方法 win7系统打开软件提示应用程序无法启动,因为应用程序的并行配置不正确,具体问题现象如下图所示: 故障原因分析: 一个可能是Win ...
- 云原生小课堂|Envoy请求流程源码解析(三):请求解析
前言 Envoy 是一款面向 Service Mesh 的高性能网络代理服务.它与应用程序并行运行,通过以平台无关的方式提供通用功能来抽象网络.当基础架构中的所有服务流量都通过 Envoy 网格时 ...
- Spark SQL 工作流程源码解析(四)optimization 阶段(基于 Spark 3.3.0)
前言 本文隶属于专栏<大数据技术体系>,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见大数据技术体系 目录 Spark SQL 工 ...
- Quantopian教程源码解析及实战
Quantopian教程源码解析及实战 本文主要侧重于采用Quantopian进行实际的金融策略分析,因此阅读本文前,需要对Quantopian的有基本的了解,建议先阅读Quantopian的tu ...
- Myth源码解析系列之六- 订单下单流程源码解析(发起者)
前面一章我们走完了服务启动的源码,这次我们进入下单流程的源码解析~ 订单下单流程源码解析(发起者) 首先保证myth-demo-springcloud-order.myth-demo-springcl ...
最新文章
- 计算机408试题2014,2014年考研计算机统考408真题
- k-Nearest Neighbors 实战1 简单的电影分类实例
- JQuery系列(4) - AJAX方法
- IS环境下配置PHP5+MySql+PHPMyAdmin
- MP3技术白皮书-音频格式全解析
- php 修改excel内容吗,php更新修改excel中的内容例子
- php nginx错误,PHP/Nginx错误(Win)
- 海康大华PC客户端集成播放器
- nifi集群_nifi架构
- Android应用调用第三方地图应用导航
- itest软件测试工具,itest(爱测试)
- 解密微信电脑版image文件夹下缓存的用户图片
- springboot实战—BMI体脂计算器-服务器端
- mysql fastdfs_FastDFS监控系统Fastdfs-zyc配置
- 【财经期刊FM-Radio|2021年03月04日】
- 图像的高频信息和低频信息的含义
- cv::mat与unsigned char*相互转化之间的转换
- java实现阿里大于短信发送服务
- Qt课程设计--用qt实现计算器的功能
- 【大学篇】大学的意义
热门文章
- 【狂神说Redis】4 三种特殊数据类型
- 投影查询(2020-3-13)
- 读取doc文件c语言程序,c语言程序中关于文件的操作.doc
- @PropertySource 解析 yml 配置文件,自定义解析 yaml 工厂类
- 向视图中插入的数据能进入到基本表中去吗?_数据库调优,调的是什么及常见手法...
- vue-cli3安装遇到的问题,卸载不掉旧版本,导致更新不了
- 一文读懂如何用深度学习实现网络安全
- nodejs导出excel
- ssh 遍历IPS 进行连接
- 大规模机器学习:将数据科学引入生产系统架构的典型模式