news 2026/10/15 19:48:00

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/10/15 19:34:27

Thinkphp和Laravel基于的农产品预售商城 平台设计_v8557农户_

目录 设计思路技术架构功能模块安全与优化 项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理 设计思路 农产品预售商城平台基于ThinkPHP和Laravel框架开发&#xff0c;旨在连接农户与消费者&#xff0c;实现农产品的直接预售。平台设计围绕农户&am…

作者头像 李华
网站建设 2026/10/12 10:44:27

2026毕设ssm+vue旅游攻略网站系统论文+程序

本系统&#xff08;程序源码&#xff09;带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、选题背景关于旅游信息化管理问题的研究&#xff0c;现有研究主要以传统OTA平台整体架构为主&#xff0c;专门针对基于SSMVue技术栈的轻…

作者头像 李华
网站建设 2026/10/10 21:42:47

23.FPGA设计流程

1.设计准备 进行PCB设计前需要先明确PCB的功能和接口。 设计FPGA项目和设计PCB类似&#xff0c;只是设计对象是一块芯片的内部功能结构。 本质上讲&#xff0c;FPGA的设计&#xff0c;就是IC的设计。 在动手进行代码输入前必须明确IC的功能和对外接口。 2.设计输入 复杂的…

作者头像 李华
网站建设 2026/10/14 13:59:24

深度测评9个AI论文软件,助研究生轻松搞定学术写作!

深度测评9个AI论文软件&#xff0c;助研究生轻松搞定学术写作&#xff01; AI 工具如何重塑学术写作的未来 在当前的学术研究中&#xff0c;论文写作已成为研究生阶段不可或缺的一部分。随着人工智能技术的不断进步&#xff0c;越来越多的 AI 工具开始介入这一领域&#xff0c;…

作者头像 李华
网站建设 2026/10/10 21:45:31

《MYSQL技术内幕:InnoDB存储引擎》| 锁与事务

摘要&#xff1a;本篇聚焦 InnoDB 锁与事务核心机制&#xff0c;系统讲解了各种锁机制&#xff0c;解析脏读、不可重复读等并发问题及应对方案。同时深入剖析事务 ACID 特性的底层实现&#xff08;Redo Log、Undo Log&#xff09;、隔离级别差异。 第六章 锁 6.3 InnoDB 存储引…

作者头像 李华
网站建设 2026/10/15 9:29:45

AI-大语言模型LLM-Transformer架构3-嵌入和位置编码

目的 为避免一学就会、一用就废&#xff0c;这里做下笔记 说明 本文内容紧承前文-Transformer架构1-整体介绍和Transformer架构2-自注意力&#xff0c;欲渐进&#xff0c;请循序本文重点介绍Transformer架构中的嵌入和位置编码&#xff0c;它们在编码器堆栈和解码器堆栈中都…

作者头像 李华