Android 14 Telephony 网络选择功能介绍

news2025/3/18 14:44:23

一、总体介绍

(一)功能

手动搜网的流程:用户通过UI触发,调用TelephonyManager的API,比如startNetworkScan,然后这个请求会传递到RIL层,通过AT命令与基带通信,进行网络扫描。结果返回后,经过TelephonyRegistry通知应用层。中间可能涉及IPC,比如Binder通信,因为应用和系统服务运行在不同的进程。

自动搜网的流程:由系统服务如ConnectivityService或NetworkPolicyManager根据网络状态变化(如信号强度变化)触发,调用相应的模块进行评估,比如根据信号强度、优先级策略等选择最佳网络,然后通过RIL层切换网络。可能用到NetworkSelection模块,评估网络质量,计算得分,然后切换。

Note:以上是一般情况。

异常处理:

  • 手动模式超时EVENT_GET_OPERATOR_LIST_COMPLETE未响应时触发onError(Callback.ERROR_TIMEOUT)
  • 自动模式降级策略:当首选PLMN不可用时,按RSSI阈值自动切换至次优网络
  • Modem异常捕获:通过RILReceiver线程监控Socket连接状态

(二)需求

运营商需求:当SIM卡设置中选择了自动搜网,那么在重启开机后要执行一次手动搜网。而手动搜网且驻网失败时会自动切换的自动搜网。

开发方案问题:若基于本身单卡的实现,只搜索卡槽0的,而且写成了单线程,那么就在适配双卡的过程中还需要调整设计模式。那么AOSP双卡搜网逻辑是怎样的呢?或许没有这种开机的需求,就不存在问题。

Note:以下基于 Android 14 源码逻辑分析,不同 Android 版本实现细节可能存在差异。

(三)交互方式

  • 中间件交互方式主要包括Binder、HIDL(HAL 接口定义语言)/AIDL接口,因为Android的框架层和底层服务通过这些IPC机制跨进程通信。
    • 参考文章:使用 binder IPC  |  Android Open Source Project。
    • 从 Android 8 开始,Android 框架和 HAL (Hardware Abstract Layer)现在使用 Binder 互相通信。
    • 由于这种通信方式极大地增加了 Binder 流量,因此 Android 8 包含了几项改进,旨在确保 Binder IPC 的速度。SoC 供应商和原始设备制造商 (OEM) 应直接从 android-4.4、android-4.9 及更高版本内核/通用项目的相关分支进行合并。
    • 使用 Binder IPC

      一直以来,供应商进程都使用 Binder 进程间通信 (IPC) 技术进行通信。在 Android 8 中,/dev/binder 设备节点成为框架进程的专有节点,这意味着供应商进程无法再访问此节点。供应商进程可以访问 /dev/hwbinder,但必须将其 AIDL 接口转为使用 HIDL。对于想要继续在供应商进程之间使用 AIDL 接口的供应商,Android 会按以下方式支持 Binder IPC。 在 Android 10 中,稳定的 AIDL 允许所有进程使用 /dev/binder,同时还力求解决 HIDL 和 /dev/hwbinder 已解决的稳定性保证。如需了解如何使用 Stable AIDL,请参阅适用于 HAL 的 AIDL。

  • 命令方面,RIL层可能使用AT命令
    •  比如AT+COPS用于运营商选择。
  • 传输方式可能通过socket或RILD与modem通信。RIL使用socket与modem通信,而框架层使用Binder。
    • rild:旧版基于Socket,新版逐步转向HIDL(Binder)。Android 8 之前还是socket。
    • netd:核心功能依赖Socket(Netlink + 本地Socket),辅助使用Binder。
    • 是否“属于Socket通信”?架构对比:
      • 传统架构:两者均重度依赖Socket。(RIL.java -> ril.cpp)
      • 现代架构:rild部分功能迁移至Binder(RIL.java -> ril_service.cpp),netd仍以Socket为主。

如下图,Android 8(Orea,包含8.0和8.1)之前Telephony与modem之间使用socket通信,属于RILD;Android 8之后使用HIDL通信。

Telephony和Modem通信方式(Android O 之前旧版)
Telephony和Modem通信方式:socket(Android O 之前旧版)

