本章討論所涉及到的類 [java] view plain copy 在CODE上查看代碼片派生到個人代碼片 vendor\qcom\proprietary\telephony-fwk\opt\telephony\src\java\com\qti\internal\telephony\UiccCardProvisioner.java
vendor\qcom\proprietary\telephony-fwk\opt\telephony\src\java\com\qti\internal\telephony\QtiSubscriptionInfoUpdater.java
frameworks\opt\telephony\src\java\com\android\internal\telephony\SubscriptionInfoUpdater.java
frameworks\opt\telephony\src\java\com\android\internal\telephony\SubscriptionController.java
frameworks\base\telephony\src\java\android\telephony\SubscriptionManager.java
frameworks\base\telephony\src\java\android\telephony\SubscriptionInfo.javajava
UiccCardProvisioner是高通在M上新增的激活卡的類, SubscriptionManager將SubscriptionController的接口暴露給其餘模塊,來獲取當前插入卡的信息。經過Parcel接口類SubscriptionInfo傳遞給其餘進程。android
在卡插入後,框架會在數據庫中保存卡的信息,包括卡的subid,iccid、slotid、carriername、mcc、mnc等。 在框架中經過SubscriptionInfoUpdater對卡進行一個更新的操做,對外提供subscriptionManager的接口對外訪問,其實是經過Binder調用SubscriptionController裏面的方法。數據庫
1 框架內部經過subscriptionInfoUpdater更新卡的信息,首先卡信息只負責插入和更新,不會刪除原來的記錄,所以一張卡插入後它的subid是不會變的,實際上是和對應的iccid一一對應的。在框架內部是經過subid來區分不一樣的卡。框架
subscriptionInfo更新有四種狀況: 1 UiccCardProvisioner.queryUiccProvisionInfo 負責正常狀況下添加 2 sim absent 負責拔卡狀況下刪除,只是將simSlotIndex設置爲-1。 3 sim locked 負責pin碼狀況下添加 4 sim loaded函數
1 添加流程: 添加卡的信息是監聽Icc_state_change事件。觸發是在UiccCardProvisioner類。接口
其中有重要的一步是判斷全部的iccid是否加載到,所有加載到纔去更新數據(updateSubscriptionInfoByIccId)。經過判斷兩張卡的iccid不爲null,其中卡absent是將iccid置爲""。查詢到全部卡槽的iccid時刻: 分三種狀況: 1 UiccCardProvisioner.queryUiccProvisionInfo 2 sim locked :實際上這一步不會發生由於在UiccCardProvisioner.queryUiccProvisionInfo裏面就已經能夠經過QcRilhook查詢到iccid。 3 sim absent:absent是將iccid置爲"" 下面是卡報pin碼鎖的時候獲取iccid的流程,主要是經過fileHandler查詢卡字段EF_ICCID:2fe2進程
經過分析能夠知道更新操做updateSubscriptionInfoByIccId,只有在添加和刪除的時候會觸發。該函數執行是一個耗時操做。事件