[android]netd与NetworkManagementService初印象

[功能]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#的。

时间: 2024-10-17 00:56:33

[android]netd与NetworkManagementService初印象的相关文章

OpenCL学习笔记(一):摩尔定律、异构计算与OpenCL初印象

关于摩尔定律: 摩尔定律1965年提出,晶体管密度是按照每年翻倍发展的,之后的趋势也是这样--每一代芯片的的时钟频率提高50%,而同时工艺节点减小了0.3,功耗密度翻倍(保持功耗相同的情况下,面积0.7*0.7=0.49,因此提高频率使得性能提升了):而在2000年中期之后,出现了物理尺寸更小的器件,意味着,我们没有办法保持功耗密度不变,而同时提高频率,结果我们看到自此之后,时钟频率并没有显著提高,需要通过并行来提高性能,所以多核CPU流行起来.即使是最基本的处理器,超标量和无序指令执行等高级体

Android的Service的初接触

刚刚看了一点与Service相关的书籍,做做笔记,希望也能帮到有需要的人. 首先,开发Service和Activity差不多,也是需要两个步骤: 一.定义一个继承Service的子类 二.在AndroidManifest.xml文件中配置该Service Service的生命周期方法如下: 1.abstract IBinder onBind(Intent intent):该方法是Service子类必须实现的方法.该方法返回一个IBinder对象,应用程序可以通过该对象与Service组件通讯 2

初印象至Vue路由

初印象系列为快速了解一门技术的内容,后续会推出本人应用这门技术时发现的一些认识. Vue路由和传统路由的区别: Vue路由主要是用来实现单页面应用内各个组件之间的切换,同样支持传递参数等功能.而传统路由使用超链接 以下内容来自官网,js使用ES6 如何在vue项目中使用vue-router HTML <script src="https://unpkg.com/vue/dist/vue.js"></script> <script src="htt

Vue.js之初印象

一.背景 MVVM模式,很多人在说在用,好吧,我落后了,我目前的项目木有用到MVVM模式的框架,vuejs,reactjs,angularjs,nonono,自己去捣鼓过ng,项目木有用到.实在不敢称自己是front-end developer.趁这个失业期,vuejs的学习起哟. 二.简介 1.vue.js是什么 Vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的.相比于Angular.js,Vue.js提供了更加简洁.更易于理解的API,使得我们

uml时序图的初印象-------Day64

最近有好多想法迫不及待的想去实现,可是事实上是在那些最开始想的非常明白,感觉会没问题的地方也总是会出现问题,导致略微有些急躁,还是要淡定啊,又到了周末,明后天要收拾东西搬家,不知道宽带能不能顺利的给挪过去,想提前来记录下这周的工作吧. 总的来说,这周完成了界面的初始设计,然后就是这概要设计了,结果整合下来,word文档都有近百页了,太多时序图了,画的我都有些头昏脑涨.其实,在很久之前的某公司,我面试的第一道问题就是时序图,结果当时的我是可怜的一片茫然,结果也就自然而然了.这次再看时序图,又理解了

gulp初印象

几个月前三木君向我推荐过gulp,到现在因为工作需要才接触到它,真的很惭愧,在此记录下对gulp的初印象. 全局安装: $ npm install –global gulp 一个gulpfile.js文件: 这个文件需要在项目的根目录下创建.默认任务(什么也不做): var gulp = require('gulp'); gulp.task('default', function() { // place code for your default task here }); 下面的命令将执行这

Django初印象之视图(view)

一.view的初印象 一个视图函数(类),简称视图.我们发起web请求时,返回的web响应.[大家约定成俗将视图放置在项目(project)或应用程序(app)目录中的名为views.py的文件中.] 二.普通view的样子 下面是一个以HTML文档的形式返回当前日期和时间的视图: from django.http import HttpResponse import datetime def current_datetime(request): now = datetime.datetime.

Android 开发笔记___初级控件之实战__计算器

功能简单,实现并不难,对于初学者可以总和了解初级控件的基本使用. 用到的知识点如下: 线性布局 LinearLayout:整体界面是从上往下的,因此需要垂直方向的linearlayout:下面每行四个按钮,需要水平的linearlayout. 滚动视图 ScrollView    :虽然界面不宽也不高,以防万一,有可能会遇到屏幕特别小的手机,因此用一个垂直方向的scrollview. 文本视图 TextView      :上面标题就是一个textview,结果显示也是textview,但是更高

Retrofit2 初印象

鄙人由于工作繁忙很久没写博客了还望大家谅解!之前csdn登不上,算了不说借口了,retrofit2相信已经很火了吧,而且上手也比较容易,之前可能大家都是用Volley,Okhttp.Okhttp3其实大同小异,最近由于项目需要,之前大家相信很多人在用鸿神的okhttpUitl工具类,其实鸿神也写过一篇关于Retrofit2的文章感兴趣的童鞋异移步到这里这么晚还开车真是不容易啊!没办法自己太菜了!我去! 注解 retrofit通过使用注解来简化请求,大体分为以下几类: 1.用于标注请求方式的注解