WIFI简介
Android中Wi-Fi驱动程序被编译成内核的模块,通过应用程序设置开关进行加载和卸载,具体来说就是Settings --> Wireless & networks --> Wi-Fi。同时,要使Wi-Fi正常工作,驱动中还需要实现烧写固件程序和配置信息到Wi-Fi的芯片中。
wpa_supplicant
它是一个开源的库,加入到Android源码中,经过修改后成为Android实现Wi-Fi功能的基础。它的代码通常位于./external/wpa_supplicant文件夹中,主要用C和C++写成,实现了从上层接到命令后,发送给硬件驱动程序,接着操作硬件完成需要的操作,这里是通过socket来与硬件驱动进行通信的。下图2-1是wpa_supplicant的框架图。
wpa_supplicant开源项目框架图
硬件驱动程序
wpa_supplicant与之通信的硬件驱动的代码位于./hardware/libhardware_legacy/wifi/wifi.c中。
JNI部分
首先简要介绍一下JNI,JNI是Java Native Interface的缩写,它实现了Java代码与其他代码进行交互,使得在Java虚拟机中运行的Java代码能够与用其他语言编写的应用程序和库进行交互。在Android中,JNI可以让Java程序调用C程序。
与Wi-Fi相关的JNI代码位于./frameworks/base/core/jni/android_net_wifi_Wifi.cpp中。
Wi-Fi API部分
这部分源代码使用Java完成了对Wi-Fi API的封装,使应用程序可以使用Wi-Fi功能,它们位于frameworks/base/services/java/com/android/server/
和frameworks/base/wifi/java/android/net/wifi/中。
Wi-Fi Settings应用程序部分
这是Android中自带的一个应用程序,在手机的Settings中,它可以让用户手动打开或关闭Wi-Fi功能。当用户打开Wi-Fi功能后,它会自动搜索周围的无线网络,并以列表的形式显示,供用户选择,默认会连接用户上一次成功连接的无线网络。这部分代码位于./packages/apps/Settings/src/com/android/settings/wifi中。
Wi-Fi层次结构关系
下图就是Android中Wi-Fi的各模块在整个Android层次结构中的位置,以及它们之间的关系。
Android中Wi-Fi的层次结构图
Wi-Fi执行过程
Android中Wi-Fi是使用层次结构设计的,因此执行过程基本上是在接到用户命令后,先从上到下,再从下到上,完成用户与Wi-Fi设备的交互。下图3-1就是Wi-Fi功能的详细执行过程示意图。
Wi-Fi执行过程示意图