【笔记】Android ServiceStateTracker 网络状态变化逻辑及SPN更新影响

业务简介

在网络状态变化的时候(数据或WiFi),会更新SPN。

基于Android U的代码分析。

分类:SPN Data_Dic-的博客-CSDN博客

功能逻辑

状态说明

  • 飞行模式下注册上WFC的话,注册状态MD上报
    • regState: NOT_REG_MT_NOT_SEARCHING_OP, rat: UNKNOWN
  • DataReg一直都是PowerOff或者out of service状态,此时不会更新spn
    •  [GsmSST0] Broadcasting ServiceState : {mVoiceRegState=3(POWER_OFF), mDataRegState=3(POWER_OFF),
    • updateSpnDisplay: radio is off w/ showPlmn=true plmn=null

更新网络状态 ServiceStateTracker.java

frameworks/opt/telephony/src/java/com/android/internal/telephony/ServiceStateTracker.java

MTKSST实现中handlePollStateResult()和pollStateDone()都会refreshSpn()刷新SPN,区别于源码的 updateSpnDisplay(),并且在上述两个state接口执行时就刷新,时间比 updateSpnDisplay 还早。

代码流程:

  1. handlePollStateResult
  2. pollStateInternal()
  3. pollStateDone()
  4. updateSpnDisplay()--radio off不会更新 

日志分析

03-04 18:31:51.632486  3799  3799 D MTKSST  : [GsmSST0] Broadcasting ServiceState : {mVoiceRegState=0(IN_SERVICE), mDataRegState=0(IN_SERVICE), mChannelNumber=2959, duplexMode()=0, mCellBandwidths=[], mOperatorAlphaLong=Orange SP, mOperatorAlphaShort=Orange SP, isManualNetworkSelection=false(automatic), getRilVoiceRadioTechnology=3(UMTS), getRilDataRadioTechnology=11(HSPA), mCssIndicator=unsupported, mNetworkId=-1, mSystemId=-1, mCdmaRoamingIndicator=-1, mCdmaDefaultRoamingIndicator=-1, mIsEmergencyOnly=false, isUsingCarrierAggregation=false, mArfcnRsrpBoost=0, mNetworkRegistrationInfos=[NetworkRegistrationInfo{ domain=PS transportType=WLAN registrationState=NOT_REG_OR_SEARCHING networkRegistrationState=NOT_REG_OR_SEARCHING roamingType=NOT_ROAMING accessNetworkTechnology=UNKNOWN rejectCause=0 emergencyEnabled=false availableServices=[] cellIdentity=null voiceSpecificInfo=null dataSpecificInfo=android.telephony.DataSpecificRegistrationInfo :{ maxDataCalls = 0 isDcNrRestricted = false isNrAvailable = false isEnDcAvailable = false mLteAttachResultType = 0 mLteAttachExtraInfo = 0 LteVopsSupportInfo :  mVopsSupport = 1 mEmcBearerSupport = 1 } nrState=**** rRplmn=null isUsingCarrierAggregation=false}, NetworkRegistrationInfo{ domain=CS transportType=WWAN registrationState=HOME networkRegistrationState=ROAMING roamingType=NOT_ROAMING accessNetworkTechnology=UMTS rejectCause=0 emergencyEnabled=false availableServices=[VOICE,SMS,VIDEO] cellIdentity=CellIdentityWcdma:{ mLac=1134 mCid=149649449 mPsc=358 mUarfcn=2959 mMcc=214 mMnc=03 mAlphaLong=Orange SP mAlphaShort=Orange SP mAdditionalPlmns={} mCsgInfo=null} voiceSpecificInfo=VoiceSpecificRegistrationInfo { mCssSupported=false mRoamingIndicator=0 mSystemIsInPrl=0 mDefaultRoamingIndicator=0} dataSpecificInfo=null nrState=**** rRplmn=21403 isUsingCarrierAggregation=false}, NetworkRegistrationInfo{ domain=PS transportType=WWAN registrationState=HOME networkRegistrationState=ROAMING roamingType=NOT_ROAMING accessNetworkTechnology=HSPA rejectCause=0 emergencyEnabled=false availableServices=[DATA] cellIdentity=CellIdentityWcdma:{ mLac=1134 mCid=149649449 mPsc=358 mUarfcn=2959 mMcc=214 mMnc=03 mAlphaLong=Orange SP mAlphaShort=Orange SP mAdditionalPlmns={} mCsgInfo=null} voiceSpecificInfo=null dataSpecificInfo=android.telephony.DataSpecificRegistrationInfo :{ maxDataCalls = 16 isDcNrRestricted = false isNrAvailable = false isEnDcAvailable = false mLteAttachResultType = 0 mLteAttachExtraInfo = 0 null } nrState=**** rRplmn=21403 isUsingCarrierAggregation=false}], mNrFrequencyRange=0, mOperatorAlphaLongRaw=Orange, mOperatorAlphaShortRaw=Orange, mIsDataRoamingFromRegistration=true, mIsIwlanPreferred=false}

分段分析:

【SST】NetworkRegistrationInfo
【ServiceStateTracker】NetworkRegistrationInfo

如上三个NetworkRegistrationInfo,包含WLAN和WWAN两种transportType。

关注Emergency Call业务,需要Voice能力,故选取中间的状态进行分析。

  1. registrationState 的值为 HOME ,表示该设备已成功注册到本地运营商的网络,即该设备正在其所属的运营商的服务区域内。
  2. networkRegistrationState 的值为 ROAMING ,表示该设备正在漫游,但是由于accessNetworkTechnology 的值为 UMTS ,即设备使用的是 3G 网络,因此这种情况下也可以视为没有漫游。
  3. roamingType 值为NOT_ROAMING,说明非漫游。

日志:

NetworkRegistrationInfo{ domain=CS transportType=WWAN registrationState=HOME networkRegistrationState=ROAMING roamingType=NOT_ROAMING accessNetworkTechnology=UMTS rejectCause=0 emergencyEnabled=false availableServices=[VOICE,SMS,VIDEO] cellIdentity=CellIdentityWcdma:{ mLac=1134 mCid=149649449 mPsc=358 mUarfcn=2959 mMcc=214 mMnc=03 mAlphaLong=Orange SP mAlphaShort=Orange SP mAdditionalPlmns={} mCsgInfo=null} voiceSpecificInfo=VoiceSpecificRegistrationInfo { mCssSupported=false mRoamingIndicator=0 mSystemIsInPrl=0 mDefaultRoamingIndicator=0} dataSpecificInfo=null nrState=**** rRplmn=21403 isUsingCarrierAggregation=false}, 

专业名词:

  1. RPLMN(Registered Public Land Mobile Network)是指设备所连接的当前注册公共陆地移动网络。
  2. UMTS 是一种全球标准的第三代移动通信技术,可以在全球范围内实现漫游。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot 自定义映射规则resultMap collection一对多

介绍 collection是封装一对多关系的,通常情况下是一个列表,association是一对一,通常情况是一个对象。例如:查询班级下所有的学生,一个班级可以有多个学生,这就是一对多。 案例 有一个学生表&#xff0c…

NineData云原生智能数据管理平台新功能发布|2024年2月版

SQL开发:全功能支持百度云 GaiaDB 介绍:支持通过 SQL 开发所有能力管理 GaiaDB 实例。更多信息,请参见:真香!NineData SQL 开发全面适配 GaiaDB 场景:企业使用 GaiaDB 管理企业数据,需要一个一…

第五篇:组件更新:完整的 DOM diff 流程是怎样的?(下)

下面我们来继续讲解上节课提到的核心 diff 算法。 新子节点数组相对于旧子节点数组的变化,无非是通过更新、删除、添加和移动节点来完成,而核心 diff 算法,就是在已知旧子节点的 DOM 结构、vnode 和新子节点的 vnode 情况下,以较…

Sora核心之一:可变时长、分辨率、尺寸

Overview 一、总览二、摘要三、引言四、方法4.1、架构改动4.2、训练改变4.3、NaViT的效率 NaViT 一、总览 题目: Patch n’ Pack: NaViT, a Vision Transformer for any Aspect Ratio and Resolution 机构:Google DeepMind 论文: https://arxiv.org/pdf/2307.06304…

python72-Python的函数入门,为函数提供文档

之前介绍过可以使用Python内置的help()函数查看其他函数的帮助文档,我们也经常通过help()函数查看指定函数的帮助信息,这对于Python开发者来说非常重要。 我们还可以为函数编写说明文档一只要把一段字符串放在函数声明之后、函数体之前,这段字符串将被作…

LVGL:切换页面

static lv_obj_t *contanier1 NULL; static lv_obj_t *contanier2 NULL;static void win_btn_event_callback(lv_event_t* e) {lv_event_code_t code lv_event_get_code(e);if (code LV_EVENT_CLICKED){lv_obj_t * obj lv_event_get_target(e);//按钮if(lv_obj_get_child(co…

回溯算法03-电话号码的字母组合(Java)

3.电话号码的字母组合 题目描述 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例 1: 输入:d…

#define MODIFY_REG(REG, CLEARMASK, SETMASK)

#define MODIFY_REG(REG, CLEARMASK, SETMASK) WRITE_REG((REG), (((READ_REG(REG)) & (~(CLEARMASK))) | (SETMASK))) 这个宏 MODIFY_REG 是在嵌入式编程中,它用于修改一个寄存器的特定位,而不影响其他位。这个宏接受三个参数&#xff…

onav_rim 复现记录

onav_rim 复现记录 任务复现过程克隆项目,创建环境源码安装habitat-sim从github上安装CLIP环境配置收尾工作数据集下载模型评估其他问题训练训练模型 任务 上次复现one4all失败,但我就是想看看我的电脑能不能做end2end的视觉导航任务。这次看到了《Obje…

Java多线程——信号量Semaphore是啥

目录 引出信号量Semaphore ?Redis冲冲冲——缓存三兄弟:缓存击穿、穿透、雪崩缓存击穿缓存穿透缓存雪崩 总结 引出 Java多线程——信号量Semaphore是啥 信号量Semaphore ? Semaphore 通常我们叫它信号量, 可以用来控制同时访问特…

Java实现布隆过滤器示例

布隆过滤器(Bloom Filter)是一种用于快速检查一个元素是否属于一个集合的数据结构。它基于哈希函数的思想,可以在空间和时间上实现高效的元素判断。 布隆过滤器通常用于解决以下问题: 1.快速查询:布隆过滤器可以在常数…

3. 在Go语言项目中使用Zap日志库

文章目录 一、介绍二、 默认的Go Logger1. 实现Go Logger2. 设置Logger3. 使用Logger4. Logger的运行5. Go Logger的优势和劣势 三、Uber-go Zap1. 为什么选择Uber-go zap2. 安装3. 配置Zap Logger4. 定制logger4.1 将日志写入文件而不是终端4.2 将JSON Encoder更改为普通的Log…

大学四年我从非科班到互联网大厂之路

文章目录 一、两度高考、依然选错?二、初来乍到、陷入囹圄三、破局重生、从头再来四、找实习的坎坷之路五、提前结束实习,开始秋招六、秋招一路凯歌七、写在最后:人生是一场长久的旅途 很久没来CSDN上写过文章了,上一次写已经是20…

pycharm安装pojie2024最新

pojie工具请关注微信公众号“program那些事儿”,回复ideapj,即可获取。 一、下载 官网:https://www.jetbrains.com/pycharm/download/?sectionwindows 点击如图所示,下载pycharm专业版的软件,安装就是一步一步的装&a…

让运维无忧,实战解析巡检报告功能实现方案

随着大数据技术的演进和信息安全性需求的提升,数据规模的持续扩张为数据运维工作带来了严峻考验。面对海量数据所形成的繁重管理压力,运维人员面临效率瓶颈,而不断攀升的人力成本也使得单纯依赖扩充运维团队来解决问题变得不再实际可行。 由…

黄金投资是收益高还是风险高?

黄金作为一种传统的投资工具,长久以来一直受到投资者的青睐。然而,在讨论黄金投资的收益与风险时,必须明确一点:黄金投资既有可能带来较高的收益,同时也伴随不可忽视的风险。 从收益的角度来看,黄金投资的确…

Linux上轻松搞定Docker环境安装

Docker环境安装 是否安装docker # 该命令通过查询Docker服务的状态来检查是否已安装,且是否在正常运行 systemctl status docker下面这种状态就是docker正常运行的状态: 安装yum-utils: yum install ‐y yum‐utils device‐mapper‐per…

手工将一个 llvm IR 汇编代码解析成为 bitcode 文件

1&#xff0c;原始c语言文件 sum.c int sum(int a, int b) {return ab; } 2&#xff0c;编译成为 LLVM-IR 汇编语言 clang sum.c -emit-llvm -S -c -o sum.ll 3&#xff0c;手工把 llvm IR 汇编语言解析成 bitcode 3.1&#xff0c;源码 gen_llvm_ir.cpp #include <ll…

C++初阶:初识C++

目录 1. 前言&#xff1a;C 与 C语言2. C对于C语言语法的完善与补充2.1 命名冲突与命名空间2.1.1 命名空间的定义2.1.2 调用方式 2.3 补充&#xff1a;流的概念2.4 缺省参数2.4.1 缺省参数的使用 2.5 函数重载2.5.1 什么是函数重载2.5.2 函数重载的使用2.5.3 特殊情况&#xff…

蓝桥杯-Set

目录 HashSet类常用方法 1 add(Object obj)方法 2 size() 方法 3 remove(Object obj)方法 4 contains()方法 5 clear() 方法 例题实战 set 一个不允许出现重复的元素&#xff0c;并且无需的集合&#xff0c;主要有HashSet实现类。 在判断重复元素的时候&#xff0c;Set…