Telephony和Modem通信方式(Android O 之后新版)
Telephony和Modem通信方式:HIDL(Android O 之后新版)

Note:可以专门一篇文章介绍通信方式的代码变更。

(四)功能相关核心模块

 核心模块
模块/组件 职责 关键类/接口
TelephonyManager 对外API暴露 TelephonyManager.java
ServiceStateTracker 网络状态跟踪 ServiceStateTracker.java
RIL (Radio Interface) 与Modem通信的HAL层 RIL.javaRILRequest.cpp
NetworkPolicyManager 策略管理 NetworkPolicyManagerService
CarrierConfigLoader 加载运营商策略 CarrierConfigManager.java

(五)关键传输协议

  1. AT命令协议

    • 手动搜网:AT+COPS=?(查询运营商列表)
    • 自动选网:AT+COPS=0(启用自动模式)
  2. RIL协议定义

    • 请求类型:RIL_REQUEST_QUERY_AVAILABLE_NETWORKS
    • 异步事件:RIL_UNSOL_NETWORK_STATE_CHANGED
  3. Binder接口
// ITelephony.aidl
interface ITelephony {
    List<NetworkInfo> getAvailableNetworks();
    void setNetworkSelectionModeAutomatic();
}

二、Android设计思想

(一)网络选择 Roadmap

参考文档:网络选择  |  Android Open Source Project(本部分介绍了搭载 Android 12 或更高版本的设备以及搭载 Android 11 及更低版本的设备的网络选择行为。)

对于搭载 Android 12 或更高版本的设备,Android 使用 NetworkScore 类在可用网络之间进行选择。这个类包含制定政策决策所需的许多标志。在语义上,每个标志均表示对网络选择而言非常重要的一个网络属性。

网络代理 (NetworkAgent) 使用 POLICY_TRANSPORT_PRIMARY 标志指明当同一传输中存在多个网络时,相应网络是首选。一个典型的示例就是双 SIM 卡设备,其“设置”中设有一个切换开关,可供用户选择默认使用哪张 SIM 卡。在指定的传输中,Android 倾向于选择带有 POLICY_TRANSPORT_PRIMARY 标志的网络,而不是没有该标志的网络。

网络代理使用 POLICY_EXITING 标志来识别预计很快会断开连接的网络。一个典型的示例就是,当用户走出某个 Wi-Fi 网络的信号范围时,该网络的质量会下降。如果有另一个不带此标志的网络可用,Android 会避免使用带有此标志的网络。每个网络代理都可以确定网络何时会降级到可以被视作退出的状态。

NetworkScore类还允许网络代理(network agent) 使用 KEEP_CONNECTED_FOR_HANDOVER 标志和 NetworkScore.Builder.setKeepConnectedReason 方法声明某个网络会保持畅通。这个 KEEP_CONNECTED_FOR_HANDOVER 标志对潜在的网络很有用,它允许网络代理在次要 Wi-Fi STA 上建立一个网络,而不把它作为主要网络,直到完成网络性能评估为止。如果网络代理未声明此标志,则在代理有机会评估网络性能之前,潜在的网络会因为没有处理任何请求而被断开。

如果两个网络都可以处理指定请求(Note:在Android 11中,以上并且具有相同的数字得分,相应行为暂未定义。),并且从政策的角度来看是等效的,Android 会优先选择当前正在处理该请求的网络。如果没有任何网络在处理请求,Android 会选择其中一个网络。之后,Android 将继续优先选择此网络,直至政策标志发生改变。

网络选择功能的实现位于 AOSP 的 Connectivity 模块中。网络选择的政策逻辑位于 NetworkRanker 类及其辅助类中。这意味着设备制造商无法直接自定义网络选择代码,而必须使用 NetworkScore 中的标志来传达有关网络的必要信息。

Conectiivity 是 Google Mainline的模块,OEM不能修改其内逻辑。

对于搭载 Android 11 或更低版本的设备,Android 会根据通过网络代理 (NetworkAgent) 实现发送的简单整数来执行网络选择。对于每个请求,Android 会选择能够满足请求且得分最高的网络。这个数字得分由网络代理发送的整数加上根据多个条件(如网络是否经过验证或者网络是否是 VPN)给予的额外加分或罚分组成。各个网络代理会相互同步,以便制定政策决策。</

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2317274.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入解析音频编解码器(Audio CODEC):硬件、接口与驱动开发

