SignalStrength 信号强度架构设计

Android:全面&详细解析andriod10 RSSI,framework篇,相关类:SignalStrength,ServiceStateTracker,TelephonyRegistry 前言 RSSI问题是移动终端常见的异常,例如信号格不刷新,或threshold不符合要求等。由于RSSI涉及较多module,故分析路径较长。 本篇先从framework部分入手。 RSSI上报的层次关系 先整体认识下RSSI上报的层次关系,如下图 ... 阅读详情

description: “SignalStrength 信号强度架构设计——Android 信号格的算数引擎,涵盖 SignalStrength 多 RAT 容器模型、CellSignalStrength 系列类层次、getLevel() 5 级离散化算法、getPrimary() 主 RAT 优先级选择、SignalThresholdInfo 阈值上报机制。”

SignalStrength 是 Android 中负责信号强度测量和量化的核心类。它将 Modem 上报的原始信号物理量(dBm、RSRP、RSSI、SNR 等)转换为用户看得懂的 5 级信号格(0~4 格),同时支持按阈值主动上报——当信号突破特定阈值时才通知上层,避免频繁的 UI 刷新。

在 Multi-RAT 时代,设备可能同时连接 LTE 和 NR (NSA 架构),SignalStrength 需要智能判断"当前以哪个 RAT 的信号强度为准"来更新信号格图标。

设计理念: SignalStrength 的设计核心是"多 RAT 容器 + 主 RAT 决策"。不同无线接入技术测量信号的方式完全不同(GSM 用 RSSI,LTE 用 RSRP,NR 用 SS-RSRP),SignalStrength 将它们统一抽象为 CellSignalStrength* 系列,然后通过 getPrimary() 选择最相关的 RAT 作为当前信号强度来源。

1. 核心职责

  1. 多 RAT 信号存储:同时保存 GSM/WCDMA/TDSCDMA/CDMA/LTE/NR 六种 RAT 的信号强度
  2. 信号级离散化 (getLevel):将原始 dBm 值映射为 0-4 的五级信号格
  3. 主 RAT 确定 (getPrimary):决定当前以哪个 RAT 的信号强度为准
  4. 阈值上报:通过 SignalThresholdInfo 实现"只有突破阈值才通知"的高效机制
  5. 兼容性:支持旧 API (getGsmSignalStrength(), getCdmaDbm() 等) 并桥接到新 API

