sim卡联系人是框架提供的一个基本功能,提供读取卡里面的联系人,卡联系人可以分为2g卡和3g卡,3g卡和2g卡的主要区别:3g卡的容量更大,一般可以存储500个联系人,2g卡一般存储250个联系人;3g卡可以存储emails和anrs字段。因此本章将2g卡和3g卡联系人的加载更新操作分别进行讲解。

 分为卡联系人的加载,更新和删除流程,具体在加载的过程中需要区分2g卡和3g卡。现在2g卡比较少见,所以重点是3g卡的流程。

  • 文件系统的基本介绍和卡联系人的架构
  • 2g卡联系人的加载
  • 2g卡联系人的更新
  • 3g卡联系人的加载
  • 3g卡联系人的更新
  • phone switch对卡联系人的影响
  • 遇到的一些问题和解决思路

首先关注整个卡联系人加载的一个框架,然后是卡联系人加载、更新、删除的功能流程,然后是卡联系人的优化的一个方案。

  1. 需要关注的问题:
  • 各个efid的路径,切换卡的路径是耗时的操作。

这是高通平台Android M上的log:

对于2g卡,首先加载EFext1字段,05-26 20:45:36.501 D/RILJ    ( 2304): [4197]> iccIO: SIM_IO 0xc0 0x6f4a  path: 3F007F10,0,0,15 aid:  [SUB0]

字段0x6f4a  ,path:3F007F10 (MF_SIM+DF_TELECOM)

然后是加载adn字段:05-26 20:45:36.692 D/RILJ    ( 2304): [4198]> iccIO: SIM_IO 0xc0 0x6f3a  path: 3F007F10,0,0,15 aid:  [SUB0]

字段:0x6f3a  ,path:3F007F10(MF_SIM+DF_TELECOM)

20:45:36.738 D/RILJ    ( 2304): [4199]> iccIO: SIM_IO 0xb2 0x6f3a  path: 3F007F10,1,4,28 aid:  [SUB0]

20:45:45.917 D/RILJ    ( 2304): [4448]> iccIO: SIM_IO 0xb2 0x6f3a  path: 3F007F10,250,4,28 aid:  [SUB0]

 

对于3g卡,也是首先pbr字段,

05-03 20:17:52.672 D/RILJ    ( 8386): [6404]> iccIO: SIM_IO 0xc0 0x4f30  path: 3F007F105F3A,0,0,15 aid: a0000000871002ff86ffff89ffffffff [SUB0]

字段:0x4f30  ,path:3F007F105F3A

然后才是ext字段:

05-03 20:17:57.864 D/RILJ    ( 8386): [6473]> iccIO: SIM_IO 0xc0 0x4f4a  path: 3F007F105F3A,0,0,15 aid: a0000000871002ff86ffff89ffffffff [SUB0]

字段:0x4f4a  ,path:3F007F105F3A

然后是adn字段,

05-03 20:18:00.952 D/RILJ    ( 8386): [6485]> iccIO: SIM_IO 0xc0 0x4f3a  path: 3F007F105F3A,0,0,15 aid: a0000000871002ff86ffff89ffffffff [SUB0]

加载iap:

05-03 20:18:31.399 D/RILJ    ( 8386): [6740]> iccIO: SIM_IO 0xc0 0x4f31  path: 3F007F105F3A,0,0,15 aid: a0000000871002ff86ffff89ffffffff [SUB0]

加载emails:

05-03 20:18:36.569 D/RILJ    ( 8386): [6991]> iccIO: SIM_IO 0xc0 0x4f71  path: 3F007F105F3A,0,0,15 aid: a0000000871002ff86ffff89ffffffff [SUB0]

加载anrs

05-03 20:18:38.682 D/RILJ    ( 8386): [7042]> iccIO: SIM_IO 0xc0 0x4f5a  path: 3F007F105F3A,0,0,15 aid: a0000000871002ff86ffff89ffffffff [SUB0]

 

加载第二部分卡联系人:

加载ext字段:

05-03 20:18:43.262 D/RILJ    ( 8386): [7293]> iccIO: SIM_IO 0xc0 0x4f4a  path: 3F007F105F3A,0,0,15 aid: a0000000871002ff86ffff89ffffffff [SUB0]

加载adn字段

05-03 20:18:43.407 D/RILJ    ( 8386): [7294]> iccIO: SIM_IO 0xc0 0x4f3b  path: 3F007F105F3A,0,0,15 aid: a0000000871002ff86ffff89ffffffff [SUB0]

加载emails的iap字段:

05-03 20:18:51.082 D/RILJ    ( 8386): [7545]> iccIO: SIM_IO 0xc0 0x4f32  path: 3F007F105F3A,0,0,15 aid: a0000000871002ff86ffff89ffffffff [SUB0]

加载emails字段:

05-03 20:18:55.088 D/RILJ    ( 8386): [7796]> iccIO: SIM_IO 0xc0 0x4f72  path: 3F007F105F3A,0,0,15 aid: a0000000871002ff86ffff89ffffffff [SUB0]

加载anrs字段:

05-03 20:18:56.777 D/RILJ    ( 8386): [7847]> iccIO: SIM_IO 0xc0 0x4f5b  path: 3F007F105F3A,0,0,15 aid: a0000000871002ff86ffff89ffffffff [SUB0]

 

2. 3g卡加载缓存是在UsimPhonebookManager里面,其实在AdnRecordCache里面也是有缓存,即AdnRecordCache.mAdnLikeFiles<efid,ArrayList<AdnRecord>),根据efid为key建立缓存,可以有效防止反复加载的问题。

卡联系人框架

  • iccprovider通过contentProvider提供对外服务
  • Iccprovider通过binder通信访问simphonebook服务也就是UiccPhoneBookManager类,这个类是在ProxyController里面实例化的
  • UiccPhoneBookManager最终根据phoneid找到需要加载联系人的IccPhoneBookInterfaceManager控制器来进行联系人的加载,并且在加载之前判断加载的卡是2g卡还是3g卡,3g卡的存储容量更大:能存500个联系人,而2g卡只能存250个联系人;并且3g卡能够存储一个或多个email和anr字段。
  • AdnRecordCache和UsimPhoneBookManager这两个类在用来存储联系人的。当加载到联系人后会将联系人存储在内存中。
  • AdnRecordCache通过AdnRecordLoader来加载2g卡的联系人即加载EFADN字段(6F3A),
  • UsimPhoneBookManager用来加载3g卡联系人即加载EFPBR字段(4F30)得到PbrFile文件,解析到adn字段的efid后再通过AdnRecordLoader去加载
  • 最终都是调用IccFileHandler通过Ril的iccIoForApp接口去加载的联系人的EF文件。

Android10联系人模块中SIM卡联系人排序流程_加载