音频编解码器&#xff08;Audio CODEC&#xff09;是音频处理系统中的核心组件&#xff0c;负责 模拟信号与数字信号的相互转换&#xff0c;广泛应用于 智能音箱、嵌入式系统、消费电子产品 等设备。本篇文章将从 硬件结构、接口解析、驱动开发 和 软件配置 等方面&#xff0c;…

深度学习【迭代梯度下降法求解线性回归】

梯度下降法 梯度下降法是一种常用迭代方法&#xff0c;其目的是让输入向量找到一个合适的迭代方向&#xff0c;使得输出值能达到局部最小值。在拟合线性回归方程时&#xff0c;我们把损失函数视为以参数向量为输入的函数&#xff0c;找到其梯度下降的方向并进行迭代&#xff0…

[Lc14_priority_queue] 最后一块石头重量 | 数据流中的第 K 大元素 | 前K个高频单词 | 数据流的中位数

目录 1.最后一块石头的重量 题解 2.数据流中的第 K 大元素 题解 3.前K个高频单词 题解 代码 ⭕4.数据流的中位数 题解 在C中&#xff0c;使用标准库中的priority_queue&#xff0c;默认情况下它是一个最大堆&#xff08;即大堆排序&#xff09;&#xff0c;这意味着最…

熔断和降级的区别,具体使用场景有哪些?

熔断与降级的核心区别在于触发条件和应用目标&#xff0c;具体差异及使用场景如下&#xff1a; 一、核心区别 对比维度熔断降级触发原因下游依赖服务故障&#xff08;如超时、异常率过高&#xff09;触发系统整体负载过高或流量洪峰管理目标层级框架级保护&#xff08;无业务优…

利用hexo+github部署属于自己的个人博客网站(2025年3月所写)

利用hexogithub部署属于自己的个人博客网站 前情提要&#xff1a;如果你出现了莫名其妙的报错&#xff0c;可能与权限有关&#xff0c;可以以管理员的身份运行git bash或者cmd 本篇博客仅限于利用hexo搭建博客&#xff0c;并且部署到github上面&#xff0c;让自己可以有一个访…

pandas学习笔记(一)——基础知识和应用案例

pandas学习笔记 基础语法参考菜鸟教程&#xff1a;https://www.runoob.com/pandas/pandas-tutorial.html # jupyter import pandas as pd import matplotlib from matplotlib import pyplot as plt import numpy as npmatplotlib.use(TkAgg)data {timestamp: [1, 2, 3, 4, 5…

【AI 大模型】RAG 检索增强生成 ⑤ ( 向量数据库 | 向量数据库 索引结构和搜索算法 | 常见 向量数据库 对比 | 安装并使用 向量数据库 chromadb 案例 )

文章目录 一、向量数据库1、向量数据库引入2、向量数据库简介3、向量数据库 索引结构和搜索算法4、向量数据库 应用场景5、传统数据库 与 向量数据库 对比 二、常见 向量数据库 对比三、向量数据库 案例1、安装 向量数据库 chromadb2、核心要点 解析① 创建数据库实例② 创建数…

解决single cell portal点击下载但跳转的是网页

Single cell RNA-seq of Tmem100-lineage cells in a mouse model of osseointegration - Single Cell Portal 想下载个小鼠数据集&#xff1a; 点击下载跳转为网页&#xff1a; 复制bulk download给的链接无法下载 bulk download给的原链接&#xff1a; curl.exe "http…

基于 Prometheus + Grafana 监控微服务和数据库

以下是基于 Prometheus Grafana 监控微服务和数据库的详细指南&#xff0c;包含架构设计、安装配置及验证步骤&#xff1a; 一、整体架构设计 二、监控微服务 1. 微服务指标暴露 Spring Boot 应用&#xff1a; xml <!-- 添加 Micrometer 依赖 --> <dependency>…

CAN总线的CC帧和FD帧之间如何仲裁

为满足CAN总线日益提高的带宽需求&#xff0c;博世公司于2012年推出CAN FD&#xff08;具有灵活数据速率的CAN&#xff09;标准&#xff0c;国际标准化组织&#xff08;ISO&#xff09;2015年通过ISO 11898-1:2015标准&#xff0c;正式将CAN FD纳入国际标准&#xff0c;以示区别…

