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

(版權所有,轉載請告知)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM