背景:需求介入
最近有一个配置iptable的需求,正好梳理了Android12 ip信息配置(Ethernet -> IpClient -> netd)的流程。
术语解读
EthernetService:网络配置服务,处理有线网络连接、配置和管理的组件。
IpClient:是一个用于配置和管理网络接口(包括以太网接口)的组件。它负责与底层网络协议栈交互,完成IP地址分配、路由设置等工作。
Netd:是Android系统中的网络守护进程(Network Daemon),它是Android内核网络子系统与用户空间之间的桥梁。netd主要负责网络接口的管理、网络路由表的维护、防火墙规则的配置、以及IP隧道、端口转发等功能
启动流程解析
万能的SystemServer(startOtherServices)会拉起EthernetService
如图:
EthernetService内部实现 如图:
EthernetServiceImpl.start()实现如下:
可以看到在“EthernetService->EthernetServiceImpl.start()”这一过程中,EthernetServiceImpl没有复杂操作,关键在于EthernetTracker的实例化和start方法的执行。
我们一起来看下EthernetTracker实例化都做了什么 如图:
EthernetTracker实例化主要可以归纳为这几部分:
①获取系统服务(INetworkManagementService)
②获取Netd服务(NetdService)
③从本地的xml中获取IP table配置(config.xml ->config_ethernet_interfaces)
④new EthernetConfigStore
⑤new EthernetNetworkFactory®ister
即:实例化是为了初始化一些必要的对象和初始配置
在EthernetTracker实例化时还对 EthernetNetworkFactory进行了注册。
但实际上,EthernetNetworkFactory中并没有实现register的方法....
怎么办呢?我们可以发现EthernetNetworkFactory是继承自NetworkFactory的
那就去NetworkFactory中看下是否有对应的实现,如图:
好了逮住!
直接看下还有哪个崽种实现了了NetworkFactoryShim 如图:
NetworkFactoryLegacyImpl的注册逻辑如下:
下面我们继续关注EthernetTracker的start()方法 如图:
EthernetTracker.start主要可以归纳为这几部分:
①EthernetConfigStore.read 读取ipconfig.txt的配置信息
②将配置信息载入IpConfiguration中
③INetworkManagementService 注册观察者InterfaceObserver
④Handler执行trackAvailableInterfaces -> 获取INetworkManagementService的ifaces列表,遍历执行maybeTrackInterface()
⑤maybeTrackInterface ->updateIpConfiguration(如果没有ipconfig.txt就不会执行) & addInterface
⑥addInterface -> 通知netd加载对应网卡并获取配置,设置网卡模式
⑦最后会调用updateInterfaceState更新状态
④⑤⑥⑦这部分需要根据代码看下具体实现,不然容易懵逼,对应的代码块我罗列出来,可以仔细研读下。
Handler会执行trackAvailableInterfaces方法 如图:
进而执行maybeTrackInterface 如图:
maybeTrackInterface中则需要关注addInterface 如图:
最终会执行updateInterfaceState方法,最终追朔到 EthernetNetworkFactory的updateInterfaceLinkState方法中
继续往下追朔,会执行到内部类中,即 NetworkInterfaceState中
stop可以理解为清空所有配置(恢复初始化),start是初始化网卡逻辑。
至此,Ethernet这部分的代码就全梳理完了,接下来就是IpClient的代码梳理了~ 敬请期待。