文章目录

  • 1. SIM 卡加载流程(基于 Android O)
    • 1.1 主要流程
    • 1.2 需注意的细节
  • 2. 运营商名称显示流程
    • 2.1 主要流程
    • 2.2 需注意的细节

1. SIM 卡加载流程(基于 Android O)

1.1 主要流程

  1. SIM 框架的中心类为 UiccController,在该类的注释中完整标注了SIM 框架的组成

  2. UiccController 会在RILJ中注册监听事件,一旦RILJ收到modem消息,进而 notify 监听,则SIM卡加载流程就开始了

  3. UiccController 收到 SIM卡状态变化的消息后会通过 RILJ 主动去获取SIM卡信息, 成功拿到响应后则触发新建 UiccCard 的操作,同时也会在 IccCardProxy 中注册对 UiccCardApplication 状态和 IccRecords 状态的监听。这样在 步骤5 之后,便可以执行上层的更新操作

  4. UiccCard 是一张 SIM卡的抽象,其中主要包含了两个部分,一个是UiccCardApplication,另一部分是IccRecords:

    • UiccCardApplication 是SIM卡中的应用,一般一张卡里有多个application,比如CSIM,USIM,ISIM等等。SIM对应的IMS业务相关用户信息、鉴权信息等存在ISIM application里, UMTS,LTE等鉴权信息在USIM application里, CDMA的鉴权信息则在CSIM application里。
    • IccRecords 是 SIM卡中存储的信息的封装容器,需要借助专门的 IccFileHandler 以 SIM I/O 的方式从SIM卡中读取出来,存储到IccRecords中。
  5. SIM 卡中存储的信息都通过 IccFileHandler 加载存储到了IccRecords中,则认为SIM卡已经加载完成了

  6. IccCardProxy 监听到了 UiccCardApplication 和 IccRecords 就绪的状态,则发出广播,将相关信息通知到 SubscriptionInfoUpdater,由其完成 siminfo 数据库更新等操作

  7. SubscriptionInfoUpdater 主要更新数据库信息,更新call,data,sim等相关偏好设置,同时设置加载的sim卡的网络偏好设置,之后再将 SIM 状态变化的消息广播出去

1.2 需注意的细节

  • 在Android P 之后, IccCardProxy已经被移除,也就是说在 P 之后监听 UiccCardApplication 和 IccRecords 加载状态从而确定 SIM卡状态的逻辑已经修改。从代码来看,是移动到了 P 上新增加的 UiccProfile 中
  • Android P 之后 SIM卡框架也有很大变化,新增了 UiccSlot 来抽象一个卡槽,UiccSlot 中又有 UiccCard 和 UiccProfile,具体变化可从 UiccController 注释信息中查到
  • UiccCardApplication 数量最多为 8 个,但是国内的SIM卡通常不会写入这么多sim卡应用程序,最多会写有 3 个

2. 运营商名称显示流程

2.1 主要流程

  1. 运营商名称的来源主要有两个,一个是写在 SIM卡中的 SPN,另一个是从网络侧拿到的 PLMN
  2. SPN 写在SIM卡中,SIM卡加载时期会将其存在 TelephonyManager 的系统属性中,另外如果有相关定制也可以将 SIM 卡中的 SPN 覆盖掉,比如虚拟运营商的 SPN 就需要做这个处理
  3. 通常在 ServiceStateTracker 中监听到 SIM 卡 READY 的状态后会调用 RILJ 的方法去主动 获取当前驻留网络的PLMN
  4. 拿到之后将其封装在 ServiceState 对象中,之后根据新旧状态的对比确定运营商名称是否有变化。另外即便有变化也需要根据当前的服务状态来确定显示的字符串,如果服务状态正常则需要读取 SIM卡中运营商名称的显示规则来决定显示的字符串,之后将其广播出去
显示规则主要根据 SIM卡中两个bit位数据来确定,通常在log中会有打印,关键字应该是displaycondition。
1--只显示spn,2--只显示plmn,3--显示spn-plmn1.名称可以为SPN或PLMN2、如果没有SPN文件,那么就显示PLMN3、若有SPN,并且注册的PLMN是HPLMN或者注册的PLMN在SIM卡文件EF_SPDI中,那么:(1)如果有SPN就要显示SPN(2)如果SPN的bit1 = 1, 则需要同时显示PLMN,如果SPN的bit1=0,则不需要同时显示PLMN4、若有SPN,注册的PLMN是Roaming PLMN且注册的PLMN也不在SIM卡文件EF_SPDI中,那么(1)显示PLMN(2)如果SPN的bit2=0,则需要同时显示SPN,如果SPN的bit2=1,则不需要同时显示SPN
  1. SubscriptionController 会接收广播,然后将接收到的字符串写入到 数据库 siminfo 表,并通知监听者运营商名称已经改变了

