vlambda博客
学习文章列表

Android 以太网框架源码分析启动篇


一 引言

       以太网在各类android设备形态中目前是比较成熟的技术,尤其对于android系统的电视、平板以及机顶盒等都有支持有线网口的预留。最近正好做一个关于Android以太网的需求(后面在Android 系统相关问题和需求的相关文章中会具体介绍这个需求),就顺便研究一下以太网的整体框架和流程。整体流程是很复杂,但是其中有一些细小的知识点还是需要关注的。这里主要基于Along的Android 10来分析。好嘞,话不多说,先看下Android以太网框架设计的代码目录及文件。
  
    
    
  
1frameworks/base/core/java/android/net/
2    ---EthernetManager.java
3    ---IEthernetManager.aidl
4    ---ConnectivityManager.java
5    ---NetworkPolicyManager.java
6    ---NetworkAgent.java
7
8frameworks/opt/net/ethernet/java/com/android/server/ethernet/
9    ---EthernetService.java
10    ---EthernetServiceImpl.java
11    ---EthernetTracker.java
12    ---EthernetNetworkFactory.java
13    ---EthernetConfigStore.java
14
15frameworks/base/services/core/java/com/android/server/
16    ---NetworkManagementService.java
17    ---NativeDaemonConnector.java
18    ---NativeDaemonEvent.java
19    ---ConnectivityService.java
20
21frameworks/base/services/core/java/com/android/server/net/
22    ---NetworkStatsService.java
23    ---NetworkPolicyManagerService.java

二 整体框架简介

       对于Android 以太网架构源码分析,我将从三个角度来分析,以点入面,进而分析整个Android 以太网的框架,整体流程不是很复杂,但是涉及其中的知识点还是比较多的,希望大家和我一块来体验一下Gooole大牛对于以太网架构的实现。
  • 以太网服务(EthernetService)的启动与注册流程;
  • 应用层调用使能ethernet功能的方法流程来分析,从应用层如何将指令一步一步传到底层kernel;
  • 底层kernel如何一步一步上报Uevent(例如网线的插拔等)给framework层实现;
下面我们先从图2-1来了解一下Android 以太网的整体框架结构,了解一下每个主要服务是干啥事情。这样就会为后面的流程分析做一定的准备。
图2-1 Android 以太网的整体框架结构

2.1 Android 以太网框架主要服务及其作用

2.1.1 Android framework层以太网架构主要服务

       根据图2-1所以Android 以太网框架framework层主要涉及6个服务类,我们先基本了解一下这些类的作用。
  • ConnectivityService :ConnectivityService 是系统网络连接的管理服务,同时也是整个Android系统网络的核心。主要处理App对于网络的监听和请求,以及网络变化时候通知App;另外该服务还会处理Wifi/Telephony/Ethernet等各个网络链路的注册,与信息的更新,以及网络评测和网络评分。
  • NetworkPolicyManagerService:NetworkPolicyManagerService是网络策略的管理,主要是对某些App的网络数据限制以及放行等。主要通过App的Uid来限制。
  • NetworkManagementService:NetworkManagementService是网络管理服务。其为ConnectivityService 和其他一些部分Framework  Service建立了与Netd之间的通信通道(Android N以后Framework 与 Netd之间的通信,从socket变为了Binder调用,所以framework 其他一些服务目前也是有能力获取到Netd的client端,从而与Netd进行通信的)。
  • NetworkStatsService:NetworkStatsService主要根据不同的iface收集上下行网络数据,并配合NetworkPolicyManagerService服务对特定的app做网络数据限制及放行。
  • EthernetServiceImp:主要提供接口,供App来设置和更新网络,比如静态IP,以及网络类型等等,真正工作的是EthernetTracker这个类,这个类最终通过NetworkPolicyManagerService来和Netd进行通信。
  • EthernetNetworkFactory:EthernetNetworkFactory是NetworkFactory的子类,从名字可以看出该类是个工厂类。主要功能是通过AsyncChannel接受来自ConnectivityService 的禁止自动连接、网络有效性(NetworkMonitor的网络检测结果)、由于网络不可上网等原因主动断开网络。同时通过NetworkAgent(网络代理,其内部也是AsyncChannel)向ConnectivityService更新网络状态NetworkInfo(断开、连接中、已连接);更新链路配置LinkProperties(本机网口、IP、DNS以及路由信息等);更新网络能力NetworkCapabilities(信号强度、是否收费等)。

2.1.1 Android native 层主要服务类

      根据图2-1所以Android 以太网框架Native层目前从在两套机制,一套是通过Binder调用实现,另外一套是通过socket通信。从Android的版本修改来看,Google更希望使用Binder调用,所以后面Android版本很有可能会将socket通信都换为Binder通信。
  • NetdNativeService:NetdNativeService 是Framework层INetd的server端,提供Framework层访问Netd。NetdNativeService是Netd进程的核心,负责Android 网络管理和控制。通过xxxController将Framework的网络配置和管理指令通过Syscall的方式传递给底层kernel。
  • NetlinkManager:其利用SocketListener的方式监听底层Kernel的Uevent事件,并且通过注册NetdUnsolicitedEventListener方式,将底层Uevent事件上报到Framework层,例如网线的插拔等
  • XXXListener:MDnsSdListener等Listener,主要通过socket监听来自Framework层的指令,以及监听底层的Uevent通过socket上报到framework层。

2.2 Android 以太网Framework层类图关系

图2-2为Android 以太网框架Framework层的类图关系。

图2-2 Android 以太网框架Framework层各类之间的类图关系
  从各类的关系图可以看出,Android以太网核心服务是NetworkManagementService,以及ConnectivityService,前者主要负责与Netd的通信以及网络的管理,后者和几个网络的服务都有联系,监听和通知网络状态以及网络评分等数据。

三 总结

       作为Android 以太网框架源码分析的启动篇,我们主要分析了以太网的整体框架以及各类的之间的关系和作用,下一篇我们将正式开始Android 以太网框架源码分析,首先是以太网服务的启动,尽请期待。