浅析SubscriptionInfo

来源:互联网 发布:表单设计软件 mac 编辑:程序博客网 时间:2024/05/22 06:39

一、 涉及的类:

1、 UiccCardProvisioner
2、 QtiSubscriptionInfoUpdater
3、 SubscriptionInfoUpdater
4、 SubscriptionController
5、 SubscriptionManager
6、 SubscriptionInfo

SubscriptionManager将SubscriptionController的接口暴露给其他模块,来获取当前插入卡的信息。通过Parcel接口类SubscriptionInfo传递给其他进程。

在卡插入后,框架会在数据库中保存卡的信息,包括卡的subid,iccid、slotid、carriername、mcc、mnc等。

在框架中通过SubscriptionInfoUpdater对卡进行一个更新的操作,对外提供subscriptionManager的接口对外访问,实际上是通过Binder调用SubscriptionController里面的方法。

这里写图片描述

二、 框架图

这里写图片描述
框架内部通过subscriptionInfoUpdater更新卡的信息,首先卡信息只负责插入和更新,不会删除原来的记录,因此一张卡插入后它的subid是不会变的,其实是和对应的iccid一一对应的。在框架内部是通过subid来区分不同的卡。

subscriptionInfo更新有四种情况:
1、UiccCardProvisioner.queryUiccProvisionInfo 负责正常情况下添加;
2、sim absent 负责拔卡情况下删除,只是将simSlotIndex设置为-1;
3、sim locked 负责pin码情况下添加;
4、sim loaded.

三、 添加流程

插卡时序的流程:
这里写图片描述

插卡的检测:
这里写图片描述

其中有重要的一步是判断所有的iccid是否加载到,全部加载到才去更新数据(updateSubscriptionInfoByIccId)。通过判断两张卡的iccid不为null,其中卡absent是将iccid置为” “。查询到所有卡槽的iccid时刻:
分三种情况:
1 UiccCardProvisioner.queryUiccProvisionInfo
2 sim locked :实际上这一步不会发生因为在UiccCardProvisioner.queryUiccProvisionInfo里面就已经可以通过QcRilhook查询到iccid。
3 sim absent:absent是将iccid置为” “。

四、 卡报pin码锁

卡报pin码锁的时候获取iccid的流程,主要是通过fileHandler查询卡字段EF_ICCID:2fe2;
这里写图片描述
通过分析可以知道更新操作updateSubscriptionInfoByIccId,只有在添加和删除的时候会触发。该函数执行是一个耗时操作。

五、 SIM卡的一些必要信息

1、 SubscrptionManager

Subscription可以理解为卡上的一个信息单元,里面包含了卡的一些必要信息。
SubscriptionData是Subscription的一个集合。
SubscriptionManager总体上是一个Handler,主要以消息驱动。

2、 维护几个信息

SetUiccSubsParams 设定两个值:subId和SubscriptionStatus
PhoneSubscriptionInfo 维护SubscriptionManager中管理的Subscription信息

3、 简单说明

SubscriptionManager使用单例模式,但是使用getInstance()有可能得到null。
在构造SubscriptionManager的时候,会先调用getUserPreferredSubs()来把存在数据库里的卡的Subscription信息还原回mUserPrefSubs(一个SubscriptionData),如果没有就设定无效的值进去,且保存回数据库。

实例化一个CardSubscriptionManager对象,向这个对象注册三个事件:
registerForCardInfoAvailable——EVENT_CARD_INFO_AVAILABLE
registerForCardInfoUnavailable——EVENT_CARD_INFO_NOT_AVAILABLE
registerForAllCardsInfoAvailable——EVENT_ALL_CARD_INFO_AVAILABLE

向每一个Ril实例,注册三个事件:
registerForSubscriptionStatusChanged——EVENT_SUBSCRIPTION_STATUS_CHANGED
registerForOffOrNotAvailable——EVENT_RADIO_OFF_OR_NOT_AVAILABLE
registerForOn——EVENT_RADIO_ON

实例化两个激活/去激活注册器列表:
mSubDeactivatedRegistrants
mSubActivatedRegistrants

实例化两个激活/去激活队列:
mActivatePending
mDeactivatePending

原创粉丝点击