android wifi 初始化失败,Android4.4(MT8685)源码WIFI-初始化一-程序员宅基地

技术标签: android wifi 初始化失败  

Android4.4(MT8685)源码WIFI--初始化1

在Android系统启动的时候,会在./frameworks/base/services/java/com/android/server/SystemServer.java类中启动许多服务,其中和Wifi相关的服务就在这里初始化。在SystemServer的main方法中,我们可以看到

thr.initAndLoop();

这里调用了它的内部类对象的initAndLoop方法,在这个方法的作用主要就是初始化系统启动需要加载的服务的,我们在这个方法中可以找到

try {

Slog.i(TAG, "Wi-Fi Service");

wifi = new WifiService(context);

ServiceManager.addService(Context.WIFI_SERVICE, wifi);

} catch (Throwable e) {

reportWtf("starting Wi-Fi Service", e);

}

try {

Slog.i(TAG, "Connectivity Service");

connectivity = new ConnectivityService(

context, networkManagement, networkStats, networkPolicy);

ServiceManager.addService(Context.CONNECTIVITY_SERVICE, connectivity);

networkStats.bindConnectivityManager(connectivity);

networkPolicy.bindConnectivityManager(connectivity);

wifiP2p.connectivityServiceReady();

wifi.checkAndStartWifi();

} catch (Throwable e) {

reportWtf("starting Connectivity Service", e);

}

这里我们可以看到初始化了一个WifiService和ConnectivityService对象,并把这2个对象注册到ServiceManager中,然后通过创建的对象wifi 来调用checkAndStartWifi方法,具体的WifiService的分析我们下一章再做详细介绍,现在我们简单分析下ConnectivityService。

ConnectivityService是管理系统中所有的数据连接服务,其中就包括Wifi,我们来看看它的构造函数,路径:./frameworks/base/services/java/com/android/server/ConnectivityService.java

public ConnectivityService(Context context, INetworkManagementService netd,

INetworkStatsService statsService, INetworkPolicyManager policyManager) {

// Currently, omitting a NetworkFactory will create one internally

// TODO: create here when we have cleaner WiMAX support

this(context, netd, statsService, policyManager, null);

}

这里就是调用了同名的构造方法

public ConnectivityService(Context context, INetworkManagementService netManager,

INetworkStatsService statsService, INetworkPolicyManager policyManager,

NetworkFactory netFactory) {

if (DBG) log("ConnectivityService starting up");

HandlerThread handlerThread = new HandlerThread("ConnectivityServiceThread");

handlerThread.start();

mHandler = new InternalHandler(handlerThread.getLooper());

mTrackerHandler = new NetworkStateTrackerHandler(handlerThread.getLooper());

// Create and start trackers for hard-coded networks

for (int targetNetworkType : mPriorityList) {

final NetworkConfig config = mNetConfigs[targetNetworkType];

final NetworkStateTracker tracker;

try {

/** M: Hotspot Manager @{*/

if(config.radio == TYPE_USB){

log("new UsbDataStateTracker");

mNetTrackers[targetNetworkType] = new UsbDataStateTracker(targetNetworkType, config.name, mNetd);

mNetTrackers[targetNetworkType].startMonitoring(context, mTrackerHandler);

continue;

}

if(true == FeatureOption.MTK_ALPS_BOX_SUPPORT && config.radio == TYPE_ETHERNET){

if (DBG) log("Starting Ethernet Service.");

mNetTrackers[TYPE_ETHERNET] = makeEthStateTracker(context);

if(mNetTrackers[TYPE_ETHERNET] != null){

if (DBG) log("mNetTrackers[TYPE_ETHERNET] != null");

mNetTrackers[TYPE_ETHERNET].startMonitoring(context, mTrackerHandler);

if (config.isDefault()) {

mNetTrackers[TYPE_ETHERNET].reconnect();

}

}

continue;

}

/*@} */

/*@} */

///M:new a Teledongle Data Tracker @by mtk94127 @{

if(FeatureOption.MTK_EXTERNAL_DONGLE_SUPPORT && (config.radio == TYPE_TEDONGLE)) {

log("new TedongleDataStateTracker");

mNetTrackers[targetNetworkType] = makeTedongleDataTracker();

log("new TedongleDataStateTracker medium!");

mNetTrackers[targetNetworkType].startMonitoring(context, mTrackerHandler);

log("new TedongleDataStateTracker end!");

continue;

}

///M:@}

tracker = netFactory.createTracker(targetNetworkType, config);

mNetTrackers[targetNetworkType] = tracker;

} catch (IllegalArgumentException e) {

Slog.e(TAG, "Problem creating " + getNetworkTypeName(targetNetworkType)

+ " tracker: " + e);

continue;

}

tracker.startMonitoring(context, mTrackerHandler);

if (config.isDefault()) {

tracker.reconnect();

}

}

}

