Android系统Netd、NetworkManagementService网络相关总结

目录

前言

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

Netd概述

Netd :  Network Daemon 用于管理和控制Android平台网络的后台进程。

我首先先了解下这个Netd程序是干什么的,从程序的启动开始

Netd启动

init.rc

netd服务在init中启动,配置文件如下

/system/core/rootdir/init.rc

Android系统Netd、NetworkManagementService网络相关总结_第1张图片

启动Netd,并创建4个TCP监听socket,名称分别为:

”netd”、”dnsproxyd”、”mdns”、”fwmarkd”

Framework层中的

1.NetworkManagementService <=> "netd"

2.NsdService <=> "mdns"

3.调用和域名解析相关的socket API(如getaddrinfo或gethostbyname等)的进程 <=> "dnsproxyd"

建立socket链接、监听并交互。

main

看一下netd程序的入口,main函数

/system/netd/server/main.cpp

Android系统Netd、NetworkManagementService网络相关总结_第2张图片

主函数中,创建了NetlinkManager,设置了Broadcaster,并启动,先看看NetlinkManager

NetlinkManager

Android系统Netd、NetworkManagementService网络相关总结_第3张图片

NM中,setupSocket方法:

Android系统Netd、NetworkManagementService网络相关总结_第4张图片

NetlinkManager主要是创建了socket,创建对于的NetlinkHandler,并启动,接下来势必得看一下NetlinkHandler是个什么,这里关系,需要有个一张图来捋一下。

Android系统Netd、NetworkManagementService网络相关总结_第5张图片

NetlinkHandler

NetlinkHandler的start方法,实则最后调用的是其超类SocketListener的startListener方法

/system/core/libsysutils/src/SocketListener.cpp

Android系统Netd、NetworkManagementService网络相关总结_第6张图片

线程函数threadStart

Android系统Netd、NetworkManagementService网络相关总结_第7张图片

Android系统Netd、NetworkManagementService网络相关总结_第8张图片

SocketListener这边主要是启动一个线程,监听Socket的消息,最后滴啊用onDateAvailable处理,这个方法在它的子类NetlinkListener中实现:

Android系统Netd、NetworkManagementService网络相关总结_第9张图片

Android系统Netd、NetworkManagementService网络相关总结_第10张图片

Android系统Netd、NetworkManagementService网络相关总结_第11张图片

NetlinkManager总结

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

CommandListener分析

分析了NetlinkManager清楚了,内核是如何发送消息给Framework层的,再来看一下CommandListener是如何接收来自NetworkManagermentService的消息的,CommandListener是在netd主函数中被创建的

Android系统Netd、NetworkManagementService网络相关总结_第12张图片

CommandListener的初始化时注册了14个命令类对象, 这些类的定义在CommandListener.h中,都从NetdCommand继承, NetdCommand从FrameworkCommand继承,只写了构造函数和析构函数

Android系统Netd、NetworkManagementService网络相关总结_第13张图片

registerCmd方法在CommandListener的基类FrameworkListener实现,就是加入到list中

CommandListener的startListener, 同上面NetlinkListerner一样,CommandListener继承于FrameworkListener,FrameworkListener继承于SocketListene, startListener最后SocketListener启动一个线程。执行runListener方法,来处理接收到的消息

不同的是FrameworkListener实现的onDataAvailable方法,最后调用dispatchCommand处理命令,最后调用runCommand来处理,最后消息在刚开始注册入的,不同类型的命令处理里执行对应的runCommand方法

Android系统Netd、NetworkManagementService网络相关总结_第14张图片

Android系统Netd、NetworkManagementService网络相关总结_第15张图片

Android系统Netd、NetworkManagementService网络相关总结_第16张图片

CommandListener总结

1. CommandListener注册入不同的命令处理类,并且启动start

2. CommandListener继承 FrameworkListener 继承 SocketListener,最后start调用的是SocketListener的startListener

3. startListener启动一个线程,接收内核消息,调用onDataAvailable来处理, onDataAvailable方法在FrameworkListener实现

4. FrameworkListener的onDataAvailable,调用dispatchCommand来处理消息,最后调用在runCommand

5. runCommand不同的命令处理里,不同的实现来处理

Netd架构图

最后放一张个人理解的架构图,帮助理解

Android系统Netd、NetworkManagementService网络相关总结_第17张图片

NetworkManagementService

上面描述了Netd程序部分,下面进入到NetworkManagementService部分分析,首先还是从启动开始

NetworkManagementService启动

/frameworks/base/services/java/com/android/server/SystemServer.java

在SystemServer的startOtherServices()中启动

Android系统Netd、NetworkManagementService网络相关总结_第18张图片

Android系统Netd、NetworkManagementService网络相关总结_第19张图片

NativeDaemonConnector监听

NativeDaemonConnector实现了run方法,循环执行listenToSocket

Android系统Netd、NetworkManagementService网络相关总结_第20张图片

Android系统Netd、NetworkManagementService网络相关总结_第21张图片

Android系统Netd、NetworkManagementService网络相关总结_第22张图片

NetdCallbackReceiver处理

NetdCallbackReceiver的onEvent方法,处理各种事件,调用对应的notifyXXXX方法各notifyXXXX方法最后调用mObservers实现的方法

private final RemoteCallbackList mObservers =

new RemoteCallbackList();

mObservers通过registerObserver注入

Android系统Netd、NetworkManagementService网络相关总结_第23张图片

INetworkManagementEventObserver处理netd发送过来的消息

INetworkManagementEventObserver中定义了接口名称,不同的服务实现对应的接口功能,注册到NMS中

Android系统Netd、NetworkManagementService网络相关总结_第24张图片

NetdCallbackReceiver执行

NMS发送命令给netd,通过mConnector.execute方法

Android系统Netd、NetworkManagementService网络相关总结_第25张图片

EthernetService和ConnectivityService

上面分析了Netd、NetworkManagementService的交互过程,最后再加上点ConnectivityService和EthernetService之间的联系的理解,还是先从EthernetService的启动开始

EthernetService启动

同样在SystemServer的startOtherServices()中启动

Android系统Netd、NetworkManagementService网络相关总结_第26张图片

Android系统Netd、NetworkManagementService网络相关总结_第27张图片

Android系统Netd、NetworkManagementService网络相关总结_第28张图片

EthernetServiceImpl

EthernetService的实质是,创建了一个EthernetServiceImpl对象,并调用其start方法

Android系统Netd、NetworkManagementService网络相关总结_第29张图片

Android系统Netd、NetworkManagementService网络相关总结_第30张图片

Android系统Netd、NetworkManagementService网络相关总结_第31张图片

NetworkFactory

ConnectivityService服务是系统中管理,各个类型网络连接,路由配置信息的服务,这部分介绍下NetworkFactory, 每一个具备提供网络服务的对象都需要创建一个NetworkFactory的子类对象,并利用该对象注册自己,以及提供自己的分值

Android系统Netd、NetworkManagementService网络相关总结_第32张图片

Android系统Netd、NetworkManagementService网络相关总结_第33张图片

Android系统Netd、NetworkManagementService网络相关总结_第34张图片

Android系统Netd、NetworkManagementService网络相关总结_第35张图片

Android系统Netd、NetworkManagementService网络相关总结_第36张图片

总结:

这部分流程就是EthernetService创建一个NetworkFactory注册到ConnectivityService,通过AsyncChannel建立ConnectivityService和EthernetService的单向连接, ConnectivityService来管理控制EthernetService的连接和断开

你可能感兴趣的:(Android学习杂记)