[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#的。
(版权所有,转载请告知)
[android]netd与NetworkManagementService初印象的更多相关文章
- Vue.js之初印象
一.背景 MVVM模式,很多人在说在用,好吧,我落后了,我目前的项目木有用到MVVM模式的框架,vuejs,reactjs,angularjs,nonono,自己去捣鼓过ng,项目木有用到.实在不敢称 ...
- Django初印象之视图(view)
一.view的初印象 一个视图函数(类),简称视图.我们发起web请求时,返回的web响应.[大家约定成俗将视图放置在项目(project)或应用程序(app)目录中的名为views.py的文件中.] ...
- 初印象至Vue路由
初印象系列为快速了解一门技术的内容,后续会推出本人应用这门技术时发现的一些认识. Vue路由和传统路由的区别: Vue路由主要是用来实现单页面应用内各个组件之间的切换,同样支持传递参数等功能.而传统路 ...
- OpenCL学习笔记(一):摩尔定律,异构计算与OpenCL初印象
欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld. 技术交流QQ群:433250724,欢迎对算法.技术.应用感兴趣的同学加入. 关于摩尔定律: 摩尔定律19 ...
- [强化学习]Part1:强化学习初印象
引入 智能 人工智能 强化学习初印象 强化学习的相关资料 经典书籍推荐:<Reinforcement Learning:An Introduction(强化学习导论)>(强化学习教父Ric ...
- Three 之 Animation 初印象
Animation 初印象 动画效果 播放动画需要基本元素 AnimationMixer 一个对象所有动作的管理者 用于场景中特定对象的动画的播放器.一个对象可能有多个动作,Mixer 是用来管理所有 ...
- android studio 初印象
ANSROID STUDIO sdk 目录 build-tools目录,存放各版本Android的各种编译工具. docs目录,存放开发说明文档. extras\android目录,存放兼容低版本的新 ...
- Android 开发笔记___初级控件之实战__计算器
功能简单,实现并不难,对于初学者可以总和了解初级控件的基本使用. 用到的知识点如下: 线性布局 LinearLayout:整体界面是从上往下的,因此需要垂直方向的linearlayout:下面每行四个 ...
- [置顶]
Retrofit2 初印象?
鄙人由于工作繁忙很久没写博客了还望大家谅解!之前csdn登不上,算了不说借口了,retrofit2相信已经很火了吧,而且上手也比较容易,之前可能大家都是用Volley,Okhttp.Okhttp3其实 ...
随机推荐
- delphi 08 HTML组件
///HTML组件///后面的字符串为这个控件的ID号///直线 Line (WebBrowser1.Document as IHTMLDocument2).exec ...
- cocos2d-x如何优化内存的应用
自身以前也写过cocos2d-x如何优化内存的应用,以及内存不够的情况下怎么样处置惩罚游戏.今天在微博中看到有友好简介了下内存,挺详细的.不晓得是谁写的,我纪录下. 一,IOS与图片内存 在IOS上, ...
- 解决Mac下SublimeLinter的Unsafe Characters警告
Mac下编辑JS文件, 如果是中文字符的行会警告: This character may get silently deleted by one or more browsers. SublimeLi ...
- javascript面向对象学习笔记——创建对象(转)
工厂模式 该模值抽象了创建具体对象de过程.用函数来封装噫特定接口创建对象的细节. function createPerson(name,age,job){ var o=new Object(); o ...
- 实例源码--Android底部功能分类Tab使用实例
下载源码 技术要点: 1.底部功能布局实例 2.TAB使用详细实例 3.详细的源码注释 ...... 详细介绍: 1. 底部功能布局实例 底部功能布局是开发过程中常用到布局,本实例用TAB的方式实现 ...
- JavaWeb中登陆功能
首先我们要JavaWeb登陆的基本流程:JSP页面发送请求-->Servlet-->Servlet通过调用方法从数据库中得到数据并将结果返回页面 我们先建立三个jsp页面,包括login. ...
- 1045 | error connecting to master 'slave_user@192.168.0.75:3306' - retry-time: 6
mysql 主从复制问题整理 问题: 1045 | error connecting to master 'slave_user@192.168.0.75:3306' - retry-t ...
- Class类中getMethods() 与getDeclaredMethods() 方法的区别
一:jdk API中关于两个方法的解释 1:getMethods(),该方法是获取本类以及父类或者父接口中所有的公共方法(public修饰符修饰的) 2:getDeclaredMethods(),该方 ...
- ListView使用自定义适配器的情况下实现适配器的文本和图标控件点击事件执行Activity界面中的方法
ListView使用的是自定义适配器,列表项的布局文件中含有文本和图标,实现文本区域和图标区域的点击事件. 实现思路:在自定义适配器MyArrayAdapter 类型中自定义接口和接口方法,分别设置文 ...
- 使用git ftp发布我个人的hexo博客内容
自己虚拟主机中的博客是由hexo3 + next主题,因为我想将 hexo 编译生成的文件可以通过ftp命令发布到ftp服务器上面. 发布使用的工具是git-ftp: 按照Use Jenkins an ...