这里根据com.android.internal.R.array.networkAttributes配置的属性去创建一个个tracker,并监听其状态,tracker.startMonitoring(context, mTrackerHandler);可以看出tracker可以通过mTrackerHandler向ConnectivityService发送消息,这些消息有

/**

* The network state has changed and the NetworkInfo object

* contains the new state.

*

* msg.what = EVENT_STATE_CHANGED

* msg.obj = NetworkInfo object

*/

public static final int EVENT_STATE_CHANGED = BASE_NETWORK_STATE_TRACKER;

/**

* msg.what = EVENT_CONFIGURATION_CHANGED

* msg.obj = NetworkInfo object

*/

public static final int EVENT_CONFIGURATION_CHANGED = BASE_NETWORK_STATE_TRACKER + 1;

/**

* msg.what = EVENT_RESTORE_DEFAULT_NETWORK

* msg.obj = FeatureUser object

*/

public static final int EVENT_RESTORE_DEFAULT_NETWORK = BASE_NETWORK_STATE_TRACKER + 2;

/**

* msg.what = EVENT_NETWORK_SUBTYPE_CHANGED

* msg.obj = NetworkInfo object

*/

public static final int EVENT_NETWORK_SUBTYPE_CHANGED = BASE_NETWORK_STATE_TRACKER + 3;

/**

* msg.what = EVENT_NETWORK_CONNECTED

* msg.obj = LinkProperties object

*/

public static final int EVENT_NETWORK_CONNECTED = BASE_NETWORK_STATE_TRACKER + 4;

/**

* msg.what = EVENT_NETWORK_CONNECTION_DISCONNECTED

* msg.obj = LinkProperties object, same iface name

*/

public static final int EVENT_NETWORK_DISCONNECTED = BASE_NETWORK_STATE_TRACKER + 5;

当WiFi的连接AP成功后,就会想 ConnectivityService发送一个EVENT_STATE_CHANGED消息。

接着我们来看创建了哪些tracker,找到createTracker方法

@Override

public NetworkStateTracker createTracker(int targetNetworkType, NetworkConfig config) {

switch (config.radio) {

case TYPE_WIFI:

return new WifiStateTracker(targetNetworkType, config.name);

case TYPE_MOBILE:

return new MobileDataStateTracker(targetNetworkType, config.name);

case TYPE_DUMMY:

return new DummyDataStateTracker(targetNetworkType, config.name);

case TYPE_BLUETOOTH:

return BluetoothTetheringDataTracker.getInstance();

case TYPE_WIMAX:

return makeWimaxStateTracker(mContext, mTrackerHandler);

case TYPE_CSD:

return new CsdStateTracker(targetNetworkType, config.name);

default:

throw new IllegalArgumentException(

"Trying to create a NetworkStateTracker for an unknown radio type: "

+ config.radio);

}

}

这里我们主要关注TYPE_WIFI,创建了一个WifiStateTracker对象,进入到WifiStateTracker的构造方法

public WifiStateTracker(int netType, String networkName) {

///M:@{

mNetType = netType;

///@}

mNetworkInfo = new NetworkInfo(netType, 0, networkName, "");

mLinkProperties = new LinkProperties();

mLinkCapabilities = new LinkCapabilities();

mNetworkInfo.setIsAvailable(false);

setTeardownRequested(false);

}

接着调用startMonitoring

/**

* Begin monitoring wifi connectivity

*/

public void startMonitoring(Context context, Handler target) {

mCsHandler = target;

mContext = context;

mWifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);

IntentFilter filter = new IntentFilter();

///M:seperate p2p and wifi @{

if (mNetType == ConnectivityManager.TYPE_WIFI) {

filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);

filter.addAction(WifiManager.LINK_CONFIGURATION_CHANGED_ACTION);

}

///@}

mWifiStateReceiver = new WifiStateReceiver();

mContext.registerReceiver(mWifiStateReceiver, filter);

}

这里就是注册了一个广播用于接收NETWORK_STATE_CHANGED_ACTION和LINK_CONFIGURATION_CHANGED_ACTION广播,ConnectivityService我们就分析到这里,下一章我们将详细分析WifiService。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_36429702/article/details/117498003

智能推荐

【SimpleITK教程】SimpleITK读取Dicom序列-程序员宅基地

文章浏览阅读1.7w次,点赞13次,收藏94次。医学图像数据常用的格式为dcm或者nrrd。下面的教程展示,如何读取一个包含多张切片的dicom序列,并将其转换为单个3D的dcm文件import SimpleITK as sitk# Dicom序列所在文件夹路径(在我们的实验中,该文件夹下有多个dcm序列,混合在一起)file_path = "/data/jianjunming/BEOT/BEOT_1st/B/B13-5219..._simpleitk读取dicom

AI推理单元_人工智能推理单元包括服务器吗-程序员宅基地

