Android中网络的整体架构如下:
NetworkmanagementService
此模块运行在SystemService中,负责Java层的实现机制,提供对上层的一些运行接口,当然,上层是通过一些抽象类实现进程间通讯进行访问的。
NetD
此模块是C++的Daemon,负责底层部分对于一些关键网络服务的管理。对上面Java服务提供接口,采用进程间通讯的方式。
Wpa_supplicant
此模块是提供WIFI支持的模块,不做详细描述了。在Android中是一个关键的底层服务。
Dnsmasq
此服务实现了DHCP Server,用于辅助Hostapd,实现IP的管理。
Hosted
此服务实现了WIFI AP的关键服务,直接控制底层设备,此服务正常运行后,其他终端可以搜索到AP,并连接。
以下是启动WIFI AP 的流程:
以下是代码说明:
NetworkManagementService
base/wifi/java/android/net/wifi/WifiStateMachine.java
private void startSoftApWithConfig(final WifiConfiguration config)
frameworks/base/services/java/com/android/server/NetworkManagementService.java // 网路管理服务
startAccessPoint {...}
wifiFirmwareReload(wlanIface, "AP");
mConnector.execute("softap", "set", wlanIface);
mConnector.execute("softap", "startap");
system/netd/CommandListener.cpp // 通讯用得CommandListener
CommandListener::SoftapCmd::runCommand
NetD 服务
system/netd/SoftapController.cpp
SoftapController::startSoftap()
static const char HOSTAPD_CONF_FILE[] = "/data/misc/wifi/hostapd.conf";
#define WIFI_ENTROPY_FILE "/data/misc/wifi/entropy.bin"
ensure_entropy_file_exists(); // 检查需要加密文件是否存在
if (execl("/system/bin/hostapd", "/system/bin/hostapd", //启动Hostapd
"-e", WIFI_ENTROPY_FILE,
HOSTAPD_CONF_FILE, (char *) NULL)) {
ALOGE("execl failed (%s)", strerror(errno));
}
SoftapController::stopSoftap // 停止Hostapd
kill(mPid, SIGTERM); // 结束Hostapd
waitpid(mPid, NULL, 0) // 等待结束返回
system/netd/TetherController.cpp // DHCP daemon 管理
startTethering() {
...
"system/bin/dnsmasq" // 启动Dnsmasq后台进程
...
}
启动Hostapd
SoftapController::startSoftap()
static const char HOSTAPD_CONF_FILE[] = "/data/misc/wifi/hostapd.conf";
#define WIFI_ENTROPY_FILE "/data/misc/wifi/entropy.bin"
ensure_entropy_file_exists(); // 检查需要加密文件是否存在
if (execl("/system/bin/hostapd", "/system/bin/hostapd", //启动Hostapd
"-e", WIFI_ENTROPY_FILE,
HOSTAPD_CONF_FILE, (char *) NULL)) {
ALOGE("execl failed (%s)", strerror(errno));
}
SoftapController::stopSoftap // 停止Hostapd
kill(mPid, SIGTERM); // 结束Hostapd
waitpid(mPid, NULL, 0) // 等待结束返回