如何通过ADB获取Android设备的新短信?
可行方案:无需ROOT/直接数据库操作的ADB短信获取方案
好问题!首先明确一点:不ROOT设备、也不直接操作短信数据库的前提下,原生ADB并没有专门的官方命令直接检测并获取新短信——这是因为短信属于敏感隐私数据,Android的权限体系做了严格限制。不过,我们有几个不需要ROOT的可行方案,能满足你的测试自动化需求:
方案1:通过ADB授予权限 + Content Provider查询(推荐,稳定性高)
Android的短信是通过Content Provider对外开放的,只要给对应APP授予READ_SMS权限,就能通过ADB命令查询短信内容,全程无需ROOT:
给系统短信APP授予读取权限:
执行以下命令(如果你的短信APP包名不是com.android.mms,可以用adb shell pm list packages | grep sms查找):adb shell pm grant com.android.mms android.permission.READ_SMS注:Android 11+部分定制ROM可能需要手动在「设置-应用-短信-权限」里开启「读取短信」权限,ADB授予可能失效,这一步手动操作即可。
查询最新收件箱短信:
执行以下命令获取收件箱最新的1条短信(包含发件人、内容、时间):adb shell content query --uri content://sms/inbox --projection _id,address,body,date --sort "date DESC" --limit 1_id:短信唯一ID(可用来检测新短信:对比上次查询的最大ID,若有更大则为新短信)address:发件人号码/昵称body:短信内容date:短信接收时间(时间戳格式)
自动化检测新短信:
你可以编写脚本定时执行上述查询命令,对比每次返回的_id或date字段,判断是否有新短信产生,提取内容即可。
方案2:UI自动化解析短信界面(无需权限,稳定性差)
如果不想授予权限,可以通过ADB的UI dump功能提取短信APP界面的控件内容,适合临时测试:
启动短信APP:
adb shell monkey -p com.android.mms -c android.intent.category.LAUNCHER 1导出当前界面控件XML:
adb shell uiautomator dump /sdcard/sms_ui.xml adb pull /sdcard/sms_ui.xml ./解析XML提取短信内容:
打开导出的sms_ui.xml,查找包含短信内容的控件(通常text属性为短信内容,resource-id可能类似com.android.mms:id/message_text,不同厂商ROM会有差异),通过脚本解析即可。缺点:不同品牌手机的短信APPUI结构差异极大,脚本兼容性差,不适合长期自动化测试。
方案3:结合测试框架(适合正规自动化测试)
如果是做专业的测试自动化,可以用Espresso或Instrumentation编写测试用例:
- 在测试APP中申请
READ_SMS权限,编写代码读取最新短信 - 通过ADB将测试日志导出到电脑,或直接让测试代码把短信内容写入设备文件,再通过
adb pull获取 - 这种方式稳定性最高,适合持续集成的测试场景
内容的提问来源于stack exchange,提问作者koxta




