Android 网络请求的选择逻辑(Connectivity Modules)
代码分析
ConnectivityManager
packages/modules/Connectivity/framework/src/android/net/ConnectivityManager.java
许多APN已经弃用,应用层统一用 requestNetwork() 来请求网络。
![[ConnectivityManager]](https://i-blog.csdnimg.cn/direct/4dc7d31e48b445f2ae5f7adaa76b238b.png)
![[ConnectivityManager] requestNetwork()](https://i-blog.csdnimg.cn/direct/9a5c18a651a24ea5a8a9377046493f7d.png)

sendRequestForNetwork
此接口是针对“任何类型网络请求”都会执行的公共逻辑,包括 WiFi、Cellular(蜂窝数据)、以太网、有线、蓝牙等。
只负责请求的注册、回调的挂钩、AIDL通信与系统服务托管,并不区分底层是wifi还是cellular。真正的“分配哪个网络(WiFi还是Cellular)”的事,是在系统服务 ConnectivityService(以及更下游的 NetworkAgent、NetworkFactory)里完成判断和分配的。
NetworkCapabilities need 这个参数规定了请求的网络属性和能力,由 ConnectivityService(system service) 进行分配:
- 指定
TRANSPORT_WIFI
(只想要WiFi网络,NetworkCapabilities.TRANSPORT_WIFI) - 指定
TRANSPORT_CELLULAR
(只想用数据蜂窝,NetworkCapabilities.NET_CAPABILITY_INTERNET) - 可以“都不指定”或者指定多个,系统帮自动选择或监听。
- Android 自 9.0(API 28)起,ConnectivityService/NetworkStack 支持“IP over Bluetooth”(PAN,也叫 Bluetooth tethering 蓝牙网络共享)的情况,可以作为一种网络传输方式存在
- 在
NetworkCapabilities
的定义中,TRANSPORT_BLUETOOTH
已经是一个合法的 Transport 类型。即——如果有蓝牙 PAN 设备连接,Android 会将其当做一种“有能力提供 IP 网络通信”的链路。
- 在
private NetworkRequest sendRequestForNetwork(int asUid, NetworkCapabilities need,NetworkCallback callback, int timeoutMs, NetworkRequest.Type reqType, int legacyType,CallbackHandler handler) {printStackTrace();checkCallbackNotNull(callback);//非默认跟踪请求,如果没指定网络能力(need)就是非法调用。if (reqType !=