引用:http://blog.csdn.net/xiaokeweng/article/details/8130218
所谓 Netd 就是Network Daemon 的缩写,表示Network守护进程,类似的命名还有很多,例如 Vold(Volumn Deamon)—磁盘管理,Rild(Radio Interface Layer Deamon)— 电话的基本数据功能……类似的还有好多,遍及Android各类服务,各个层次~
Netd负责跟一些涉及物理端口的网络操作相关的功能实现,例如带宽控制(Bandwidth),网络地址转换(NAT),个人局域网(pan),PPP链接,soft-ap,共享上网(Tether)等等……都是按照模块(.cpp+.h)组织在netd文件目录下的~
Android Netd相关的基本框架的四大部分:
(1)Linux Kernel 用于检测 network相关的所有 event 事件。
(2)Netd 作为 Kernel 与 Framework之间通信的桥梁。
(3)Framework 层操作 Netd,向 Netd发送操作命令。
(4)UI 与 Framework交互,用于用户进行网络的操控。
涉及主要源码位置:
Netd:
/System/netd
/system/core/libsysutils/src
/system/core/include/sysutils
Framework:
/frameworks/base/services/java/com/android/server
先统领一下~整体的框架图~ 很不规范,会意即可,之后还会详细介绍:
从init.rc文件中可以看到,是系统级的守护进程,手动kill后还会从新启动。
三.基本实例
就拿手机的soft-ap功能来举例吧,以使用 softap(Soft Access Point)为例。softap可以为wlan接入设备共享手机使用的移动网络,笔记本接入softap,可以通过手机的 3g 上网。
1)设置并开启 softap(便携式 WLAN 热点)
在 Setting 选项中进行设置,该设置功能的开启将涉及相关的UI 路径下相关的文件,packages /apps/Settings/src/com/Android/settings/wifi 路径下,程序中的 WifiApEnabler. OnPreferenceChange 里, 设置 soft ap 在 wifiApDialog.onClick 里。
2)调用相应的处理函数,通过 socket 向 netd 下发命令
应用层通过ConnectivityManager接口,最终走到 Framework 层的 NetworkManagementService.startAccessPoint 函数。
[java] view plain copy
//NetworkManagementService.java
@Override
public void startAccessPoint(
WifiConfiguration wifiConfig, String wlanIface, String softapIface) {
mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
try {
wifiFirmwareReload(wlanIface, "AP");
if (wifiConfig == null) {
mConnector.execute("softap", "set", wlanIface, softapIface);
} else {
mConnector.execute("softap", "set", wlanIface, softapIface, wifiConfig.SSID,
getSecurityType(wifiConfig), wifiConfig.preSharedKey);
}
mConnector.execute("softap", "startap");
} catch (NativeDaemonConnectorException e) {
throw e.rethrowAsParcelableException();
}
}
NetworkManagementService 通过NativeDaemonConnector, 这里用来和系统的 netd 守护进程通过 socket 进行通信,发送命令。
3) netd 接受命令并进行处理,并将处理结果反馈给 Framework 层。
Netd 中 softap 控制的功能在/system/netd/SoftapController.{h,cpp}里, 具体的执行是通过调用网卡驱动的 ap 功能。NetworkManagementService 通过 NativeDaemonConnector 向下通过 socket 向下 softap 相关的字符串命令,NativeDaemonConnector 中维护着与 Netd 中 CommandListener 相关联的内部socket 线程。两者可以通过它相互通信。
[cpp] view plain copy
//CommandListener.cpp
int CommandListener::SoftapCmd::runCommand(SocketClient *cli,
int argc, char **argv) {
int rc = 0, flag = 0;
char *retbuf = NULL;
if (argc < 2) {
cli->sendMsg(ResponseCode::CommandSyntaxError, "Softap Missing argument", false);
return 0;
}
if (!strcmp(argv[1], "start")) {
rc = sSoftapCtrl->startDriver(argv[2]);
} else if (!strcmp(argv[1], "stop")) {
rc = sSoftapCtrl->stopDriver(argv[2]);
} else if (!strcmp(argv[1], "startap")) {
rc = sSoftapCtrl->startSoftap();
} else if (!strcmp(argv[1], "stopap")) {
rc = sSoftapCtrl->stopSoftap();
} else if (!strcmp(argv[1], "fwreload")) {
rc = sSoftapCtrl->fwReloadSoftap(argc, argv);
} else if (!strcmp(argv[1], "clients")) {
rc = sSoftapCtrl->clientsSoftap(&retbuf);
if (!rc) {
cli->sendMsg(ResponseCode::CommandOkay, retbuf, false);
free(retbuf);
return 0;
}
} else if (!strcmp(argv[1], "status")) {
……
……
4) Framework 受到回馈的信息,并通知 UI 处理结果,呈现给用户。