1. 车机开发与adb工具概述
在Android车机开发领域,adb(Android Debug Bridge)是每个开发者必备的瑞士军刀。作为连接开发机和车机设备的桥梁,adb提供了从基础调试到深度系统控制的完整能力链。不同于手机开发,车机环境存在诸多特殊场景:需要频繁切换不同硬件模块、处理车载特有的系统服务、调试与车辆总线的交互等。这些场景下,纯手动输入adb命令效率低下,而脚本化操作则能显著提升开发效率。
我从事车机系统开发五年多,整理了一套经过实战检验的adb脚本库。这些脚本覆盖了车机开发全周期的典型需求,从基础环境搭建到深度问题排查。本文将分享其中最实用的20个脚本范例,每个都附带使用场景解析和避坑指南。这些脚本可以直接保存为.bat或.sh文件运行,也可以集成到你的自动化测试框架中。
2. 开发环境准备脚本
2.1 多设备连接管理
车机开发常需同时连接多个设备:主控单元、显示屏、T-Box等。这个脚本帮助快速识别和管理多设备:
bash复制#!/bin/bash
# 列出所有连接的设备
devices=$(adb devices | grep -v "List" | awk '{print $1}')
if [ -z "$devices" ]; then
echo "错误:未检测到任何adb设备"
exit 1
fi
echo "检测到以下设备:"
echo "$devices"
# 为每个设备执行相同命令示例
for device in $devices; do
echo -e "\n在设备 $device 上执行:"
adb -s $device shell getprop ro.product.model
done
注意:车机设备可能启用不同的adb端口。如果发现设备未列出,尝试
adb connect 192.168.x.x:5555(常见车机调试端口)
2.2 车机专属环境检测
车机系统通常有特殊配置,这个脚本检查关键环境指标:
bash复制#!/bin/bash
# 检查车机特有属性
echo "=== 系统属性 ==="
adb shell getprop | grep -E "ro.build.vehicle|ro.car.model"
# 检查关键进程
echo -e "\n=== 运行中的车机服务 ==="
adb shell ps | grep -E "vehicle|car|canbus"
# 存储空间检查(车机常分区特殊)
echo -e "\n=== 存储状态 ==="
adb shell df -h | grep -E "system|data|cache"
典型输出分析:
code复制ro.build.vehicle.version=2023.12
ro.car.model=SDX_PRO
/system 3.2G 1.1G 2.1G 34% # 系统分区占用过高需注意
3. 车机调试核心脚本
3.1 车载网络诊断工具
车机网络问题排查比手机复杂得多,这个脚本一键完成:
bash复制#!/bin/bash
# 保存诊断日志到当前目录
log_file="network_diagnosis_$(date +%Y%m%d_%H%M%S).log"
{
echo "===== 基础网络状态 ====="
adb shell ifconfig
adb shell netstat -tnlp
echo -e "\n===== 车机专有服务检查 ====="
adb shell dumpsys connectivity | grep -A 20 "Active"
echo -e "\n===== 总线通信测试 ====="
adb shell ping -c 4 192.168.1.1 | tee -a $log_file
echo -e "\n===== 特殊路由检查 ====="
adb shell ip route show table all
} > $log_file
echo "诊断完成,日志已保存到 $log_file"
使用技巧:
- 车机常使用多网卡(CAN总线、以太网、WiFi)
- 遇到网络问题时,先运行此脚本保存现场状态
- 关键看Active networks段和路由表是否正确
3.2 车机性能监控脚本
车机性能要求与手机不同,更注重稳定性:
bash复制#!/bin/bash
duration=300 # 监控时长(秒)
interval=5 # 采样间隔
output="perf_monitor_$(date +%Y%m%d).csv"
echo "时间戳,CPU(%),内存(MB),温度(℃),线程数" > $output
end_time=$((SECONDS + duration))
while [ $SECONDS -lt $end_time ]; do
timestamp=$(date +"%T")
# 获取CPU使用率(取第一个核心)
cpu_usage=$(adb shell top -n 1 -d 1 | grep -m 1 "%CPU" -A 1 | tail -1 | awk '{print $9}')
# 内存使用(PSS总量)
mem_usage=$(adb shell dumpsys meminfo | grep "Total PSS" | awk '{print $2}')
mem_mb=$((mem_usage / 1024))
# 温度(车机常有多个传感器)
temp=$(adb shell cat /sys/class/thermal/thermal_zone*/temp 2>/dev/null | sort -nr | head -1)
temp_c=$((temp / 1000))
# 线程总数
threads=$(adb shell ps -T | wc -l)
echo "$timestamp,$cpu_usage,$mem_mb,$temp_c,$threads" >> $output
sleep $interval
done
数据分析建议:
- 车机CPU持续>70%需优化
- 内存泄漏检查看增长趋势
- 温度超过85℃要重点关注
4. 车机系统控制脚本
4.1 驾驶模式切换工具
车机通常有驾驶模式特殊配置:
bash复制#!/bin/bash
# 切换驾驶模式(示例为宝马iDrive系统)
mode="$1" # 参数:normal/sport/eco
case $mode in
normal)
adb shell settings put global drive_mode 0
adb shell am broadcast -a com.bmw.drivemode.NORMAL
;;
sport)
adb shell settings put global drive_mode 2
adb shell am broadcast -a com.bmw.drivemode.SPORT
;;
eco)
adb shell settings put global drive_mode 1
adb shell am broadcast -a com.bmw.drivemode.ECO
;;
*)
echo "用法:$0 [normal|sport|eco]"
exit 1
;;
esac
echo "已切换为 $mode 模式"
adb shell dumpsys activity broadcasts | grep -A 10 drivemode
警告:某些驾驶模式变更会影响车辆实际行为,真车测试需在安全环境下进行
4.2 车机日志全量导出
车机日志比手机更复杂,需要分层抓取:
bash复制#!/bin/bash
# 创建日志目录
log_dir="vehicle_logs_$(date +%Y%m%d)"
mkdir -p "$log_dir"
# 1. 系统基础日志
adb logcat -d > "$log_dir"/logcat_full.log
adb logcat -d -b events > "$log_dir"/events.log
adb logcat -d -b radio > "$log_dir"/radio.log
# 2. 车机特有日志
adb shell dmesg > "$log_dir"/dmesg.log
adb shell dumpstate > "$log_dir"/dumpstate.log
# 3. 车载服务专属日志
services=("VehicleHal" "CarService" "CanBusService")
for svc in "${services[@]}"; do
adb shell dumpsys "$svc" > "$log_dir"/"$svc"_dump.log
done
# 4. 系统属性快照
adb shell getprop > "$log_dir"/props.log
# 打包便于传输
zip -r "$log_dir".zip "$log_dir"
日志分析要点:
- 首先检查dmesg有无硬件错误
- 查看VehicleHal的CAN总线状态
- 检查CarService的生命周期事件
5. 高级调试技巧脚本
5.1 车载传感器模拟器
车机开发常需要模拟传感器数据:
bash复制#!/bin/bash
# 模拟GPS位置注入
lat="$1"
lon="$2"
if [ -z "$lat" ] || [ -z "$lon" ]; then
echo "用法:$0 <纬度> <经度>"
exit 1
fi
# 需要root权限
adb root
adb remount
# 通过Android传感器服务注入
adb shell am start-foreground-service -n com.example.simulator/.LocationService \
--es action "inject" \
--ef latitude "$lat" \
--ef longitude "$lon"
# 验证位置更新
adb shell dumpsys location | grep -A 10 "Last Known Locations"
扩展应用:
- 车速模拟:
adb shell settings put global simulated_speed 60 - 方向模拟:通过
sensor_inject工具修改陀螺仪数据
5.2 CAN总线调试工具
车机开发最关键的CAN总线调试:
bash复制#!/bin/bash
# CAN总线监听工具
interface="$1" # can0/can1
duration="$2" # 监听秒数
if [ -z "$interface" ]; then
echo "用法:$0 <can接口> [监听时长]"
exit 1
fi
log_file="can_dump_${interface}_$(date +%Y%m%d_%H%M%S).log"
# 设置CAN总线波特率(示例值)
adb shell ip link set $interface type can bitrate 500000
adb shell ifconfig $interface up
# 开始监听
echo "开始监听$interface总线..."
adb shell candump $interface > $log_file &
pid=$!
# 设置超时停止
if [ -n "$duration" ]; then
sleep $duration
kill $pid
echo "监听已完成,日志保存在$log_file"
else
echo "持续监听中,按Ctrl+C停止..."
wait $pid
fi
CAN数据分析技巧:
- 使用
can-utils包中的candump解析日志 - 关键看ID和Data段变化
- 典型车机CAN ID范围:0x100-0x7FF
6. 自动化测试集成脚本
6.1 UI自动化测试框架集成
车机UI测试需要特殊处理:
bash复制#!/bin/bash
# 车机UI自动化测试启动器
package="com.example.vehicleui"
activity="MainActivity"
test_runner="androidx.test.runner.AndroidJUnitRunner"
# 1. 确保屏幕常亮
adb shell settings put system screen_off_timeout 1800000
# 2. 切换到车载模式
adb shell am start -n $package/$activity --es mode "dashboard"
# 3. 执行测试
adb shell am instrument -w -r -e debug false \
-e class com.example.vehicleui.test.DashboardTest \
$package.test/$test_runner
# 4. 收集结果
adb pull /sdcard/test_results ./vehicle_test_$(date +%Y%m%d)
车机UI测试要点:
- 处理不同分辨率(横屏/竖屏)
- 模拟驾驶震动环境:
adb shell input motionevent - 注意驾驶安全限制(行车时禁用视频等)
6.2 车规级压力测试
bash复制#!/bin/bash
# 车机压力测试脚本
cycles=100 # 测试循环次数
for ((i=1; i<=cycles; i++)); do
echo "=== 测试循环 $i/$cycles ==="
# 模拟用户操作流
adb shell input keyevent KEYCODE_HOME
sleep 1
adb shell am start -n com.example.navigation/.MainActivity
sleep 3
adb shell input tap 500 500 # 模拟地图点击
sleep 2
# 温度监控
temp=$(adb shell cat /sys/class/thermal/thermal_zone*/temp | sort -nr | head -1)
echo "当前最高温度:$((temp/1000))℃"
# 超过阈值停止测试
if [ $((temp/1000)) -gt 85 ]; then
echo "温度超过安全阈值,停止测试"
break
fi
done
压力测试指标:
- 内存增长不超过初始值的20%
- 无系统服务崩溃
- 触摸响应延迟<300ms
7. 问题排查与修复脚本
7.1 车机死机自动诊断
bash复制#!/bin/bash
# 车机无响应时自动收集信息
timeout=60 # 等待响应的超时时间(秒)
# 检查基础响应
if ! adb shell echo "ping" &>/dev/null; then
echo "设备完全无响应,尝试强制重启..."
adb reboot
exit 1
fi
# 收集系统状态
echo "=== 系统状态快照 ===" > hang_report.log
adb shell top -n 1 -b >> hang_report.log
adb shell dumpsys meminfo >> hang_report.log
# 检查ANR日志
adb pull /data/anr/ ./anr_logs_$(date +%Y%m%d)
# 建议后续操作
echo -e "\n建议检查:"
echo "1. 查看anr_logs中的最新ANR记录"
echo "2. 分析hang_report.log中的高CPU进程"
echo "3. 检查是否存在内存泄漏"
7.2 车机服务自动重启
bash复制#!/bin/bash
# 监控并重启关键车机服务
services=("VehicleService" "CarService" "CanBusDaemon")
for svc in "${services[@]}"; do
if ! adb shell pidof $svc &>/dev/null; then
echo "$(date +"%T") - $svc 未运行,正在重启..."
adb shell am startservice -n com.example.vehicle/.$svc
# 验证是否启动成功
sleep 2
if adb shell pidof $svc &>/dev/null; then
echo "$svc 重启成功"
else
echo "警告:$svc 重启失败"
fi
fi
done
8. 车机专属功能脚本
8.1 多显示屏控制工具
现代车机常配备多个显示屏:
bash复制#!/bin/bash
# 控制副驾驶显示屏
display="$1" # 参数:left/right/center
state="$2" # 参数:on/off
if [ -z "$display" ] || [ -z "$state" ]; then
echo "用法:$0 [left|right|center] [on|off]"
exit 1
fi
# 通过车机专属服务控制
adb shell am broadcast -a com.example.vehicle.DISPLAY_CONTROL \
--es display "$display" \
--es state "$state"
# 验证状态
adb shell dumpsys display | grep -A 5 "Display $display"
多屏开发注意:
- 不同显示屏可能有不同DPI
- 副驾驶屏在行车时常有内容限制
- 使用
adb shell wm size检查各屏分辨率
8.2 车载语音调试工具
bash复制#!/bin/bash
# 语音命令模拟工具
command="$1"
if [ -z "$command" ]; then
echo "用法:$0 \"语音指令文本\""
exit 1
fi
# 注入语音输入
adb shell am start-foreground-service -n com.example.voice/.InjectorService \
--es text "$command"
# 查看语音识别结果
adb logcat -d | grep -A 5 "VoiceCommand" | tail -10
语音调试技巧:
- 测试降噪效果:在背景音中播放
adb shell mediaplayer... - 查看语音识别置信度分数
- 注意多语种混合场景
9. 脚本管理与优化技巧
9.1 脚本自动更新机制
bash复制#!/bin/bash
# adb脚本自动更新工具
repo_url="https://example.com/adb_scripts"
local_dir="$HOME/vehicle_scripts"
# 创建目录
mkdir -p "$local_dir"
cd "$local_dir" || exit
# 下载最新脚本
wget -q -r -np -nd -A.sh,.bash "$repo_url/"
# 设置执行权限
chmod +x *.sh
echo "脚本已更新至最新版本:"
ls -l
9.2 脚本执行安全监控
bash复制#!/bin/bash
# 安全执行监控脚本
script="$1"
timeout=60 # 超时时间(秒)
if [ -z "$script" ]; then
echo "用法:$0 <要执行的脚本>"
exit 1
fi
# 启动监控
{
# 执行目标脚本
bash "$script" &
pid=$!
# 超时控制
sleep $timeout
if kill -0 $pid 2>/dev/null; then
echo "警告:脚本执行超时,正在终止..."
kill -9 $pid
fi
} 2>&1 | tee "${script}.log"
# 分析资源使用
echo -e "\n=== 执行报告 ==="
grep -i "error\|warn\|fail" "${script}.log"
10. 车机开发实用技巧
-
快速重启车机服务:
bash复制
adb shell am stopservice com.example.vehicle/.CarService adb shell am startservice com.example.vehicle/.CarService -
查看车机专属属性:
bash复制adb shell getprop | grep "vehicle\|car" -
监控CAN总线负载:
bash复制adb shell cat /proc/net/can/stats -
强制GPU渲染检查:
bash复制
adb shell dumpsys gfxinfo com.example.vehicleui -
车机特有Intent列表:
bash复制adb shell dumpsys package | grep -A 10 "vehicle.*intent"
这些脚本和技巧来自实际车机项目经验,每个都经过多次迭代优化。建议根据具体车机平台调整参数,特别是CAN总线相关配置可能因车型而异。保存这些脚本到你的开发环境,可以节省大量重复工作的时间。