目录
前言
Netd
Netd概述
Netd启动
init.rc
main
NetlinkManager
NetlinkHandler
NetlinkManager总结
CommandListener分析
CommandListener总结
Netd架构图
NetworkManagementService
NetworkManagementService启动
NativeDaemonConnector监听
NetdCallbackReceiver处理
NetdCallbackReceiver执行
EthernetService和ConnectivityService
EthernetService启动
EthernetServiceImpl
NetworkFactory
最近了解了下安卓网络相关的内容,在此做一些记录,便于以后查看,本文的分析源码是基于android6.0.1的
源码网址:http://androidxref.com
Netd : Network Daemon 用于管理和控制Android平台网络的后台进程。
我首先先了解下这个Netd程序是干什么的,从程序的启动开始
netd服务在init中启动,配置文件如下
/system/core/rootdir/init.rc
启动Netd,并创建4个TCP监听socket,名称分别为:
”netd”、”dnsproxyd”、”mdns”、”fwmarkd”
Framework层中的
1.NetworkManagementService <=> "netd"
2.NsdService <=> "mdns"
3.调用和域名解析相关的socket API(如getaddrinfo或gethostbyname等)的进程 <=> "dnsproxyd"
建立socket链接、监听并交互。
看一下netd程序的入口,main函数
/system/netd/server/main.cpp
主函数中,创建了NetlinkManager,设置了Broadcaster,并启动,先看看NetlinkManager
NM中,setupSocket方法:
NetlinkManager主要是创建了socket,创建对于的NetlinkHandler,并启动,接下来势必得看一下NetlinkHandler是个什么,这里关系,需要有个一张图来捋一下。
NetlinkHandler的start方法,实则最后调用的是其超类SocketListener的startListener方法
/system/core/libsysutils/src/SocketListener.cpp
线程函数threadStart
SocketListener这边主要是启动一个线程,监听Socket的消息,最后滴啊用onDateAvailable处理,这个方法在它的子类NetlinkListener中实现:
1.NetlinkManager创建socket,根据socket创建NetlinkHandler,并且启动start
2.NetlinkHandler继承 NetlinkListener 继承 SocketListener,最后start调用的是SocketListener的startListener
3. startListener启动一个线程,接收内核消息,调用onDataAvailable来处理, onDataAvailable方法在NetlinkListener实现
4. NetlinkListener的onDataAvailable,调用onEvent来处理消息,onEvent方法在NetlinkHandler实现
5. NetlinkHandler的onEvent方法中处理消息,最后调用notify函数,调用NetlinkManager的Broadcaster也就是CommandListener的sendBroadcast方法,发送消息给发送给Framework层的NetworkManagermentService
分析了NetlinkManager清楚了,内核是如何发送消息给Framework层的,再来看一下CommandListener是如何接收来自NetworkManagermentService的消息的,CommandListener是在netd主函数中被创建的
CommandListener的初始化时注册了14个命令类对象, 这些类的定义在CommandListener.h中,都从NetdCommand继承, NetdCommand从FrameworkCommand继承,只写了构造函数和析构函数
registerCmd方法在CommandListener的基类FrameworkListener实现,就是加入到list中
CommandListener的startListener, 同上面NetlinkListerner一样,CommandListener继承于FrameworkListener,FrameworkListener继承于SocketListene, startListener最后SocketListener启动一个线程。执行runListener方法,来处理接收到的消息
不同的是FrameworkListener实现的onDataAvailable方法,最后调用dispatchCommand处理命令,最后调用runCommand来处理,最后消息在刚开始注册入的,不同类型的命令处理里执行对应的runCommand方法
1. CommandListener注册入不同的命令处理类,并且启动start
2. CommandListener继承 FrameworkListener 继承 SocketListener,最后start调用的是SocketListener的startListener
3. startListener启动一个线程,接收内核消息,调用onDataAvailable来处理, onDataAvailable方法在FrameworkListener实现
4. FrameworkListener的onDataAvailable,调用dispatchCommand来处理消息,最后调用在runCommand
5. runCommand不同的命令处理里,不同的实现来处理
最后放一张个人理解的架构图,帮助理解
上面描述了Netd程序部分,下面进入到NetworkManagementService部分分析,首先还是从启动开始
/frameworks/base/services/java/com/android/server/SystemServer.java
在SystemServer的startOtherServices()中启动
NativeDaemonConnector实现了run方法,循环执行listenToSocket
NetdCallbackReceiver的onEvent方法,处理各种事件,调用对应的notifyXXXX方法各notifyXXXX方法最后调用mObservers实现的方法
private final RemoteCallbackList
new RemoteCallbackList
mObservers通过registerObserver注入
INetworkManagementEventObserver处理netd发送过来的消息
INetworkManagementEventObserver中定义了接口名称,不同的服务实现对应的接口功能,注册到NMS中
NMS发送命令给netd,通过mConnector.execute方法
上面分析了Netd、NetworkManagementService的交互过程,最后再加上点ConnectivityService和EthernetService之间的联系的理解,还是先从EthernetService的启动开始
同样在SystemServer的startOtherServices()中启动
EthernetService的实质是,创建了一个EthernetServiceImpl对象,并调用其start方法
ConnectivityService服务是系统中管理,各个类型网络连接,路由配置信息的服务,这部分介绍下NetworkFactory, 每一个具备提供网络服务的对象都需要创建一个NetworkFactory的子类对象,并利用该对象注册自己,以及提供自己的分值
总结:
这部分流程就是EthernetService创建一个NetworkFactory注册到ConnectivityService,通过AsyncChannel建立ConnectivityService和EthernetService的单向连接, ConnectivityService来管理控制EthernetService的连接和断开