SpringBoot 第一课(Ⅲ) 配置类注解

目录 一、PropertySource 二、ImportResource ①SpringConfig &#xff08;Spring框架全注解&#xff09; ②ImportResource注解实现 三、Bean 四、多配置文件 多Profile文件的使用 文件命名约定&#xff1a; 激活Profile&#xff1a; YAML文件支持多文档块&#xff…

Excel(函数篇):COUNTIF与CONUTIFS函数、SUMIF与SUMIFS函数、ROUND函数、MATCH与INDEX函数、混合引用与条件格式

目录 COUNTIF和COUNTIFS函数COUNTIF函数COUNTIFS函数SUMIF和SUMIFS函数SUMIF函数SUMIFS函数SUMIFS函数与控件实现动态年月汇总ROUND、ROUNDUP、ROUNDDOWN函数单元格混合引用条件格式与公式,标记整行数据MATCH和INDEX函数COUNTIF和COUNTIFS函数 COUNTIF函数 统计下“苏州”出现…

虚拟定位 1.2.0.2 | 虚拟定位,上班打卡,校园跑步模拟

Fake Location是一款运行于安卓平台上的功能强大、简单实用的虚拟定位软件。它能够帮助用户自定义位置到地图上的任意地方&#xff0c;以ROOT环境运行不易被检测&#xff0c;同时也支持免ROOT运行。提供路线模拟、步频模拟、WIFI模拟等方式&#xff0c;支持反检测。 大小&…

【最大异或和——可持久化Trie】

题目 代码 #include <bits/stdc.h> using namespace std;const int N 6e510; //注意这里起始有3e5&#xff0c;又可能插入3e5 const int M N * 25;int rt[N], tr[M][2]; //根&#xff0c;trie int idx, cnt, br[M]; //根分配器&#xff0c;点分配器&#xff0c;点的相…

C# WPF编程-启动新窗口

C# WPF编程-启动新窗口 新建窗口&#xff1a; 工程》添加》窗口 命名并添加新的窗口 这里窗口名称为Window1.xaml 启动新窗口 Window1 win1 new Window1(); win1.Show(); // 非模态启动窗口win1.ShowDialog(); // 模态启动窗口 模态窗口&#xff1a;当一个模态窗口被打开时&a…

Python 实现大文件的高并发下载

项目背景 基于一个 scrapy-redis 搭建的分布式系统&#xff0c;所有item都通过重写 pipeline 存储到 redis 的 list 中。这里我通过代码演示如何基于线程池 协程实现对 item 的中文件下载。 Item 结构 目的是为了下载 item 中 attachments 保存的附件内容。 {"crawl_tim…

【最新】 ubuntu24安装 1panel 保姆级教程

系统&#xff1a;ubuntu24.04.1 安装软件 &#xff1a;1panel 第一步&#xff1a;更新系统 sudo apt update sudo apt upgrade 如下图 第二步&#xff1a;安装1panel&#xff0c;运行如下命令 curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o …

c++图论(二)之图的存储图解

在 C 中实现图的存储时&#xff0c;常用的方法包括 邻接矩阵&#xff08;Adjacency Matrix&#xff09;、邻接表&#xff08;Adjacency List&#xff09; 和 边列表&#xff08;Edge List&#xff09;。以下是具体实现方法、优缺点分析及代码示例&#xff1a; 1. 邻接矩阵&…

c++图论(一)之图论的起源和图的概念

C 图论之图论的起源和图的概念 图论&#xff08;Graph Theory&#xff09;是数学和计算机科学中的一个重要分支&#xff0c;其起源可以追溯到 18 世纪 的经典问题。以下是图论的历史背景、核心起源问题及其与基本概念和用途&#xff1a; 借用一下CSDN的图片哈 一、图论的起源&…

ChatGPT and Claude国内使用站点

RawChat kelaode chatgptplus chatopens&#xff08;4.o mini免费&#xff0c;plus收费&#xff09; 网页&#xff1a; 定价&#xff1a; wildcard 网页&#xff1a; 虚拟卡定价&#xff1a; 2233.ai 网页&#xff1a; 定价&#xff1a; MaynorAPI chatgpt cla…