news 2026/6/10 13:33:39

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/6/10 11:57:26

Thinkphp和Laravel汽车丢失车辆高速收费管理系统 车联网位置信息管理软件的设计与实现_

目录摘要概述核心功能设计技术实现差异数据安全与扩展性项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理摘要概述 ThinkPHP和Laravel作为主流PHP框架&#xff0c;可用于开发汽车丢失车辆追踪与高速收费管理系统。该系统结合车联网技术&#xff0c…

作者头像 李华
网站建设 2026/6/10 11:58:08

开发常用 宏

1、Rust 标准库 derive 宏与第三方 derive 宏的核心区别 二者本质都是编译期自动生成代码的声明宏&#xff0c;但在依赖来源、功能定位、实现方式、稳定性等核心维度有本质差异&#xff0c;直接决定了使用方式、适用场景和工程依赖成本。 一、核心维度对比表对比维度标准库deri…

作者头像 李华
网站建设 2026/6/10 13:02:54

2026年AI生成PPT工具大洗牌:ChatPPT登顶,职场效率革命已来

2026年AI生成PPT工具大洗牌&#xff1a;ChatPPT登顶&#xff0c;职场效率革命已来 2026年1月25日&#xff0c;某头部互联网公司市场部总监王女士在朋友圈晒出一张截图&#xff1a;用ChatPPT生成的年度营销方案PPT&#xff0c;从输入关键词到完成终稿仅用4分钟&#xff0c;而往年…

作者头像 李华
网站建设 2026/6/10 4:33:33

阿里 AI 三叉戟:千问 3 破局、平头哥单飞、生态超级入口的野心

引言 当 GPT-5.2 和 Gemini 3 Pro 还在科技圈的讨论中占据 C 位时,阿里在 2026 年初甩出的 AI 组合拳,瞬间搅动了全球大模型市场的格局:万亿参数的 Qwen3-Max-Thinking 刷新 19 项权威基准,平头哥启动独立上市进程,千问全面接入阿里生态打造超级入口,甚至把大模型送上太…

作者头像 李华