2. 核心类与源码锚点

  • [SignalStrength.java](file:///d:/Resource%20Android%2016/android-16/frameworks/base/telephony/java/android/telephony/SignalStrength.java):顶层容器,持有 6 个 RAT 的 CellSignalStrength* 实例。
  • [CellSignalStrength.java](file:///d:/Resource%20Android%2016/android-16/frameworks/base/telephony/java/android/telephony/CellSignalStrength.java):抽象基类,定义 getLevel()、getDbm()、getAsuLevel() 等公共接口。
  • [CellSignalStrengthLte.java](file:///d:/Resource%20Android%2016/android-16/frameworks/base/telephony/java/android/telephony/CellSignalStrengthLte.java):LTE 信号强度实现。使用 RSRP/RSSI/RSRQ/SINR。
  • [CellSignalStrengthNr.java](file:///d:/Resource%20Android%2016/android-16/frameworks/base/telephony/java/android/telephony/CellSignalStrengthNr.java):NR (5G) 信号强度实现。使用 SS-RSRP/SS-RSRQ/SS-SINR/CSI-RSRP 等。
  • [CellSignalStrengthGsm.java](file:///d:/Resource%20Android%2016/android-16/frameworks/base/telephony/java/android/telephony/CellSignalStrengthGsm.java):GSM 信号强度实现。使用 RSSI/BER。
  • [CellSignalStrengthWcdma.java](file:///d:/Resource%20Android%2016/android-16/frameworks/base/telephony/java/android/telephony/CellSignalStrengthWcdma.java):WCDMA 信号强度实现。
  • [CellSignalStrengthCdma.java](file:///d:/Resource%20Android%2016/android-16/frameworks/base/telephony/java/android/telephony/CellSignalStrengthCdma.java):CDMA 信号强度实现。同时包含 CDMA 1x 和 EVDO 两种信号。
  • [CellSignalStrengthTdscdma.java](file:///d:/Resource%20Android%2016/android-16/frameworks/base/telephony/java/android/telephony/CellSignalStrengthTdscdma.java):TDSCDMA 信号强度实现。
  • [SignalThresholdInfo.java](file:///d:/Resource%20Android%2016/android-16/frameworks/base/telephony/java/android/telephony/SignalThresholdInfo.java):阈值上报配置。

3. Google 设计技巧深入分析

3.1 多 RAT 容器模型 — 一次性更新所有信号

public class SignalStrength implements Parcelable {
   
   
    CellSignalStrengthCdma mCdma;
    CellSignalStrengthGsm mGsm;
    CellSignalStrengthWcdma mWcdma;
    CellSignalStrengthTdscdma mTdscdma;
    CellSignalStrengthLte mLte;
    CellSignalStrengthNr mNr;
}

Google设计技巧 #1 — "全量更新"信号容器:
每次信号强度变化时,所有 6 个 CellSignalStrength* 实例都通过一个 SignalStrength 对象一起传递。这不是浪费——在多 RAT 连接场景(如 LTE+NR NSA),系统需要同时知道两个 RAT 的信号强度。即使某个 RAT 当前不可用,它也通过 isValid() 返回 false 表示"无有效信号",而不是 null。

3.2 getPrimary() — 主 RAT 优先级选择

private CellSignalStrength getPrimary() {
   
   
    // 优先级:NR > LTE > WCDMA > TDSCDMA > CDMA > GSM
    if (mNr.isValid()) return mNr;
    if (mLte.isValid()) return mLte;
    if (mWcdma.isValid()) return mWcdma;
    if (mTdscdma.isValid()) return mTdscdma;
    if (mCdma.isValid()) return mCdma;
    if (mGsm.isValid()) return mGsm;
    return mLte; // 默认回退
}

Google设计技巧 #2 — 主 RAT 优先级策略:
信号格显示遵循"最新最强"原则——NR (5G) 优先级最高,GSM 最低。这是因为:

  • NR 能提供最大的带宽,信号强度的用户体验最相关
  • 在 NSA (Non-Standalone) 架构中,UE 同时连接 LTE (锚点) 和 NR (数据增强),NR 的信号强度更能反映实际体验
  • mLteAsPrimaryInNrNsa 标志位允许 OEM 配置在 NR NSA 场景下仍以 LTE 信号为主

3.3 getLevel() — 5 级离散化算法

public int getLevel() {
   
   
    CellSignalStrength primary = getPrimary();
    int level = primary.getLevel();
    if (level < 0 || level > 4) level = 0;
    // 在 LTE 作为 NR NSA 锚点时特殊处理
    return level;
}

每个 RAT 的 getLevel() 使用不同的阈值表:

信号级 GSM (asu) LTE (dBm RSRP) NR (dBm SS-RSRP)
0 (NONE) 0 ≤ -140 ≤ -140
1 (POOR) 1-2 -139 ~ -128 -139 ~ -128
2 (MODERATE) 3-6 -127 ~ -118 -127 ~ -118
3 (GOOD) 7-15 -117 ~ -108 -117 ~ -108
4 (GREAT) ≥ 16 ≥ -107 ≥ -107

Google设计技巧 #3 — 各 RAT 独立定义阈值表:
不同 RAT 的信号测量物理意义完全不同(GSM 的 RSSI vs LTE 的 RSRP vs NR 的 SS-RSRP),因此每个 CellSignalStrength* 子类都在自己的 getLevel() 中定义独立的阈值表。这避免了"一刀切"带来的不准确性。例如,LTE 的 RSRP -110 dBm 可能是 GOOD,但 NR 的 SS-RSRP -110 dBm 在 NSA 架构下可能需要重新评估。

3.4 CellSignalStrength — 模板方法模式

public abstract class CellSignalStrength {
   
   
    public abstract int getLevel();
    public abstract int getDbm();
    public abstract int getAsuLevel();
    public abstract void setDefaultValues();
    // 通用常量
    public static final int SIGNAL_STRENGTH_NONE_OR_UNKNOWN = 0;
    public static final int SIGNAL_STRENGTH_POOR = 1;
    public static final int SIGNAL_STRENGTH_MODERATE = 2;
    public static final int SIGNAL_STRENGTH_GOOD = 3;
    public static final int SIGNAL_STRENGTH_GREAT = 4;
}

Google设计技巧 #4 — 抽象基类的模板方法 + 统一常量:
CellSignalStrength 定义抽象方法 getLevel() 和 getDbm(),6 个子类各自实现。但信号强度的 5 级常量(0-4)在基类中统一定义,确保所有 RAT 使用相同的级别系统——App 层看来无论设备接的是 5G 还是 2G,信号格的含义是一致的。

3.5 SignalThresholdInfo — 阈值上报

public class SignalThresholdInfo {
   
   
    // RAN 层级定义阈值,只有穿越阈值时才通知上层
    // 避免每
Android手机得到信号强度信息 Android手机得到信号强度信息本文档讲述如何使用通过Android系统来得到手机信号强度等信息Android手机得到信号强度信息背景介绍 相关调研 查找源码 代码实现 总结背景介绍公司的主题业务是对通信基站的研发,我需要研发一款软件来配合基站的测试工作。通过Android手机连接至基站后,采集手机上的各种和信号强度相关的信息,然后进行分析这些数据,通过分析数据完成对基站的测试相关调研需要测试的参 阅读详情

相关推荐

Android11 LTE信号强度获取 3568

借鉴了其他人的一些方法,但是在中间发现LTE的情况下。使用getDbm()方法是获取不到信号强度的。需要另外一个Rssi。 具体如下,大部分还是借鉴别人的: /** * 获取手机信号强度,需添加权限 android.permission.ACCESS_COARSE_LOCATION <br> * API要求不低于17 <br> * * @return 当前手机主卡信号强度, 单位 dBm(-1是默认值,表示获取失败) */

xiaoyifeishuang1的博客 3576

QGroundControl实现多机控制

前言 作为西安电子科技大学的本科生一名,目前在研究关于无人机导航规划与轨迹控制方面。 目前在跟导师做关于雷达无人机的一个项目,在这里记录一下关于QGC地面站实现多机控制的一些方法。 某些地方写的可能不是很完善,欢迎大家补充。 目前该文章还未写完,后期本人会继续编写 多机控制原理 多机地面站支持TCP,UDP和串口等三种连接方式,首先我们需要对这两种连接方式抽象出一个基类LinkInterface,提供两个虚函数分别对应于数据接受和发送处理,针对于不同的连接方式实现TCP,UDP和串口连接相对应的子类TCPL

Phillweston的博客 8428

全志 T527_Android13 编译 [ 避坑必看 ]

Swap 概念: Linux中Swap(即:交换分区),类似于Windows的虚拟内存,就是当内存不足的时候,把一部分硬盘空间虚拟成内存使用,从而解决内存容量不足的情况。它的功能就是在内存不够的情况下,操作系统先把内存中暂时不用的数据,存到硬盘的交换空间,腾出内存来让别的程序运行。当输入编译命令make -j16 的时候,会有如下提示,这是官方建议通过减少编译线程来解决编译时消耗内存过大的问题。Android 13 系统的编译流程,编译一共分为两部分:内核编译与 Android 编译。

公众号:嵌入式分享 2111

Android 11系统定制:如何彻底隐藏状态栏电池图标(RK3568实测)

本文详细解析了在Android 11系统上如何通过多维度修改实现状态栏电池图标的彻底隐藏,特别针对RK3568平台提供了实战指南。从系统UI架构解析到核心配置文件修改,再到进阶技巧与疑难排查,帮助开发者深度定制Android系统,满足特定场景需求。

weixin_29250573的博客 375

Dify 从入门到精通:第一篇 - 基础介绍与快速上手

Dify是一个开源的低代码平台,旨在简化大型语言模型(LLM)应用的开发流程。本文作为"Dify从入门到精通"系列的首篇,全面介绍了Dify的核心概念、安装步骤和基本使用方法。文章首先解析了Dify的多模型支持、低代码开发等特点,然后详细讲解了基于Docker的安装配置过程,包括系统要求、环境变量设置等。通过创建一个邮件助手应用的实际示例,展示了Dify的可视化工作流设计功能。最后简要介绍了高级特性和最佳实践,为后续深入学习奠定基础。本文为开发者提供了从零开始使用Dify构建AI应用的完

IT深耕十余载,大道之简 1147

Python+whisper/vosk实现语音识别

Whisper 是一个由 OpenAI 开发的人工智能语音识别模型,它能够将语音转换为文本。Whisper 模型特别之处在于它的设计目标是能够理解和转录多种语言的语音,包括但不限于英语。Whisper 模型在训练时使用了大量不同语言的语音数据,这使得它具有很好的跨语言能力。Vosk 是一个开源的语音识别库,它可以在离线环境下工作,不依赖于任何外部服务。Vosk 基于Kaldi语音识别框架,支持多种语言,包括中文。Vosk提供了多种预训练模型,可以根据需求选择适合的模型进行语音识别。

weixin_44458771的博客 5939

基于深度学习的茶叶等级检测识别系统:YOLOv10 + UI界面 + 数据集

YOLOv10是YOLO系列的最新版本,继承了YOLO模型的优点,并对速度和精度进行了优化。YOLOv10在目标检测中使用卷积神经网络(CNN)作为基础,通过改进网络结构和优化训练策略,实现了在更低的延迟下进行高精度的目标检测。本文详细介绍了基于YOLOv10的茶叶等级检测与识别系统的设计与实现过程。我们从数据集准备、模型训练与推理、UI界面设计等多个方面进行了详细讲解,并给出了相应的代码实现。通过本系统,我们可以高效地自动检测茶叶的等级,并通过UI界面直观地展示结果。

YOLO 764

搞定ESD(二):ESD干扰机理分析

大家好,我是记得诚。上文介绍了ESD的基本知识,对ESD的测试标准进行了解析,包括静电发生器的介绍,实验布置要求,静电放电实验的实施及判定等内容。本文主要介绍ESD的干扰机理。

记得诚 4297

[DDR5]DDR5 SDRAM 状态图 和 基本功能

DDR5 SDRAM的读写操作以突发(burst mode)为导向,从选定的位置开始,并按照编程顺序进行16个突发长度或8个“切片”突发长度的操作。从ACTIVATE命令开始,然后是读取或写入命令。

串起点滴 1200

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

上一篇: IMS (IP Multimedia Subsystem) 架构设计
下一篇: Subscription (多卡管理) 架构设计
爆打葡萄汁
博客等级 码龄7年 30粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值