腾讯优测优分享干货精选| Android双卡双待适配——隐藏在数据库中的那些秘密

比特逐浪
• 阅读 3363

腾讯优测是专业的app自动化测试平台,除了提供兼容性测试,远程真机租用等多维度的测试服务,还有优分享-腾讯内部的移动研发测试干货精选~

许多APP都希望获取用户通讯录联系人,利用通讯录关系链信息来丰富产品功能。在读取系统联系人数据库的ContentProvider时,对于双卡双待手机,电话和短信数据都需要标识来自哪张卡。
Android 5.0开始加入Dual Sim支持,Android 官方方案和mtk的方案十分类似,感兴趣的小伙伴可以直接移步mtk方案实现方式。

双卡数据库适配流程

根据系统ContentProvider数据内容来做适配开发,找到区分双卡的标识字段和字段对应的值。为了以下阐述内容清晰,这里约定:主卡—0卡,副卡—1卡。
主要涉及的数据库表有两个:短信彩信、电话。

1.清空数据库

如果手机安装了安全软件有可能”污染“数据库数据,清空数据库中的数据可以保证以下操作的准确性。

2.使用系统短信程序和拨号程序分别使用1卡、2卡发送短信,拨打电话

保证使用的是系统短信和拨号程序,第三方APP会接管系统程序,开始操作前需卸载第三方APP。

3.读取数据库值,找到区分卡槽的值

对于可以root的手机,可以直接找到对应的数据库文件,导出后使用SQLite查看器来查询数据库中的值。
短信、彩信数据库位置:
/data/data/com.android.providers.telephony/mmssms.db
电话数据库位置:
data/data/data/com.android.providers.contacts/contacts2.db

腾讯优测优分享干货精选| Android双卡双待适配——隐藏在数据库中的那些秘密

注意:对应的.db-wal、.db-shm文件也需要导出,SQLite引入了日志预写模式(WAL),如果不导出这两个文件,数据更新不及时。

腾讯优测优分享干货精选| Android双卡双待适配——隐藏在数据库中的那些秘密

双卡数据库适配常见类型都有哪些?

1.新增标识字段

常见于:三星、moto等
举例:手机的短信数据库

腾讯优测优分享干货精选| Android双卡双待适配——隐藏在数据库中的那些秘密

通过上图,我们可以知道短信数据库表中:
标识双卡的字段名:sim_id,字段的值:卡0—-0 || 卡1—-1
这种情况相对简单,在做短信、电话相关的APP只需要:
(1)确定对应的卡槽
(2)需要数据库操作时,增加一列对于双卡标识字段的操作

腾讯优测优分享干货精选| Android双卡双待适配——隐藏在数据库中的那些秘密

2.mtk系列芯片新增siminfo表

