Platform: Rockchip
OS: Android 6.0
Kernel: 3.10.92

Netd: Network Daemon.

负责网络配置,操作,管理,查询等功能.
封装底层各种类型网络,如PPP,SOFTAP等,给framework提供统一接口.
说白了就是接收framework命令往下发,接收kernel命令往上发.

路径: system/netd

[kris@:~/rk3288/system/netd]$ ls
Android.mk  client  include  server
[kris@:~/rk3288/system/netd]$ tree
.
├── Android.mk
├── client
│   ├── Android.mk
│   ├── FwmarkClient.cpp
│   ├── FwmarkClient.h
│   └── NetdClient.cpp
├── include
│   ├── FwmarkCommand.h
│   ├── Fwmark.h
│   ├── NetdClient.h
│   └── Permission.h
└── server
    ├── Android.mk
    ├── BandwidthController.cpp
    ├── BandwidthController.h
    ├── ClatdController.cpp
    ├── ClatdController.h
    ├── CleanSpec.mk
    ├── CommandListener.cpp
    ├── CommandListener.h
    ├── ConnmarkFlags.h
    ├── DnsProxyListener.cpp
    ├── DnsProxyListener.h
    ├── DummyNetwork.cpp
    ├── DummyNetwork.h
    ├── FirewallController.cpp
    ├── FirewallController.h
    ├── FwmarkServer.cpp
    ├── FwmarkServer.h
    ├── IdletimerController.cpp
    ├── IdletimerController.h
    ├── InterfaceController.cpp
    ├── InterfaceController.h
    ├── List.h
    ├── LocalNetwork.cpp
    ├── LocalNetwork.h
    ├── main.cpp
    ├── MDnsSdListener.cpp
    ├── MDnsSdListener.h
    ├── NatController.cpp
    ├── NatController.h
    ├── ndc.c
    ├── NetdCommand.cpp
    ├── NetdCommand.h
    ├── NetdConstants.cpp
    ├── NetdConstants.h
    ├── NetlinkHandler.cpp
    ├── NetlinkHandler.h
    ├── NetlinkManager.cpp
    ├── NetlinkManager.h
    ├── NetworkController.cpp
    ├── NetworkController.h
    ├── Network.cpp
    ├── Network.h
    ├── oem_iptables_hook.cpp
    ├── oem_iptables_hook.h
    ├── PhysicalNetwork.cpp
    ├── PhysicalNetwork.h
    ├── PppController.cpp
    ├── PppController.h
    ├── ResolverController.cpp
    ├── ResolverController.h
    ├── ResponseCode.h
    ├── RouteController.cpp
    ├── RouteController.h
    ├── SoftapController.cpp
    ├── SoftapController.h
    ├── StrictController.cpp
    ├── StrictController.h
    ├── TetherController.cpp
    ├── TetherController.h
    ├── UidRanges.cpp
    ├── UidRanges.h
    ├── VirtualNetwork.cpp
    └── VirtualNetwork.h

3 directories, 72 files

服务启动
system/core/rootdir/init.rc

service netd /system/bin/netdclass mainsocket netd stream 0660 root systemsocket dnsproxyd stream 0660 root inetsocket mdns stream 0660 root systemsocket fwmarkd stream 0660 root inet

创建了4个socket:
netd: 用于framework和kernel命令交互.
dnsproxyd: 用于dns
mdns: 用于网内无dns服务器时的情况
fwmarkd: 对特定的socket设定mark值.

下面代码流程里提到的
CommandListener, DnsproxyListener, MdnsSdListener以及FwmarkServer
这四个类就是对应的上面四个socket, 它们分别用于接收framework的各类信息.

初始化流程
借用网友的一张框图,画得很好,再看代码就很清晰了.

main -> main.cpp

NetlinkManager::Instance -> NetlinkManager.cpp
        new NetlinkManager    //主要接收来自kernel的uevent事件,由NetlinkHandle来完成接收,然后通过CommandListener通知framework.
    new CommandListener ->   //用于和framework交互
        FrameworkListener("netd", true)     -> //父类构造桉树,socket是"netd", 说明和framework通过netd socket来交互了. BTW, vold也使用此方式和framework通信.
            SocketListener ->
                new SocketClientCollection    //创建socket client
         registerCmd(new NatCmd()); ->    //注册各类cmd供framework调用kernel.
            FrameworkListener::registerCmd ->    FrameworkListener.cpp
                mCommands->push_back    //保存到cmd列表中
            new NetworkController    //以下创建各个cmd对应的类,对应各个cmd的实现定义.
            new NatCmd
            ......
    nm->start ->
        NetlinkManager::start ->
            setupSocket    //创建三种类型socket, 分别是NETLINK_KOBJECT_UEVENT, NETLINK_ROUTE以及NETLINK_NFLOG.
                        NETLINK_KOBJECT_UEVENT: 一般用来通知内核某个模块安装或者卸载。
                        NETLINK_ROUTE:网络变化时会触发此消息。
                        NETLINK_NFLOG:带宽预警消息通知。
            socket    //标准创建socket接口方法.
            bind
            new NetlinkHandler    -> NetlinkHandler.cpp
                NetlinkListener ->    
                    SocketListener    
            handler->start ->
                NetlinkHandler::start ->
                    this->startListener ->
                        SocketListener::startListener ->
                            pthread_create ->
                                SocketListener::threadStart ->
                                    me->runListener ->
                                        accept
                                        onDataAvailable    -> 调用各个lister接口,这里是NetlinkListener
                                            uevent_kernel_recv
                                            new NetlinkEvent
                                            evt->decode
                                            onEvent ->
                                                NetlinkHandler::onEvent ->
                                                    notifyInterfaceAdded ->
                                                        mNm->getBroadcaster()->sendBroadcast //通知framework

