1. Android串口调试基础与环境准备
作为一名在Android底层开发摸爬滚打多年的工程师,我深知串口调试是解决系统级问题的关键手段。不同于普通的adb调试,串口连接能让我们在系统完全崩溃时仍能获取调试信息,堪称Android开发的"最后一道防线"。
1.1 串口调试的必要条件
进行有效的串口调试需要做好以下准备:
- 硬件层面:USB转TTL串口模块(推荐使用CH340G或CP2102芯片的稳定型号)
- 软件工具:
- Windows平台:SecureCRT或Putty(个人更推荐前者,支持会话管理和日志记录)
- Linux平台:minicom或screen工具
- 连接参数:通常为115200波特率、8数据位、无校验位、1停止位(这个配置适用于90%的Android设备)
重要提示:连接前务必确认板子的串口电压电平!3.3V和5V混接可能导致硬件损坏。我曾在项目中因疏忽这点烧毁过两块开发板,教训深刻。
1.2 基础环境配置
首次连接时需要配置内核打印级别:
bash复制echo 0 > /proc/sys/kernel/printk
这个命令将内核打印级别设为0(仅紧急消息),能有效减少干扰信息。但要注意,这同时会屏蔽掉很多有用的调试信息,建议仅在以下场景使用:
- 系统已经能正常启动,只需要调试特定模块时
- 串口输出信息过多导致关键信息被刷屏时
2. 系统级调试命令实战
2.1 系统分区操作技巧
覆盖系统分区是调试过程中最常用的操作之一,但风险也很高。以下是经过验证的安全操作流程:
串口覆盖方案
bash复制1. 工厂菜单或原生设置打开debug开关
2. su \recho 0 > /proc/sys/kernel/printk\r
3. umask 0\r disable-verity\r reboot\r
4. remount
5. cp storage/00FD-5A82/MenuUi.apk system/priv-app/MenuUi/MenuUi.apk
6. reboot
ADB覆盖方案(更推荐)
bash复制1. 工厂菜单或原生设置打开debug开关
2. adb root
3. adb reboot
4. adb root
5. adb remount
6. adb push D:\MenuUi.apk system/priv-app/MenuUi/MenuUi.apk
7. reboot
关键点解析:
- 第3步的
disable-verity是关闭dm-verity验证的关键,缺少这步会导致修改无效 umask 0确保文件权限正确(我遇到过因权限问题导致APK无法加载的坑)- 两次
adb root不是冗余操作,首次获取root后必须重启才能生效
2.2 系统属性修改实战
修改build.prop是调整系统特性的常见需求,busybox是最可靠的方案:
bash复制1. 工厂菜单或原生设置打开debug开关
2. su \recho 0 > /proc/sys/kernel/printk\r
3. umask 0\r disable-verity\r reboot\r
4. remount
5. busybox vi system/build.prop
6. reboot
血泪教训:修改build.prop前一定要备份!曾因一个拼写错误导致系统无法启动,最后只能重烧固件。
3. 调试信息获取与分析
3.1 活动栈信息获取
当分析界面异常时,这些命令能快速定位问题:
bash复制# 获取当前resumed的Activity
adb shell dumpsys activity activities | grep Resumed
# 获取顶层Activity
adb shell dumpsys activity top | grep ACTIVITY
# 查找焦点控件(解决触摸失灵问题特别有用)
adb shell dumpsys window | grep -i mfocus
# 查看窗口层级(分析UI覆盖问题时必备)
dumpsys window windows | grep " #"
3.2 高效日志捕获技巧
常规的logcat输出信息太多?试试这些过滤方案:
基础过滤
bash复制adb logcat -c # 先清空缓存
adb logcat --pid=$(adb shell pidof com.example.app) # 只抓取特定进程
智能过滤(我常用的组合)
bash复制adb logcat | grep -iE "crash|error|failed|exception|fatal|ANR"
持久化日志(排查随机崩溃必备)
bash复制# 串口保存
logcat -f /storage/emulated/0/log.txt
# ADB保存(大文件推荐)
adb logcat > log_all.txt
4. 输入系统深度调试
4.1 输入事件监控
getevent是分析输入问题的神器:
bash复制getevent -l # 显示设备名称和事件详情
典型输出示例:
code复制/dev/input/event2: EV_KEY KEY_VOLUMEUP DOWN
/dev/input/event2: EV_KEY KEY_VOLUMEUP UP
4.2 输入事件模拟
input命令可以模拟各种用户操作:
bash复制# 文本输入(不支持中文)
input text "hello@123"
# 按键模拟(HOME键为例)
input keyevent KEYCODE_HOME
# 触摸事件(绝对坐标)
input tap 500 1200
# 滑动操作(从x1,y1到x2,y2,耗时100ms)
input swipe 100 500 100 100 100
5. 网络调试专项
5.1 WiFi连接管理
命令行连接WiFi的可靠方法:
bash复制cmd wifi connect-network "SSID" wpa2 "password" -r persistent
参数说明:
-r表示隐藏网络persistent使配置永久保存
5.2 网络功能检查
查看系统网络相关特性:
bash复制pm list features | grep -iE "net|wifi|bluetooth"
6. 应用管理高级技巧
6.1 包管理核心命令
bash复制# 查找特定包(支持模糊匹配)
pm list packages | grep settings
# 获取APK路径(解决类冲突时特别有用)
pm path com.android.settings
# 静默安装(无用户界面)
pm install -r -d /sdcard/app.apk
6.2 活动启动技巧
精确启动特定Activity:
bash复制am start -n com.android.settings/.Settings
启动Google助手(需系统支持):
bash复制am start -n com.google.android.apps.googleassistant/com.google.android.apps.googleassistant.AssistantActivity
7. 文件校验与安全
7.1 文件完整性校验
Windows平台:
cmd复制certutil -hashfile update.zip MD5
Linux平台:
bash复制md5sum update.zip
sha1sum update.zip
7.2 ADB开关控制
无需进入设置界面启用ADB:
bash复制settings put global adb_enabled 1
8. 调试经验与避坑指南
-
串口无响应排查步骤:
- 检查TX/RX线序是否接反(最常见错误)
- 确认波特率设置正确(尝试115200/57600/9600)
- 测量串口电压(3.3V或5V必须匹配)
-
remount失败的解决方案:
bash复制
adb root adb disable-verity adb reboot adb root adb remount -
Logcat无输出排查:
- 检查是否误关闭了内核打印(
echo 1 > /proc/sys/kernel/printk恢复) - 尝试指定buffer:
logcat -b main -b system -b crash
- 检查是否误关闭了内核打印(
-
高效调试小技巧:
- 在~/.bashrc中添加常用命令别名:
bash复制alias adbr='adb root && adb remount' alias logc='adb logcat -c && adb logcat -v threadtime'
- 在~/.bashrc中添加常用命令别名:
这些命令和技巧都是我多年在Android系统调试中积累的实战经验,每个命令背后都解决过具体的实际问题。建议收藏本文,遇到问题时按目录查找对应解决方案。调试过程中最重要的就是保持耐心,有时候一个看似复杂的问题,可能只是一个小小的参数配置错误导致的。
