news 2026/2/25 1:29:06

Android 15网络子系统深度解析(一):ConnectivityService与网络管理框架全解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Android 15网络子系统深度解析(一):ConnectivityService与网络管理框架全解析

引言

网络连接是现代移动设备最核心的功能之一。从打开网页、收发消息,到视频通话、在线游戏,每一个网络操作背后,都有Android网络子系统在默默工作。而ConnectivityService,正是这个庞大系统的"中枢大脑"。

在本系列的第一篇文章中,我们将深入探索:

为什么ConnectivityService如此重要?

想象这样一个场景:你正在用WiFi观看高清视频,突然WiFi信号变弱。Android系统需要在1秒内完成以下复杂操作:

  1. 监测WiFi质量下降- NetworkMonitor持续验证网络
  2. 评估切换时机- NetworkRanker对比WiFi和移动网络得分
  3. 准备移动网络- TelephonyNetworkFactory激活移动数据
  4. 无缝切换- 在不中断视频的情况下迁移连接
  5. 通知应用- 通过NetworkCallback告知网络变更

这一切,都由ConnectivityService协调完成。它就像交通指挥中心,管理着设备上所有网络的"交通"。

本文内容概览

  1. ConnectivityService架构总览

    • 核心职责与设计理念
    • 与其他系统服务的关系
    • Android 15的架构演进
  2. NetworkAgent机制深度解析

    • NetworkAgent生命周期
    • 网络状态上报流程
    • WiFi/Cellular的Agent实现
  3. NetworkFactory工作原理

    • 网络请求匹配机制
    • Factory评分与竞争
    • 按需网络激活
  4. 网络状态管理

    • 9种网络状态详解
    • 状态机转换流程
    • Linger机制
  5. WiFi与移动网络切换

    • 切换决策算法
    • NetworkRanker评分机制
    • 无缝切换实现
  6. 实战:网络问题诊断

    • WiFi连接失败排查
    • 网络切换异常定位
    • 性能优化技巧

让我们开始这段深入Android网络核心的旅程!


一、ConnectivityService架构总览

1.1 ConnectivityService的核心职责

ConnectivityService是Android网络栈的"总管家",负责:

┌────────────────────────────────────────┐ │ ConnectivityService核心职责 │ ├────────────────────────────────────────┤ │ 1. 网络生命周期管理 │ │ - 创建/销毁网络 │ │ - 监控网络状态 │ │ - 处理网络切换 │ │ │ │ 2. 网络请求调度 │ │ - 接收NetworkRequest │ │ - 分发到对应NetworkFactory │ │ - 管理请求优先级 │ │ │ │ 3. 网络能力管理 │ │ - NetworkCapabilities匹配 │ │ - 网络评分(NetworkScore) │ │ - 默认网络选择 │ │ │ │ 4. 网络验证 │ │ - 触发NetworkMonitor验证 │ │ - 处理Captive Portal │ │ - 管理部分连接状态 │ │ │ │ 5. 应用网络权限 │ │ - UID网络访问控制 │ │ - 后台数据限制 │ │ - VPN隧道管理 │ └────────────────────────────────────────┘

1.2 整体架构

架构分层说明

应用层(Application Layer)
// 应用使用ConnectivityManager APIConnectivityManagercm=(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);// 请求网络NetworkRequestrequest=newNetworkRequest.Builder().addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET).addTransportType(NetworkCapabilities.TRANSPORT_WIFI).build();cm.requestNetwork(request,newNetworkCallback(){@OverridepublicvoidonAvailable(Networknetwork){// 网络可用}});
Framework层(ConnectivityService核心)

ConnectivityService源码位置:

packages/modules/Connectivity/service/src/com/android/server/ConnectivityService.java

核心数据结构

