技术标签: 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。
文章浏览阅读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
文章浏览阅读314次。AI推理单元推理服务供了一套面向 MLU(Machine Learning Unit,机器学习单元)设备的类似服务器的推理接口(C++11标准),以及模型加载与管理,推理任务调度等功能,极大地简化了面向MLU平台高性能深度学习应用的开发和部署工作。概述推理服务在软件栈中的位置,如下图所示:推理服务共包含以下3个模块的用户接口:• Model: 模型加载与管理• Processor: 可自定义的后端处理单元• InferServer: 执行推理任务基本概念本文描述推理服务中所涉及的具体概念_人工智能推理单元包括服务器吗
文章浏览阅读4.3k次,点赞4次,收藏10次。实验三 用FFT对信号进行频谱分析及MATLAB程序实验三 用FFT对信号进行频谱分析一 实验目的1 能够熟练掌握快速离散傅立叶变换的原理及应用FFT进行频谱分析的基本方法;2了解; (3-1)是的连续周期函数。对序列进行N点DFT得到,则是在区间上对的N点等间隔采样,频谱分辨率就是采样间隔。因此序列的傅里叶变换可利用DFT(即FFT)来计算。用FFT对..._三角波频谱
文章浏览阅读398次。在打包SDK的过程中,Xcode编译出的framework分为真机与模拟器两种,但在使用过程中,我们需要将两种进行合并。本文简单总结了下合并的过程。_xcode framework 模拟器
文章浏览阅读9.5k次,点赞4次,收藏36次。【pandas】drop()函数详解_pandas drop
文章浏览阅读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
文章浏览阅读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可以同时调用多个软件吗
文章浏览阅读3.3k次。第1章Cassandra-Cluster-Admin介绍 Cassandra-Cluster-Admin是Cassandra的web管理工具,就像流行的mysql web管理工具phpmyadmin一样,可以管理Cassandra集群中的数据。 支持的操作有:操作Keyspace (add/edit/ drop)操作Column Family_cassandra web管理工具
文章浏览阅读1.3k次。ALTER TABLE Table1 ALTER COLUMN column1 VARCHAR(255)转载于:https://www.cnblogs.com/railgunman/p/8997422.html_sqlserver更改表字段长度
文章浏览阅读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
文章浏览阅读3.1k次,点赞2次,收藏4次。Optional类在Java中,可能我们看过最多的异常就是java.lang.NullPointerException,这是使用null引用去调用一个方法或者字段的结果。Java 8中提供了java.util.Optional 类,是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且 可以避免空指针异常。Optiona_optional.of 可以判断true
文章浏览阅读4.7k次,点赞4次,收藏14次。shell 脚本实现自动化修改用户密码_linux 批量修改用户密码