2.2 需注意的细节

  • 通常 SPN 来自sim卡,但是对于虚拟运营商而言需要定制SPN显示,则需要修改 CarrierConfig 文件来达到目的。虚拟运营商的匹配规则也是根据 SIM卡中存储的数据来匹配的,一般分为以下四类

    SPN,GID,PNN,ICCID
    
  • ServiceStateTracker 是服务状态的中心类,其工作机制具有原子性,即只有当所有请求的数据都收到回应后才会 pollState,该机制通过一个计数变量实现

  • Android P 之后该部分变化较多,主要是将 SPN 覆盖的逻辑移动到了 UiccProfile中,另外也有其他的变化,此处不一一列明

Android SIM 主要流程相关推荐

  1. Android手机启动流程与TEE OS

    2019独角兽企业重金招聘Python工程师标准>>> 转载:https://cloud.tencent.com/developer/article/1043659 一个移植了TEE ...

  2. Android View 测量流程(Measure)完全解析

    前言 上一篇文章,笔者主要讲述了DecorView以及ViewRootImpl相关的作用,这里回顾一下上一章所说的内容:DecorView是视图的顶级View,我们添加的布局文件是它的一个子布局,而V ...

  3. android activity启动流程_1307页!一线大厂Android面试全套真题解析!

    /   前言   / 金九银十到了,很多读者都反映有面试的需求,所以我特地给大家准备了一点资料! 下面的题目都是大家在面试一线互联网大厂时经常遇到的面试真题和答案解析,如果大家还有其他好的题目或者好的 ...

  4. 【Android 逆向】加壳的 Android 应用启动流程 | 使用反射替换 LoadedApk 中的类加载器流程

    文章目录 一.加壳的 Android 应用启动流程 二.使用反射替换 LoadedApk 中的类加载器流程 一.加壳的 Android 应用启动流程 加壳的 Android 应用启动流程 : 加壳的 ...

  5. 【Android 逆向】Android 进程简介 ( Android 应用启动流程 )

    文章目录 前言 一.Android 进程 二.Android 应用启动流程 前言 参考 [Android 逆向]Android 系统文件分析 ( /proc/pid 进程号对应进程目录 | oom_a ...

  6. 结合源码深入理解Android Crash处理流程

    应用程序crash在开发过程中还是很常见的,本文主要是从源码的角度去跟踪下Android对于crash的处理流程.App crash的全称:Application crash.而Crash又分为:na ...

  7. Android Camera(5)---Android Camera调用流程

    Android Camera调用流程 http://blog.csdn.net/lushengchu_luis/article/details/11033095 1.Packages/apps/到fr ...

  8. android关机充电流程、充电画面显示

    一.Android正常开机流程.关机充电流程 在写这篇文章之前我们先看两个流程:正常开机流程,关机充电系统启动流程 1.正常开机流程,按开机键. 可大致分成三部分 (1).OS_level:UBOOT ...

  9. Android SDCard UnMounted 流程分析(三)

    前篇地址 Android SDCard UnMounted 流程分析(一) Android SDCard UnMounted 流程分析(二) 前一篇讲到SDCard unmout onEvent 发送 ...

最新文章

  1. 会刷编程竞赛题的AlphaCode来了!
  2. WSL:WSL(Windows Subsystem for Linux)的简介、安装、使用方法之详细攻略
  3. 一加手机怎么root权限_怎么才能彻底卸载掉Magisk面具root权限,回到官方系统
  4. 【Python】二维数组,使用 * 号来进行重复,导致结果不符合预期
  5. Linux重定向指令
  6. k8s灰度更新_k8s slb如何实现灰度发布-问答-阿里云开发者社区-阿里云
  7. 2019.01.24【NOIP普及组】模拟赛C组
  8. 所有OSGi套件的通用CXF请求拦截器
  9. win8桌面显示开始菜单教程
  10. Spring Boot Logback 配置详解
  11. 软件测试 学习之路 Linux基础命令 (一)
  12. ejb 属于哪一层,作用是什么,什么时候用
  13. Linux内核基础--事件通知链(notifier chain)
  14. unity常用的引用赋值一个GameObject的三种方法
  15. php mysql统计去掉重复的,php - Mysql:根据最小数量删除重复记录 - 堆栈内存溢出...
  16. web浏览器数据本地存储
  17. javascript清理IE内存
  18. 颈椎病的症状,Pyhton结合治疗仪让治疗与众不同
  19. 个人管理:“唐僧”之五项修炼
  20. 树莓派开机不加载桌面全屏启动chromium浏览器

热门文章

  1. 2021年全国职业院校技能大赛 “大数据技术与应用”—模拟赛题(三)
  2. ubuntu服务器搭建静态网站
  3. 解决 IE下ajaxfileupload不兼容的问题
  4. 什么软件测试iphone性能,iPhone浏览器性能测试
  5. okv5 API常见问题
  6. linux搭建pptpd服务器,最简单的Linux系统上的pptpd服务器安装
  7. 中国云计算产业渐成熟 加速传统产业转型升级
  8. java导出txt文件列对齐
  9. 点云txt文件—pcd文件
  10. 管理好你的20~30岁