Android以太网架构分析(Java层)
基础认知
什么是以太网(来自ChatGPT的解释)
以太网是一种常见的局域网(LAN)技术,用于在计算机网络中传输数据。它是基于以太网协议套件(Ethernet Protocol Suite)的一种标准,其中包括物理层、数据链路层和网络层协议。
以下是以太网的一些关键概念:
-
物理层:以太网使用双绞线、同轴电缆或光纤等物理媒介来传输数据。常见的以太网物理标准包括10BASE-T、100BASE-TX和1000BASE-T。这些标准规定了电缆类型、连接器和传输速率等细节。
-
数据链路层:以太网使用MAC(媒体访问控制)地址来唯一标识网络中的每个设备。数据链路层采用帧(Frame)结构来封装数据,并在不同设备之间进行传输。以太网的帧结构包括目标MAC地址、源MAC地址、类型字段和数据字段。数据链路层还使用CSMA/CD(载波监听多路访问/碰撞检测)协议来协调设备之间的数据传输,以防止冲突。
-
网络层:以太网并不是一个网络协议,而是一个提供通信基础的技术。因此,在以太网上,可以运行多种网络协议,如IP(Internet Protocol)、ARP(Address Resolution Protocol)和ICMP(Internet Control Message Protocol)等。网络层决定了数据通过以太网传输时如何被路由。
Android中的以太网
在Android中,Linux内核负责处理底层网络功能,包括网络协议、套接字(socket)接口和网络设备驱动程序等。它提供了与以太网相关的驱动程序,用于管理物理以太网适配器并处理数据的传输。Android在Linux内核之上构建了高级网络框架和服务,以提供更方便的网络功能。这包括网络管理器(Network Manager)和连接管理器(Connectivity Manager),用于管理不同类型的网络连接,包括以太网。Android还提供了API接口,允许应用程序访问和控制以太网连接,以及进行数据传输和网络通信。
Android Ethernet框架的核心类
EthernetManager
EthernetManager是Android系统提供的Ethernet应用层管理类,提供了IP信息配置和Ethernet iface查询接口。
EthernetService和EthernetServiceImpl
- EthernetService的内容很少,主要是初始化了EthernetServiceImpl这个类然后调用其start方法。
- EthernetServiceImpl继承了IEthernetManager接口,是EthernetManager对应系统服务的实现类。从功能的角度来看,EthernetServiceImpl也是一层壳,它的主要任务是做权限检测,剩下的交给EthernetTracker进行处理。
EthernetTracker
Tracker的意思是“追踪者”。EthernetTracker,顾名思义,以太网追踪器。下面是Android源码给EthernetTracker的类注释:
/**
* Tracks Ethernet interfaces and manages interface configurations.
*
* <p>Interfaces may have different {@link android.net.NetworkCapabilities}. This mapping is defined
* in {@code config_ethernet_interfaces}. Notably, some interfaces could be marked as restricted by
* not specifying {@link android.net.NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED} flag.
* Interfaces could have associated {@link android.net.IpConfiguration}.
* Ethernet Interfaces may be present at boot time or appear after boot (e.g., for Ethernet adapters
* connected over USB). This class supports multiple interfaces. When an interface appears on the
* system (or is present at boot time) this class will start tracking it and bring it up. Only
* interfaces whose names match the {@code config_ethernet_iface_regex} regular expression are
* tracked.
*
* <p>All public or package private methods must be thread-safe unless stated otherwise.
*/
注释指明了EthernetTracker的核心功能:跟踪以太网接口并管理接口配置。Ethernet接口可能在启动时出现,也可能在启动后出现(例如,对于通过USB连接的以太网适配器)。此类支持多个接口。当一个接口出现在系统上(或在启动时存在)时,此类将开始跟踪它并将其启用。只有其名称与config_ethernet_iface_regex(eth\\d)正则表达式匹配的接口才会被跟踪。
EthernetTracker使用了NetworkManagementService、EthernetNetworkFactory、EthernetConfigStore这几个类。
NetworkManagementService
NetworkManagementService类提供了一系列方法来管理网络连接和配置。NetworkManagementService会和netd进行交互,这里不做具体介绍。EthernetTracker向NetworkManagementService查询当前可用的网络接口,并注册网络接口添加和移除的回调,在源码中还存在一个setInterfaceUp调用拉起相应接口。
EthernetNetworkFactory
EthernetNetworkFactory继承了NetworkFactory。要理解EthernetNetworkFactory,首先要知道NetworkFactory是用来干什么的,下面是NetworkFactory的类注释
/**
* A NetworkFactory is an entity that creates NetworkAgent objects.
* The bearers register with ConnectivityService using {@link #register} and
* their factory will start receiving scored NetworkRequests. NetworkRequests
* can be filtered 3 ways: by NetworkCapabilities, by score and more complexly by
* overridden function. All of these can be dynamic - changing NetworkCapabilities
* or score forces re-evaluation of all current requests.
*
* If any requests pass the filter some overrideable functions will be called.
* If the bearer only cares about very simple start/stopNetwork callbacks, those
* functions can be overridden. If the bearer needs more interaction, it can
* override addNetworkRequest and removeNetworkRequest which will give it each
* request that passes their current filters.
**/
NetworkFactory 是一个创建 NetworkAgent 对象的实体。NetworkFactory的持有者使用 {@link #register} 向 ConnectivityService 注册,然后工厂将开始接收得分的 NetworkRequest。NetworkRequest 可以通过以下3种方式进行过滤:根据 NetworkCapabilities 进行过滤、根据得分进行过滤,以及通过重写函数进行更复杂的过滤。所有这些都可以是动态的——更改 NetworkCapabilities 或得分会强制重新评估所有当前的请求。如果有任何请求通过了过滤器,则会调用一些可重写的函数。如果持有者只关心非常简单的 start/stopNetwork 回调,那么可以重写这些函数。如果承载者需要更多的交互,则可以重写 addNetworkRequest 和 removeNetworkRequest,这将为它提供每个通过其当前过滤器的请求。
EthernetNetworkFactory作为NetworkFactory的实现类,直接拥有了上述功能,但重写了其中的acceptRequest、needNetworkFor和releaseNetworkFor。除了创建NetworkAgent,EthernetNetworkFactory还是使用了IpClient进行IP的配置。
NetworkAgent
一个用于特定持有者代码和ConnectivityService之间通信的实用类。 NetworkAgent管理网络的生命周期。
IpClient
IpClient提供了接口,用于 IP 层的配置和维护功能,可以被 Wi-Fi、以太网等传输层使用。IpClient 的设计是,一旦接口名称已知,即可实例化,并且可以与包含它的类具有相同的生命周期(即将其声明为 “private final” 是可以的)。
EthernetConfigStore
EthernetConfigStore提供了API配置存储和管理以太网配置(/data/misc/ethernet/ipconfig.txt)
应用设置IP的流程
了解了上面这些类的作用,分析设置以太网IP的流程就比较简单了。