Android: Android Wifi System

本文深入解析Android设备中Wifi系统的各个层次结构及其工作流程,包括Java应用层、JavaFramework层、JNI层、适配器层、wpa_supplicant程序和Kernel层。详细介绍了如何通过设置使能Wifi功能,从Settings到最终调用内核驱动实现Wifi的启用过程。

Wifi System:

Java应用层
Java Framework层
JNI层
适配器层
wpa_supplicant程序
Kernel层

Java应用层
-- Settings, WifiSwitcher等应用
--> /system/app
Java Framework层
-- frameworks/base/wifi/java/android/net/wifi/* (android.net.wifi)
-- frameworks/base/services/java/com/android/server/WifiService.java
frameworks/base/services/java/com/android/server/WifiWatchdogService.java
--> /system/framework/framework.jar
/system/framework/services.jar
JNI层
-- frameworks/base/core/jni/android_net_wifi_Wifi.cpp
--> /system/lib/libandroid_runtime.so
适配器层
-- hardware/libhardware_legacy/wifi/wifi.c
--> /system/lib/libhardware_legacy.so
wpa_supplicant程序
-- external/wpa_supplicant
-- external/wpa_supplicant_6
--> /system/bin/wpa_supplicant
/system/lib/libwpa_client.so
Kernel层
-- kernel wifi driver

Enable Wifi 的过程:

Settings/WifiEnabler.java
mWifiManager.setWifiEnabled(enable);
-->
frameworks/base/wifi/java/android/net/wifi/WifiManager.java
public boolean setWifiEnabled(boolean enabled) {
mService.setWifiEnabled(enabled);
}
-->
frameworks/base/services/java/com/android/server/WifiService.java
public boolean setWifiEnabled(boolean enable) {
sendEnableMessage(enable, true, Binder.getCallingUid());
}
->
setWifiEnabledBlocking() {
if (enable) {
mWifiStateTracker.loadDriver();
mWifiStateTracker.startSupplicant();
} else {
mWifiStateTracker.stopSupplicant();
mWifiStateTracker.unloadDriver();
}
}
-->
frameworks/base/wifi/java/android/net/wifi/WifiStateTracker.java
public synchronized boolean loadDriver() {
return WifiNative.loadDriver();
}
public synchronized boolean startSupplicant() {
return WifiNative.startSupplicant();
}
-->
frameworks/base/wifi/java/android/net/wifi/WifiNative.java
public native static boolean loadDriver();
public native static boolean startSupplicant();
-->
frameworks/base/core/jni/android_net_wifi_Wifi.cpp
static jboolean android_net_wifi_loadDriver(JNIEnv* env, jobject clazz)
{
return (jboolean)(::wifi_load_driver() == 0);
}
static jboolean android_net_wifi_startSupplicant(JNIEnv* env, jobject clazz)
{
return (jboolean)(::wifi_start_supplicant() == 0);
}
-->
hardware/libhardware_legacy/wifi/wifi.c
int wifi_load_driver(){
//for build in driver, do nothing
//for .ko driver, insmod/load firmware...
}
int wifi_start_supplicant(){
property_set("ctl.start", "wpa_supplicant");
}
-->
/init.rc
service wpa_supplicant /system/bin/wpa_supplicant ...

combined_qs_header.xml <androidx.constraintlayout.motion.widget.MotionLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/split_shade_status_bar" android:layout_width="match_parent" android:layout_height="wrap_content" android:minHeight="@dimen/split_shade_header_min_height" android:clickable="false" android:focusable="true" android:paddingLeft="@dimen/qs_panel_padding" android:paddingRight="@dimen/qs_panel_padding" android:visibility="gone" android:theme="@style/Theme.SystemUI.QuickSettings.Header" app:layoutDescription="@xml/combined_qs_header_scene"> <androidx.constraintlayout.widget.Guideline android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/center" app:layout_constraintGuide_percent="0.5" android:orientation="vertical" /> <com.android.systemui.statusbar.policy.Clock android:id="@+id/clock" android:layout_width="wrap_content" android:layout_height="0dp" android:gravity="start|center_vertical" android:paddingStart="@dimen/status_bar_left_clock_starting_padding" android:paddingEnd="@dimen/status_bar_left_clock_end_padding" android:singleLine="true" android:textAppearance="@style/TextAppearance.QS.Status" /> <com.android.systemui.statusbar.policy.DateView android:id="@+id/date" android:layout_width="wrap_content" android:layout_height="0dp" android:layout_gravity="start|center_vertical" android:gravity="center_vertical" android:singleLine="true" android:textAppearance="@style/TextAppearance.QS.Status" app:datePattern="@string/abbrev_wday_month_day_no_year_alarm" /> <include android:id="@+id/carrier_group" layout="@layout/qs_carrier_group" app:layout_constraintHeight_min="@dimen/split_shade_header_min_height" android:minHeight="@dimen/split_shade_header_min_height" app:layout_constraintWidth_min="48dp" android:layout_width="0dp" android:layout_height="0dp" app:layout_constrainedWidth="true" android:layout_gravity="end|center_vertical" android:layout_marginStart="8dp" app:layout_constraintStart_toEndOf="@id/date" app:layout_constraintEnd_toStartOf="@id/statusIcons" app:layout_constraintTop_toTopOf="@id/clock" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintHorizontal_bias="1" /> <com.android.systemui.statusbar.phone.StatusIconContainer android:id="@+id/statusIcons" app:layout_constraintHeight_min="@dimen/split_shade_header_min_height" android:paddingEnd="@dimen/signal_cluster_battery_padding" android:layout_width="wrap_content" android:layout_height="48dp" app:layout_constraintStart_toEndOf="@id/carrier_group" app:layout_constraintEnd_toStartOf="@id/batteryRemainingIcon" app:layout_constraintTop_toTopOf="@id/clock" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintHorizontal_bias="1" /> <com.android.systemui.battery.BatteryMeterView android:id="@+id/batteryRemainingIcon" android:layout_width="wrap_content" android:layout_height="48dp" app:layout_constraintHeight_min="@dimen/split_shade_header_min_height" app:textAppearance="@style/TextAppearance.QS.Status" app:layout_constraintStart_toEndOf="@id/statusIcons" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="@id/clock" app:layout_constraintBottom_toBottomOf="parent" /> </androidx.constraintlayout.motion.widget.MotionLayout> 解析一下
最新发布
08-22
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值