// frameworks/.../ConnectivityService.java (精简版)publicclassConnectivityServiceextendsIConnectivityManager.Stub{// 所有NetworkAgent的集合privatefinalHashMap<Messenger,NetworkAgentInfo>mNetworkAgentInfos=newHashMap<>();// 所有NetworkRequest的集合privatefinalSparseArray<NetworkRequestInfo>mNetworkRequests=newSparseArray<>();// 所有NetworkFactory的集合privatefinalArrayList<NetworkFactoryInfo>mNetworkFactoryInfos=newArrayList<>();// 当前默认网络privateNetworkAgentInfomDefaultNetwork;// 网络评分器privatefinalNetworkRankermNetworkRanker;// 权限监控privatefinalPermissionMonitormPermissionMonitor;// 核心方法:注册NetworkAgentpublicvoidregisterNetworkAgent(Messengermessenger,NetworkInfonetworkInfo,LinkPropertieslinkProperties,NetworkCapabilitiesnetworkCapabilities,intcurrentScore,NetworkAgentConfignetworkAgentConfig,intfactorySerialNumber){// 1. 创建NetworkAgentInfofinalNetworkAgentInfonai=newNetworkAgentInfo(messenger,newAsyncChannel(),newNetwork(mNextNetworkId++),networkInfo,linkProperties,networkCapabilities,currentScore,mContext,mHandler,networkAgentConfig,this,mNetd,mDnsResolver,mNMS,factorySerialNumber);// 2. 分配NetIdtry{mNetd.networkCreate(nai.network.netId,NativeNetworkType.PHYSICAL);}catch(Exceptione){loge("Error creating network "+nai.network.netId);return;}// 3. 添加到管理列表mNetworkAgentInfos.put(messenger,nai);// 4. 通知NetworkMonitor开始验证nai.networkMonitor.start();// 5. 匹配NetworkRequestrematchNetworkAndRequests(nai,ReapUnvalidatedNetworks.DONT_REAP);}// 核心方法:处理NetworkRequest@OverridepublicvoidrequestNetwork(NetworkCapabilitiesnc,Messengermessenger,inttimeoutMs,IBinderbinder,intlegacyType,@CallbackFlagsintcallbackFlags){// 1. 权限检查enforceAccessPermission();// 2. 创建NetworkRequestInfofinalNetworkRequestInfonri=newNetworkRequestInfo(messenger,newNetworkRequest(nc,legacyType,nextNetworkRequestId(),NetworkRequest.Type.REQUEST),binder);// 3. 保存请求mNetworkRequests.put(nri.request.requestId,nri);// 4. 发送给所有NetworkFactoryfor(NetworkFactoryInfonfi:mNetworkFactoryInfos){nfi.asyncChannel.sendMessage(android.net.NetworkFactory.CMD_REQUEST_NETWORK,nri.request);}// 5. 尝试匹配现有网络finalNetworkAgentInfobestNetwork=getBestNetwork(nri.request,null);if(bestNetwork!=null){callCallbackForRequest(nri,bestNetwork,ConnectivityManager.CALLBACK_AVAILABLE);}}}

1.3 与其他系统服务的关系

┌──────────────────────────────────────────────┐ │ ConnectivityService │ │ (核心协调者) │ └─────────────┬────────────────────────────────┘ │ ┌─────────┼─────────┬──────────┬──────────┐ │ │ │ │ │ ▼ ▼ ▼ ▼ ▼ ┌────────┐ ┌──────┐ ┌────────┐ ┌──────┐ ┌────────┐ │NetworkStack│Netd │ │Telephony│ WiFi │ │VpnManager │ │ │ │ │Service │ |Service│ │ │ │验证网络 │ │路由 │ │蜂窝网络 │ |无线 │ │VPN隧道 │ │ │ │配置 │ │ │| │ │ │ └────────┘ └──────┘ └────────┘ └──────┘ └────────┘

关键交互

  1. 与NetworkStack交互- 网络验证
// ConnectivityService触发验证nai.networkMonitor.notifyNetworkConnected(nai.linkProperties,nai.networkCapabilities);// NetworkStack执行HTTP探测// 返回验证结果(VALID/PORTAL/INVALID)
  1. 与Netd交互- 路由配置
// 设置默认网络mNetd.networkSetDefault(nai.network.netId);// 添加路由规则mNetd.networkAddRoute(netId,ifname,destination,nexthop);
  1. 与TelephonyService交互- 移动网络
// 请求移动数据连接telephonyNetworkFactory.needNetworkFor(request);// 接收数据连接状态变化onDataConnectionStateChanged(state,networkType);

1.4 Android 15的架构改进

改进1:模块化NetworkStack

Android 10开始,NetworkStack从system_server独立为单独进程:

Android 9及之前: ┌────────────────────────┐ │ system_server │ │ ┌──────────────────┐ │ │ │ConnectivityService│ │ │ │ + NetworkMonitor │ │ ← 验证逻辑耦合 │ └──────────────────┘ │ └────────────────────────┘ Android 10+: ┌────────────────────────┐ ┌──────────────┐ │ system_server │ │NetworkStack │ │ ┌──────────────────┐ │ │ 进程 │ │ │ConnectivityService│◄─────►│┌────────────┐│ │ └──────────────────┘ │ AIDL││NetworkMonitor│ └────────────────────────┘ │└────────────┘│ └──────────────┘ ↑ 可独立更新

