一.应用层及AIDL
1.EthernetManager
1>通过(EthernetManager) context.getSystemService(Context.ETHERNET_SERVICE)获取到EthernetManager
2>IEthernetManager为EthernetServiceImpl.java
EthernetServiceImpl的主要方法如下
//启动 ,SystemServer创建EthernetService时调用,具体来自http://aospxref.com/android-10.0.0_r47/xref/frameworks/base/services/java/com/android/server/SystemServer.java#1368
public void start() {
mTracker = new EthernetTracker(mContext, mHandler);
mTracker.start();
}
public String[] getAvailableInterfaces() throws RemoteException {
return mTracker.getInterfaces(checkUseRestrictedNetworksPermission());
}
public IpConfiguration getConfiguration(String iface) {
return new IpConfiguration(mTracker.getIpConfiguration(iface));
}
public void setConfiguration(String iface, IpConfiguration config) {
mTracker.updateIpConfiguration(iface, new IpConfiguration(config));
}
2.DnsManager
原生只在ConnectivityService中调用
主要方法如下
public PrivateDnsConfig getPrivateDnsConfig() { //获取Global PRIVATE_DNS_DEFAULT_MODE的值
return getPrivateDnsConfig(mContentResolver);
}
public PrivateDnsConfig updatePrivateDns(Network network, PrivateDnsConfig cfg) {
return (cfg != null)
? mPrivateDnsMap.put(network.netId, cfg)
: mPrivateDnsMap.remove(network.netId);
}
public void setDnsConfigurationForNetwork(int netId, LinkProperties lp, boolean isDefaultNetwork) {
updateParametersSettings();
//通过DnsResolver.Stub .asInterface(ServiceManager.getService("dnsresolver"))获取,实现类为DnsResolverService.cpp,对应IDnsResolver
mDnsResolver.setResolverConfiguration(paramsParcel);
if (isDefaultNetwork) setDefaultDnsSystemProperties(lp.getDnsServers()); //设置属性net.dns
flushVmDnsCache();
}
public void removeNetwork(Network network) {
mPrivateDnsMap.remove(network.netId);
mPrivateDnsValidationMap.remove(network.netId);
}
3.IpConnectivityMetrics,对应IIpConnectivityMetrics.aidl
具体由http://aospxref.com/android-10.0.0_r47/xref/frameworks/base/services/java/com/android/server/SystemServer.java#1078启动
主要方法如下
public boolean addNetdEventCallback(int callerType, INetdEventCallback callback) {
return mNetdListener.addNetdEventCallback(callerType, callback); //mNetdListener为NetdEventListenerService,继承INetdEventListener
}
public boolean removeNetdEventCallback(int callerType) {
return mNetdListener.removeNetdEventCallback(callerType);
}
4.ConnectivityService ,继承IConnectivityManager
系统网络连接管理服务,主要处理APP网络监听和请求,通知网络变化;处理WiFi/Telephony/Ethernet等各个链路的网络注册,更新链路信息;网络检测/评分与网络选择
具体由http://aospxref.com/android-10.0.0_r47/xref/frameworks/base/services/java/com/android/server/SystemServer.java#1374创建
由ConnectivityManager进行调用
ConnectivityManager可通过(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);调用
主要方法如下:
//ConnectivityManager
public Network getActiveNetwork() {
return mService.getActiveNetwork();
}
public NetworkInfo getNetworkInfo(int networkType) {
return mService.getNetworkInfo(networkType);
}
public Network[] getAllNetworks() {
return mService.getAllNetworks();
}
public void setAirplaneMode(boolean enable) { //打开关闭飞行模式
mService.setAirplaneMode(enable);
}
public int setUsbTethering(boolean enable) { //设置usb网络共享开关
String pkgName = mContext.getOpPackageName();
return mService.setUsbTethering(enable, pkgName);
}
public void startTethering(int type, boolean showProvisioningUi,//开启usb网络共享
final OnStartTetheringCallback callback) {
startTethering(type, showProvisioningUi, callback, null);
}
public void stopTethering(int type) {
mService.stopTethering(type, pkgName);
}
private INetworkManagementService getNetworkManagementService() {
IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE);
mNMService = INetworkManagementService.Stub.asInterface(b);
return mNMService;
}
}
public void requestNetwork(@NonNull NetworkRequest request,
NetworkCapabilities nc = request.networkCapabilities;
sendRequestForNetwork(nc, networkCallback, timeoutMs, REQUEST, legacyType, cbHandler);
}
//ConnectivityService
private void makeDefault(NetworkAgentInfo newNetwork) { //切换网络,由updateNetworkInfo调用,来自其它模块调用NetworkAgent.java中的sendNetworkInfo发送EVENT_NETWORK_INFO_CHANGED
if (DBG) log("Switching to new default network: " + newNetwork);
try {
mNMS.setDefaultNetId(newNetwork.network.netId);
} catch (Exception e) {
loge("Exception setting default network :" + e);
}
notifyLockdownVpn(newNetwork);
handleApplyDefaultProxy(newNetwork.linkProperties.getHttpProxy());
updateTcpBufferSizes(newNetwork.linkProperties.getTcpBufferSizes());
mDnsManager.setDefaultDnsSystemProperties(newNetwork.linkProperties.getDnsServers());
notifyIfacesChangedForNetworkStats();
// Fix up the NetworkCapabilities of any VPNs that don't specify underlying networks.
updateAllVpnsCapabilities();
}
5.NsdService 继承INsdManager,外部接口类NsdManager
由http://aospxref.com/android-10.0.0_r47/xref/frameworks/base/services/java/com/android/server/SystemServer.java#1387创建
NsdManager可通过 (NsdManager) getContext().getSystemService(Context.NSD_SERVICE)获取,其主要方法如下:
public void resolveService(NsdServiceInfo serviceInfo, ResolveListener listener) {
mAsyncChannel.sendMessage(RESOLVE_SERVICE, 0, key, serviceInfo);
}
public void setEnabled(boolean enabled) { //设置Settings.Global.NSD_ON的值
mService.setEnabled(enabled);
}
6.NetworkPolicyManagerService ,继承INetworkPolicyManager,外部类NetworkPolicyManager
网络策略管理服务,这些策略一般指对APP的网络和限制和放行,通过netfilter来实现
由http://aospxref.com/android-10.0.0_r47/xref/frameworks/base/services/java/com/android/server/SystemServer.java#1316创建
主要方法如下:
public void setUidPolicy(int uid, int policy) {
mService.setUidPolicy(uid, policy);
}
public void setNetworkPolicies(NetworkPolicy[] policies) {
mService.setNetworkPolicies(policies);
}
7.NetworkStatsService 继承INetworkStatsService
这个服务主要收集网络数据,如各个Iface上下行网络流量的字节数等。APP或者其他服务可以通过该服务获取网络流量信息等
由http://aospxref.com/android-10.0.0_r47/xref/frameworks/base/services/java/com/android/server/SystemServer.java#1307创建
可通过INetworkStatsService.Stub.asInterface(ServiceManager.getService(Context.NETWORK_STATS_SERVICE))调用
里面的mNetworkManager为NetworkManagementService
二.framework层分析
1.ConnectivityService
//getActiveNetwork
public Network getActiveNetwork() {
return getActiveNetworkForUidInternal(Binder.getCallingUid(), false);
}
private Network getActiveNetworkForUidInternal(final int uid, boolean ignoreBlocked) {
nai = getDefaultNetwork();
return nai != null ? nai.network : null;
}
private NetworkAgentInfo getDefaultNetwork() {
return getNetworkForRequest(mDefaultRequest.requestId);
}
private NetworkAgentInfo getNetworkForRequest(int requestId) {
synchronized (mNetworkForRequestId) {
return mNetworkForRequestId.get(requestId);
}
}
1.mDefaultRequest.requestId
mDefaultRequest = createDefaultInternetRequestForTransport(-1, NetworkRequest.Type.REQUEST);
return new NetworkRequest(netCap, TYPE_NONE, nextNetworkRequestId(), type); //来自nextNetworkRequestId
private synchronized int nextNetworkRequestId() {
return mNextNetworkRequestId++; //mNextNetworkRequestId最初为1,new NetworkRequest时便会加1
}
2.mNetworkForRequestId
private void setNetworkForRequest(int requestId, NetworkAgentInfo nai) {
synchronized (mNetworkForRequestId) {
mNetworkForRequestId.put(requestId, nai);//保存requestId和NetworkAgentInfo的对应关系
}
}
private void rematchNetworkAndRequests(NetworkAgentInfo newNetwork,
ReapUnvalidatedNetworks reapUnvalidatedNetworks, long now) {
for (NetworkRequestInfo nri : mNetworkRequests.values()) {
setNetworkForRequest(nri.request.requestId, newNetwork); //network为EVENT_NETWORK_INFO_CHANGED传进来的
}
mDefaultRequest = createDefaultInternetRequestForTransport(-1, NetworkRequest.Type.REQUEST);
NetworkRequestInfo defaultNRI = new NetworkRequestInfo(null, mDefaultRequest, new Binder());
mNetworkRequests.put(mDefaultRequest, defaultNRI); //报存NetworkRequest和NetworkRequestInfo的对应关系,NetworkRequest存在requestId
private void handleRegisterNetworkRequest(NetworkRequestInfo nri) {
mNetworkRequests.put(nri.request, nri);
}
<--处理消息EVENT_REGISTER_NETWORK_REQUEST_WITH_INTENT或者EVENT_REGISTER_NETWORK_REQUEST
//getAllNetworks
public Network[] getAllNetworks() {
result[i] = mNetworkForNetId.valueAt(i).network;
}
private void handleRegisterNetworkAgent(NetworkAgentInfo nai, INetworkMonitor networkMonitor) {
mNetworkForNetId.put(nai.network.netId, nai);
}
2.EthernetTracker
主要方法如下
void start() {
mConfigStore.read(); //为EthernetConfigStore
final ArrayMap<String, IpConfiguration> configs = mConfigStore.getIpConfigurations();
for (int i = 0; i < configs.size(); i++) {
mIpConfigurations.put(configs.keyAt(i), configs.valueAt(i));
}
try {
mNMService.registerObserver(new InterfaceObserver());//mNMService为INetworkManagementService,具体实现类NetworkManagementService
}
void updateIpConfiguration(String iface, IpConfiguration ipConfiguration) {
mConfigStore.write(iface, ipConfiguration);
mIpConfigurations.put(iface, ipConfiguration);
mHandler.post(() -> mFactory.updateIpConfiguration(iface, ipConfiguration));
}
String[] getInterfaces(boolean includeRestricted) {
return mFactory.getAvailableInterfaces(includeRestricted);//mFactory为EthernetNetworkFactory
}
3.NetworkManagementService 继承INetworkManagementService
网络管理服务,NetworkManagementService为ConnectivityService和其他Framework中的服务建立了与Netd之间通信的渠道,NetworkPolicyManagerService对各个UID的策略最终都会通过 NetworkManagementService向Netd发送;另外,NetworkManagementService还会监听Netd服务的状态,处理Socket返回的消息
里面的mNetdService为NetdNativeService.cpp
private void connectNativeNetdService() {
mNetdService = mServices.getNetd();//mServices为NetworkManagementService
}
public INetd getNetd() {
return NetdService.get();
}
//NetdService
public static INetd getInstance() {
final INetd netdInstance = INetd.Stub.asInterface(ServiceManager.getService(Context.NETD_SERVICE));
}
public static INetd get(long maxTimeoutMs) {
final INetd netdInstance = getInstance();
}
4.EthernetNetworkFactory
主要方法如下:
private void start() {
mNetworkInfo.setDetailedState(DetailedState.OBTAINING_IPADDR, null, mHwAddress);
mIpClientCallback = new IpClientCallbacksImpl();
IpClientUtil.makeIpClient(mContext, name, mIpClientCallback);//调用NetworkStackClient.makeIpClient
mIpClientCallback.awaitIpClientStart();
provisionIpClient(mIpClient, mIpConfig, sTcpBufferSizes);
}
public void register() {
mMessenger = new Messenger(this);
mSerialNumber = ConnectivityManager.from(mContext).registerNetworkFactory(mMessenger,
LOG_TAG); //LOG_TAG为EthernetNetworkFactory创建时传进,具体为Ethernet
}
public int registerNetworkFactory(Messenger messenger, String name) {
return mService.registerNetworkFactory(messenger, name); //将自己注册到ConnectivityService中
}
//ConnectivityService
public int registerNetworkFactory(Messenger messenger, String name) {
NetworkFactoryInfo nfi = new NetworkFactoryInfo(name, messenger, new AsyncChannel(),
NetworkFactory.SerialNumber.nextSerialNumber());
mHandler.sendMessage(mHandler.obtainMessage(EVENT_REGISTER_NETWORK_FACTORY, nfi));
return nfi.factorySerialNumber;
}
private void handleRegisterNetworkFactory(NetworkFactoryInfo nfi) {
mNetworkFactoryInfos.put(nfi.messenger, nfi);
nfi.asyncChannel.connect(mContext, mTrackerHandler, nfi.messenger);
}