博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[android]netd与NetworkManagementService初印象
阅读量:4692 次
发布时间:2019-06-09

本文共 2598 字,大约阅读时间需要 8 分钟。

[功能]Netd是什么,主要负责什么功能

为什么这次会接触Netd主要是因为在设置防火墙时候碰到了。关于Netd可以干什么可以从Netd的源码中CommandListener中得到答案。按照我的理解,(有疏漏或者错误的请指出),

Netd处理事务采用的是命令设计模式。所以可以查看都负责处理哪些命令功能就一目了然,如下:

[网络摘抄] 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 交互,用于用户进行网络的操控。

 

主线任务暂时只关注跟Firewall有关的FirewallCmd()。

[功能]NetworkManagementService有什么用

(1)       通过socket连接netd

(2)通过observer通知观察者

主要的观察者有ConnectivityService,EthernetNetworkFactory,WifiStateMachine,Vpn,NetworkPolicyManagerService,Nat464Xlat,CommonTimeManagementService等

[socket]NetworkManagementService如何与Netd进行通信?

NetworkManagementService是通过socket与Netd进行通信。

Socket简单沟通如下:

服务端                                                               客户端

1、  创建socket                                              1、创建socket()

2、  Bind()

3、  Listen()

4、  accept()

5、  阻塞并等待连接                                       2、connect()

6、  读取数据(recv)                                           3、写数据(send)

7、  写数据(send)                                             4、读数据(recv)

8、  关闭socket(closeSocket())                           5、关闭socket(closeSocket())

Netd作为内核与android Framework的沟通桥梁,所以Netd会发出两种消息。一种是内核想要上报给android Framework的消息,一种是android Frameworks请求之后返回的消息。

 

这里我们设置防火墙的动作属于后者, Netd是作为服务端,NetworkManagementService作为客户端。

Netd是作为服务端分析

Netd作为守护进程,其在init.rc中申请socket资源,

------init.rc中关于netd的描述-----

service netd /system/bin/netd

    class main

    socket netd stream 0660 root system

    socket dnsproxyd stream 0660 root inet

    socket mdns stream 0660 root system

socket fwmarkd stream 0660 root inet

---------------------------------------------------

CommandListener中获取该socket资源

CommandListener继承于SocketListener,在SocketListener的startListener函数中,将会通过

android_get_control_socket函数在init.rc中取到socket的文件描述符

然后listen, 这里mSock其实是监听socket

 

然后accept, 获取与客户端交流的客户端socket

另外上文讲到的几个数据结构的UML图结构如下,可以看到FrameworkListener和CommandListener负责Framework向Netd发命令处理命令。

NetlinkListener和NetlinkHandler负责向内核向Framework推送信息

FrameworkListener族和NetlinkListener族调用onDataAvailable()接收数据。

在onDataAvailable函数中,FrameworkListener调用dispatchCommand()分发命令,并由子类CommandListener实现的runCommand()处理命令,由sendGenericOkFail()利用客户端socket向android frameworks返回结果。

NetlinkListener调用子类NetlinkHandler实现的onEvent()函数处理kernel上报的消息,并由notify函数利用客户端socket向android framework上报消息。

 

Android framework作为客户端分析

在NetworkManagementService中,使用NativeDaemonConnector负责连接操作,该操作被放到一个线程中执行,并使用CountDownLatch进行同步等待操作。

Create函数传入参数socket(String)是“netd”。

在NativeDaemonConnector(是一个Runnable对象,主要看run函数)中

执行socket.connect进行连接操作,并调用callback对象的onDeamonConnected函数告诉NetworkmanagementService所在的主线程已经连接完毕。

上文所涉及到的几个类的UML图如下,由于viso中没有找到java的类图构建模型使用了C#的。

(版权所有,转载请告知)

转载于:https://www.cnblogs.com/claruarius/p/5771326.html

你可能感兴趣的文章
React Ant design table表单与pagination分页配置
查看>>
重大发现: windows下C++ UI库 UI神器-SOUI(转载)
查看>>
linux 压缩文件的命令总结
查看>>
linux tail 命令详解
查看>>
BZOJ-3207 花神的嘲讽计划Ⅰ
查看>>
BZOJ-1069 [SCOI2007]最大土地面积
查看>>
进程与线程的一个简单解释【摘】
查看>>
COJ976 WZJ的数据结构(负二十四)
查看>>
slid.es – 创建在线幻灯片和演示文稿的最佳途径
查看>>
2016年6月份那些最实用的 jQuery 插件专辑
查看>>
安卓截图
查看>>
如何在数据库中使用索引
查看>>
ring0
查看>>
windows虚拟机下 安装docker 踩过的坑
查看>>
使用 CXF 做 webservice 简单例子
查看>>
2017-2018-1 20155339 《信息安全系统设计基础》第8周学习总结
查看>>
socket.io 消息发送
查看>>
C# 两个datatable中的数据快速比较返回交集或差集
查看>>
没有body怎么添加onload事件
查看>>
JS等比例缩小图片尺寸
查看>>