常见于mtk系列芯片的手机
现象:
按照1中的方法找到了区分卡槽的字段和值,发现当用户换卡时,标识字段对应的值会随着变化,每换一张新卡,对应的simId值+1。
问题原因:
如下图所显示,这类手机新建了一张表,用来记录SIM卡的信息。对应的uri为:Uri uri = Uri.parse(“content://telephony/siminfo”);
解释:
slot字段值为0:主卡
slot字段值为1:副卡
slot字段值为-1:此卡没有安装在卡槽

腾讯优测优分享干货精选| Android双卡双待适配——隐藏在数据库中的那些秘密

如下图,sms表和siminfo表的映射关系。sms表中的simId字段存储的是siminfo表中对应的_id,siminfo中对应的0,1是卡槽的标识。
注意:siminfo表是系统维护的,第三方APP只需读取,不需要进行“写”操作。

腾讯优测优分享干货精选| Android双卡双待适配——隐藏在数据库中的那些秘密

解决办法:
(1)确立映射关系
在一定的触发时机(应用启动,监听iteminfo数据库信息变化),触发iteminfo表的查询,将查询结果建立成映射关系。
0—-4
1—-3
(2)需要操作时根据卡槽获得映射值写入db

腾讯优测优分享干货精选| Android双卡双待适配——隐藏在数据库中的那些秘密

mtk在双卡双待方面的积累是很深厚长久的,在功能机时代就有非常广泛的应用。那么为什么还要如此麻烦的新建一张表来做这个映射呢?为什么不使用方案1 简单的处理呢?

场景:
使用1中数据库新增字段的方法,对于WCDMA联通定制机(同时G卡制式),如果用户将两张卡对调位置,将会发生什么情况?
在方案1中,所有的信息直接和sms表中的双卡标识字段绑定,如果换卡的话将无法判断信息来自那个SIM卡,在上述的场景发生时,用户所有的信息和SIM卡发生混乱。
在方案2中,因为sms和siminfo存在映射关系,siminfo表中的icc_id可以唯一标识一张SIM卡,不会发生方案1中出现的换卡可能造成的信息错乱问题。
思考总结:
方案2的存在是合理的,因为方案1同时存在缺陷。

3. coolpad系列手机新增iteminfo表

常见于:酷派系列手机
特殊点:root没有成功,无法查看data/data目录下内容
电话数据库适配:
使用查询数据库的工具

腾讯优测优分享干货精选| Android双卡双待适配——隐藏在数据库中的那些秘密

清空db后操作:使用0、1卡分别向5520拨打电话,使用0卡向10010拨打电话。通过记录的查询结果可知,电话标识字段为moduletype,字段对应的值为0—–1 || 1——2
短信数据库适配:
清空db后向5520发送4条短信,见下图:

腾讯优测优分享干货精选| Android双卡双待适配——隐藏在数据库中的那些秘密

当使用查询工具查询结果时,会出现下图的情况,其中sim_id通常在方案1中作为双卡标识的字段,但是在这款手机上值均为-1。(可以注意到iteminfo字段中的值时累加的1、2、3、4)

腾讯优测优分享干货精选| Android双卡双待适配——隐藏在数据库中的那些秘密

查询iteminfo数据库表的结果:Uri.parse(“content://mms-sms/itemInfo”);

腾讯优测优分享干货精选| Android双卡双待适配——隐藏在数据库中的那些秘密

数据库表关联关系:

腾讯优测优分享干货精选| Android双卡双待适配——隐藏在数据库中的那些秘密

适配方法:
(1)每次在sms表插入一条数据,iteminfo会对应的增加一条记录,这个是由系统provider自动完成的。
(2)需要更新iteminfo中的数据中的network_type字段值来标识卡槽。
总结:
不仅系统联系人需要数据库适配,当APP开发过程中使用到系统数据库的时候,可能也会遇到类似的适配问题。这时,也可以使用类似的方式处理。

文/腾讯优测 李艳超

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
双十一预售活动分析
2022年双十一促销活动已经开始,大家应该都提前开始关注今年双十一活动的时间表了吧?2022年10月24日晚8:00天猫双11预售时间,第一波销售时间10月31日晚8:0,第二波销售时间11月10日晚8:00;天猫双11的优惠力度是跨店每满30050
Wesley13 Wesley13
3年前
APP测试点总结
APP测试点总结1.功能性测试:  ——根据产品需求文档编写测试用例。  ——软件设计文档编写用例。  注意:就是根据产品需求文档编写测试用例而进行测试。2.兼容性测试:  ——android版本的兼容性  ——手机分辨率兼容性  ——网络的兼容性:2G\\3G\\4G\\WIFI,弱网下、断网时  ——app跨版本的兼容性  1.适配
Stella981 Stella981
3年前
Kerberos无约束委派的攻击和防御
 0x00前言简介当ActiveDirectory首次与Windows2000Server一起发布时,Microsoft就提供了一种简单的机制来支持用户通过Kerberos对Web服务器进行身份验证并需要授权用户更新后端数据库服务器上的记录的方案。这通常被称为Kerberosdoublehopissue(双跃点问题),
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
Bypass 360主机卫士SQL注入防御(多姿势)
0x00前言在服务器客户端领域,曾经出现过一款360主机卫士,目前已停止更新和维护,官网都打不开了,但服务器中依然经常可以看到它的身影。从半年前的测试虚拟机里面,翻出了360主机卫士Apache版的安装包,就当做是一个纪念版吧。这边主要分享一下几种思路,Bypass360主机卫士SQL注入防御。!(https://oscimg.osc
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Java服务总在半夜挂,背后的真相竟然是... | 京东云技术团队
最近有用户反馈测试环境Java服务总在凌晨00:00左右挂掉,用户反馈Java服务没有定时任务,也没有流量突增的情况,Jvm配置也合理,莫名其妙就挂了
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(