好处

  • NetworkStack可通过APK更新,无需OTA
  • 隔离故障,NetworkStack崩溃不影响system_server
  • 更好的安全边界
改进2:eBPF网络策略

Android 15使用eBPF替代iptables:

// kernel BPF程序 - 快速数据包过滤SEC("cgroup/sock")intbpf_cgroup_sock_filter(structbpf_sock*sk){__u32 uid=bpf_get_current_uid_gid();// 查询UID是否允许访问网络structuid_permission_value*value=bpf_map_lookup_elem(&uid_permission_map,&uid);if(value&&value->permission==PERMISSION_DENIED)return0;// 拒绝连接return1;// 允许连接}

性能提升

  • iptables规则匹配:O(n)
  • eBPF哈希查找:O(1)
  • 延迟降低:~100μs → ~10μs
改进3:Multi-Network API增强
// Android 15新增:网络切片(Network Slicing)支持NetworkRequestrequest=newNetworkRequest.Builder().addCapability(NET_CAPABILITY_ENTERPRISE)// 企业专网.setEnterpriseId(NET_ENTERPRISE_ID_1)// 切片ID.build();// 5G网络切片可以为不同业务提供差异化QoS

二、NetworkAgent机制深度解析

2.1 NetworkAgent是什么?

NetworkAgent是网络提供者(如WiFi、Cellular、Ethernet、VPN)与ConnectivityService之间的"信使"。

WiFi底层驱动 ↓ WiFiNetworkAgent (继承NetworkAgent) ↓ Messenger通信 ConnectivityService

2.2 NetworkAgent生命周期

9种核心状态详解

1. DISCONNECTED(断开)
  • 初始状态,NetworkAgent尚未创建
  • 或网络已完全销毁
2. CONNECTING(连接中)
// WiFiNetworkAgent创建时publicclassWiFiNetworkAgentextendsNetworkAgent{publicWiFiNetworkAgent(Contextcontext,...){super(context,looper,
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/19 13:23:21

“多鱼”旧物交易平台的设计与实现(11821)

有需要的同学&#xff0c;源代码和配套文档领取&#xff0c;加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码&#xff08;前后端源代码SQL脚本&#xff09;配套文档&#xff08;LWPPT开题报告&#xff09;远程调试控屏包运行 三、技术介绍 Java…

作者头像 李华
网站建设 2026/2/8 8:52:33

“毛毛宠物店”宠物信息交流平台的设计与实现(11822)

有需要的同学&#xff0c;源代码和配套文档领取&#xff0c;加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码&#xff08;前后端源代码SQL脚本&#xff09;配套文档&#xff08;LWPPT开题报告&#xff09;远程调试控屏包运行 三、技术介绍 Java…

作者头像 李华
网站建设 2026/2/19 23:20:45

U-Net++实践验证——建立基线+性能优化

文章目录 引言 1. 基线模型:稳固的起点 1.1 学习率消融实验 2. 精细化调参:损失函数优化 2.1 损失函数组合策略 2.2 权重调优实验 3. 模型框架优化(修改源代码) 3.1 输入预处理:智能裁剪策略 3.2 输出后处理:无缝融合技术 3.3 损失函数创新:类别敏感加权 4. 结果评估 4.…

作者头像 李华
网站建设 2026/2/19 13:57:37

AutoDL使用教程

文章目录1、注册与充值2、租用实例3、数据传输3.1 软件下载3.2 连接服务器3.3 数据上传和下载4 创建虚拟环境5 程序运行1、注册与充值 登录网址&#xff1a;https://www.autodl.com/home注册账号充值 2、租用实例 选择计费规则&#xff1b;选择要租用的GPU数量&#xff1b;是…

作者头像 李华
网站建设 2026/2/24 7:10:44

Thinkphp和Laravel高校学生健康饮食食堂菜品推荐预订系统_02187_

目录 系统概述技术架构核心功能应用价值创新点 项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理 系统概述 Thinkphp和Laravel高校学生健康饮食食堂菜品推荐预订系统&#xff08;编号02187&#xff09;是一个基于PHP框架开发的校园餐饮管理平台&am…

作者头像 李华