news 2026/2/2 16:30:15

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/2 1:07:06

基于Springboot+Vue的林业资源管理系统源码文档部署文档代码讲解等

课题介绍本课题旨在设计并实现一款基于SpringBootVue前后端分离架构的林业资源管理系统&#xff0c;聚焦林业部门日常管控、资源监测、数据统计核心需求&#xff0c;构建集资源档案管理、实时监测、数据分析、权限管控于一体的智能化管理平台。系统采用SpringBoot 2.7.x作为后端…

作者头像 李华
网站建设 2026/1/30 20:02:09

redis源码deps目录

文章目录 fast-floatfpconvhdr_histogramhiredisjemalloclinenoiselua REDIS源码里deps目录是做什么的&#xff1f;从阅读deps目录&#xff0c;我们可以感觉到redis&#xff0c;真的是对性能的追求达到了极致&#xff0c;尽一切可能去优化性能。 deps主要存放的是依赖的第三方库…

作者头像 李华
网站建设 2026/1/29 23:31:37

小程序毕设选题推荐:微信小程序的个人运动健康管理平台基于SpringBoot+Vue的个人运动健康小程序的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/1/29 21:43:10

【Vue知识点总结】API封装全指南:参数类型、场景选择与企业实战

一、API 封装的核心价值 在企业级 Vue 项目中,API 封装不仅是为了代码整洁,更是为了: 统一接口管理:集中维护所有后端接口地址 参数标准化:规范请求/响应数据格式 错误处理:统一拦截异常和状态码 提高复用性:减少重复代码 便于测试:模块化接口更易mock和测试 二、API …

作者头像 李华
网站建设 2026/1/30 18:03:01

全球股市估值与基因治疗的医疗保险政策框架

全球股市估值与基因治疗的医疗保险政策框架 关键词:全球股市估值、基因治疗、医疗保险政策、金融与医疗融合、投资分析 摘要:本文深入探讨了全球股市估值与基因治疗的医疗保险政策框架之间的关系。首先介绍了研究的背景、目的、预期读者等内容。接着阐述了全球股市估值和基因…

作者头像 李华
网站建设 2026/1/29 23:30:16

Claude:开启AI原生应用领域新时代

Claude与AI原生应用&#xff1a;从工具革命到生态重构 关键词 Claude、AI原生应用、Constitutional AI、长上下文处理、生成式AI、prompt工程、安全可控性 摘要 当我们谈论"AI原生应用"时&#xff0c;我们究竟在谈论什么&#xff1f;是将ChatGPT嵌入App的"A…

作者头像 李华