通过ADB命令行工具发送中文短信,其核心在于解决字符编码转换与系统权限适配两大技术难点,直接使用常规的service call或am start命令往往会导致接收端显示乱码或发送失败。实现ADB发送中文短信的专业方案,必须引入Base64编码机制或利用Intent的Extra数据流特性,绕过Shell环境的字符集限制,同时确保设备已获取Root权限或具备必要的签名权限,才能实现稳定、可靠的短信推送功能。

技术原理与核心难点解析
在深入操作步骤之前,必须理解为何ADB发送中文短信比英文复杂。
- 字符编码冲突: Android系统的Shell环境默认通常只支持ASCII字符集,当通过ADB Shell输入中文字符时,系统无法正确解析UTF-8编码的中文字符,导致短信内容在传输过程中被截断或替换为乱码。
- 系统API限制: Android系统并未直接向Shell层暴露发送短信的标准化接口,开发者通常需要调用底层的
ISms服务或启动隐式Intent来触发短信应用。 - 权限管控严格: 从Android 6.0开始,系统对发送短信权限
android.permission.SEND_SMS管控极其严格,普通的ADB指令若无Root权限加持,很难直接调用系统服务完成发送。
方案一:基于Intent与Base64编码的通用解决方案
这是目前兼容性最好、无需深度依赖系统版本的方法,核心思路是利用Android的组件广播机制,将中文内容进行编码传输。
-
编码中文内容:
由于Shell无法直接处理中文,首先需要将短信内容转换为Base64编码,这一步通常在PC端的脚本(如Python或批处理脚本)中完成。- 假设短信内容为“测试短信”,将其转换为UTF-8格式的Base64字符串。
- 这一过程确保了所有字符均为ASCII码,Shell环境可以安全传输。
-
编写解码发送脚本:
在Android设备上运行一段Shell脚本,接收Base64字符串并解码。- 利用
am broadcast命令调用系统的短信发送器。 - 关键命令逻辑:通过Intent传递数据,在接收端解码并调用SmsManager。
- 此方法的优势在于绕过了Shell的编码限制,利用Java层的解码能力还原中文,是解决{adb发送中文短信_发送短信}乱码问题的关键路径。
- 利用
-
执行流程:
- 第一步:在PC端将“接收号码”和“短信内容”进行预处理。
- 第二步:通过ADB推送一个预置的Shell脚本或APK至设备临时目录。
- 第三步:执行
adb shell sh /data/local/tmp/send_sms.sh [Base64_Content]。 - 第四步:脚本内部调用
service call isms或发送广播,触发短信发送。
方案二:Root环境下的Service Call直接调用
对于已Root的设备,可以直接通过service call命令调用Android底层的ISms服务,这种方法效率最高,但受限于Android版本碎片化。

-
查询服务接口:
不同的Android版本,ISms服务的索引号不同,需要通过service list查看短信服务的名称,通常为isms或sms。- 使用
adb shell service call isms命令。 - 需要传递的参数包括目标号码、短信内容等。
- 使用
-
处理中文参数:
即使在Root环境下,直接在命令行写入中文依然存在问题。- 必须将中文转换为十六进制字符串(Hex String)或Unicode编码。
- 利用
echo -n配合xxd工具在Shell内部进行转换,或者直接传递十六进制数据包给服务接口。
-
权限提升:
- 执行命令前,必须确保ADB拥有Root权限,执行
adb root和adb remount。 - 若提示权限拒绝,需检查SELinux策略,可能需要执行
setenforce 0临时关闭SELinux,但这会降低系统安全性。
- 执行命令前,必须确保ADB拥有Root权限,执行
方案三:利用ADB调用SmsManager(进阶开发方案)
如果环境允许安装辅助应用,开发一个极轻量级的“短信转发器”APP是最稳定、最符合E-E-A-T原则中“体验”要求的方案。
-
应用层封装:
编写一个无界面的Android应用,暴露一个BroadcastReceiver。- 应用内部调用
SmsManager.getDefault().sendTextMessage()。 - 这是Android官方推荐的API,完美支持中文,且能自动处理运营商编码。
- 应用内部调用
-
ADB触发调用:
通过ADB发送广播来触发该应用。- 命令示例:
adb shell am broadcast -a com.example.SEND_SMS --es phone_number "10086" --es sms_body "这是中文测试"。 - 此方案完全规避了Shell编码问题,因为Intent的Extra字段原生支持UTF-8字符串传递。
- 命令示例:
-
优势分析:
- 稳定性高: 不受系统版本更新导致的接口索引变化影响。
- 成功率高: 系统API自动处理长短信拆分和中文编码,无需人工干预。
常见问题排查与专业建议

在实际操作中,仅仅掌握命令是不够的,还需要处理各种异常情况。
-
乱码问题终极排查:
如果接收到的短信依然是乱码,请检查以下三点:- PC端脚本的文件编码是否为UTF-8 without BOM。
- ADB Shell的默认语言环境设置,尝试执行
export LANG=en_US.UTF-8。 - 接收方手机是否支持PDU模式下的中文解码。
-
短信发送失败(无响应):
- 检查SIM卡状态:
adb shell dumpsys telephony.registry。 - 确认应用是否拥有默认短信应用权限,Android 4.4以上版本,只有默认短信应用才有权限写入短信数据库。
- 检查SIM卡状态:
-
自动化脚本建议:
建议开发者不要直接在命令行手敲命令,应编写Python脚本封装ADB逻辑。- 利用Python的
subprocess模块调用ADB。 - 利用
base64库进行编码预处理。 - 这能极大提升{adb发送中文短信_发送短信}的执行效率和准确率,实现批量自动化推送。
- 利用Python的
相关问答模块
问:为什么通过ADB Shell直接输入中文短信命令会提示错误或乱码?
答:这是因为ADB Shell环境通常基于ASCII字符集,无法直接解析输入的中文字符,当你在命令行输入中文时,系统将其识别为未知的控制字符或多个ASCII片段,导致命令解析失败或内容乱码,解决这一问题的核心在于使用Base64编码传输,或者利用Intent的Extra机制传递UTF-8字符串,确保数据在传输过程中保持完整性。
问:非Root手机能否通过ADB成功发送短信?
答:可以,但有限制,非Root手机无法直接使用service call调用底层服务,最稳妥的方案是安装一个具备发送短信权限的辅助应用(APP),然后通过ADB的am broadcast或am start命令向该应用发送指令,由应用调用系统API完成发送,这种方式符合Android安全机制,且完美支持中文。
如果您在操作过程中遇到特定的机型适配问题或有更优化的脚本方案,欢迎在评论区留言交流。
首发原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/123209.html