参考:

http://m.blog.csdn.net/article/details?id=46447641

http://blog.csdn.net/ltm157/article/details/24799351

[RK3288][Android6.0] 网络服务Netd初始化流程小结相关推荐

  1. android开启热点softap模式,[RK3288][Android6.0] Wifi开启热点(SoftAP)流程小结

    Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 在Settings中选择要打开wifi热点功能: 调用流程如下: onPreferenceChan ...

  2. [RK3288][Android6.0] Audio的音量设置流程小结

    Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 说明一: AudioManager提供了两个调节音量接口 adjustSuggestedStrea ...

  3. [RK3288][Android6.0] Skia中的编解码小结

    Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 编解码器注册: SKIA的编解码部分通过一个模板类来实现,这样做的为了实现不同类型的codec兼容 ...

  4. android apk旋转,[RK3288][Android6.0] Apk设置显示旋转过程小结

    Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 setRequestedOrientation -> Activity.java Activ ...

  5. [RK3288][Android6.0] 设置中通过Sensor旋转显示画面小结

    Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 Settings -> Display有个选项控制旋转屏幕时内容是否跟着旋转 这个功能是通过 ...

  6. Android6.0 Reset恢复出厂设置流程分析

    点击Settings应用中的恢复出厂设置按钮后流程分析: 先使用grep命令搜索"恢复出厂设置"字符串,找到相应的布局文件: packages/apps/Settings/res/ ...

  7. [RK3288][Android6.0] 调试笔记 --- WiFi芯片AP6356S添加

    Platform: RK3288 OS: Android 6.0 Kernel: 3.10.92 背景: RK3288 Android6.0平台对AP6356S的支持不是很完善,直接修改wifi ch ...

  8. [RK3288][Android6.0] 调试笔记 --- touch无法获取坐标点

    Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 有网友遇到调试touch的时候能触发中断,但无法获取坐标点 具体可参考文章 [RK3288][An ...

  9. [RK3288][Android6.0] 调试笔记 --- AndroidTool低格无效问题

    Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 现象: 之前文章 [RK3288][Android6.0] 调试笔记 - AndroidTool两 ...

  10. [RK3288][Android6.0] 调试笔记 --- 电池电量一直显示100%

    Platform: Rockchip OS: Android 6.0 Kernel: 3.10.92 之前文章[RK3288][Android6.0] 调试笔记 - 伪电池驱动添加 阐述了如何添加一个 ...

最新文章

  1. pci规划的三个原则_NR PCI规划
  2. Python---udp绑定信息以及网络通信过程
  3. gogs创建项目_容器云平台No.10~通过gogs+drone+kubernetes实现CI/CD
  4. C#语言基础— 输入与输出
  5. Python线程指南 ---转自 http://www.cnblogs.com/huxi/archive/2010/06/26/1765808.html
  6. [蓝桥杯][算法提高VIP]开灯游戏-dfs
  7. 单片机c语言必背代码_最适合单片机编程的高级语言,除了C语言,别无选择!...
  8. Python一题三解:查找总分等于特定值的同学成绩
  9. sendmail接收,转发权限控制文件access配置详解
  10. mysql五:索引原理与慢查询优化
  11. 正则去除汉字和只取数字
  12. 树莓派 —— 树莓派安装字体
  13. 使用win7超级终端连接华为交换机并配置端口镜像
  14. 点成分享 | 麦氏比浊仪在药敏试验中的应用
  15. 解决虚拟机中XYplorer中文件列表不能刷新的问题_我是亲民_新浪博客
  16. 什么是RS-485?
  17. 深度学习在情感分类中的应用
  18. Eclipse正版(官网下载)安装教程及如何在win7或者win10安装配置jdk1.8
  19. AVI视频格式分析-封装格式
  20. 【Kubernetes 企业项目实战】03、基于 Alertmanager 发送报警到多个接收方(下)

热门文章

  1. python 拼音性命按照姓出现的次数排序_Python按姓氏排序字典列表
  2. 环境工程学(整理知识点)
  3. xbee模块和单片机_什么是xbee模块?和zigbee模块有什么区别?
  4. 如何做好一场技术分享(技巧篇)
  5. select完还没释放可以执行其他sql语句吗
  6. go语言中文乱码gbk转UTF8
  7. 502 proxy error解决方法_Homebrew安装、卸载、可能的报错及解决方案_Mac
  8. 分析11年21部漫威电影,一览导演、主演、口碑票房最佳......
  9. 使用Android Studio 创建第一个Android 应用
  10. struts的增删查改