文章浏览阅读314次。AI推理单元推理服务供了一套面向 MLU(Machine Learning Unit,机器学习单元)设备的类似服务器的推理接口(C++11标准),以及模型加载与管理,推理任务调度等功能,极大地简化了面向MLU平台高性能深度学习应用的开发和部署工作。概述推理服务在软件栈中的位置,如下图所示:推理服务共包含以下3个模块的用户接口:• Model: 模型加载与管理• Processor: 可自定义的后端处理单元• InferServer: 执行推理任务基本概念本文描述推理服务中所涉及的具体概念_人工智能推理单元包括服务器吗

matlab对三角波信号进行频谱分析,实验三 用FFT对信号进行频谱分析及MATLAB程序.doc...-程序员宅基地

文章浏览阅读4.3k次,点赞4次,收藏10次。实验三 用FFT对信号进行频谱分析及MATLAB程序实验三 用FFT对信号进行频谱分析一 实验目的1 能够熟练掌握快速离散傅立叶变换的原理及应用FFT进行频谱分析的基本方法;2了解; (3-1)是的连续周期函数。对序列进行N点DFT得到,则是在区间上对的N点等间隔采样,频谱分辨率就是采样间隔。因此序列的傅里叶变换可利用DFT(即FFT)来计算。用FFT对..._三角波频谱

XCode 8.3 上真机与模拟器Framework的合并_xcode framework 模拟器-程序员宅基地

文章浏览阅读398次。在打包SDK的过程中,Xcode编译出的framework分为真机与模拟器两种,但在使用过程中,我们需要将两种进行合并。本文简单总结了下合并的过程。_xcode framework 模拟器

【pandas】drop()函数详解_pandas drop-程序员宅基地

文章浏览阅读9.5k次,点赞4次,收藏36次。【pandas】drop()函数详解_pandas drop

NumPy常用函数(2)-- 读写CSV文件_numpy 读写csv-程序员宅基地

文章浏览阅读1.1w次。 Numpy读写CSV文件。CSV文件:通过逗号分隔的文本文件。 读写CSV文件实例:from numpy import *a = arange(20).reshape(4,5)print(a)#delimiter:分隔符属性,指定以什么字符分隔;对一维数组不起作用savetxt('a.txt',a,fmt='%d',delimiter=',')#以逗号,分..._numpy 读写csv

随便推点

SystemVerilog 利用DPI调用其他语言_systemverilog dpi-c可以同时调用多个软件吗-程序员宅基地

文章浏览阅读6.8k次,点赞2次,收藏36次。SystemVerilog 利用DPI-C调用其他语言众所周知DPI-C调用外部C程序值需要通过import即可,但是DPI重要的一点是可以调用外部其他语言,最简单的办法就是调用Verilog的$system()任务,如果需要命令的返回值,使用linux的system()函数和WEXITSTATUS任务。调用外部c语言的sv代码:perl_test.svimport "DPI-..._systemverilog dpi-c可以同时调用多个软件吗

Cassandra-Cluster-Admin_cassandra web管理工具-程序员宅基地

文章浏览阅读3.3k次。第1章Cassandra-Cluster-Admin介绍 Cassandra-Cluster-Admin是Cassandra的web管理工具,就像流行的mysql web管理工具phpmyadmin一样,可以管理Cassandra集群中的数据。 支持的操作有:操作Keyspace (add/edit/ drop)操作Column Family_cassandra web管理工具

sqlserver 修改表字段长度-程序员宅基地

文章浏览阅读1.3k次。ALTER TABLE Table1 ALTER COLUMN column1 VARCHAR(255)转载于:https://www.cnblogs.com/railgunman/p/8997422.html_sqlserver更改表字段长度

Android11.0(R) MTK user版本打开MtkLog功能_mtk user版本 mssi_mtk_log_customer_support = yes-程序员宅基地

文章浏览阅读3.6k次,点赞3次,收藏11次。MTKLog 功能很好用,在 userdebug 和 eng 版本中可以帮助我们分析问题。今天来搞一下,在 User 版本中也启用这个功能。修改清单device/mediatek/system/common/mtklog/mtklog-config-bsp-eng.propdevice/mediatek/system/common/mtklog/mtklog-config-bsp-user.propdevice/mediatek/system/common/device.mkdevice/med_mtk user版本 mssi_mtk_log_customer_support = yes

详解Java8特性之Optional类_optional.of 可以判断true-程序员宅基地

文章浏览阅读3.1k次,点赞2次,收藏4次。Optional类在Java中,可能我们看过最多的异常就是java.lang.NullPointerException,这是使用null引用去调用一个方法或者字段的结果。Java 8中提供了java.util.Optional 类,是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且 可以避免空指针异常。Optiona_optional.of 可以判断true

【Linux】通过 Shell 脚本修改用户密码_linux 批量修改用户密码-程序员宅基地

文章浏览阅读4.7k次,点赞4次,收藏14次。shell 脚本实现自动化修改用户密码_linux 批量修改用户密码

推荐文章

热门文章

相关标签