sim卡联系人是框架提供的一个基本功能,提供读取卡里面的联系人,卡联系人可以分为2g卡和3g卡,3g卡和2g卡的主要区别:3g卡的容量更大,一般可以存储500个联系人,2g卡一般存储250个联系人;3g卡可以存储emails和anrs字段。因此本章将2g卡和3g卡联系人的加载更新操作分别进行讲解。
分为卡联系人的加载,更新和删除流程,具体在加载的过程中需要区分2g卡和3g卡。现在2g卡比较少见,所以重点是3g卡的流程。
- 文件系统的基本介绍和卡联系人的架构
- 2g卡联系人的加载
- 2g卡联系人的更新
- 3g卡联系人的加载
- 3g卡联系人的更新
- phone switch对卡联系人的影响
- 遇到的一些问题和解决思路
首先关注整个卡联系人加载的一个框架,然后是卡联系人加载、更新、删除的功能流程,然后是卡联系人的优化的一个方案。
- 需要关注的问题:
- 各个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文件。