资讯详情

资讯详情

建站行业动态 · 设计趋势 · 数字化升级干货

Android调试进阶:adb shell核心命令实战指南与效率提升

Android调试进阶:adb shell核心命令实战指南与效率提升 1. 从“黑窗口”到效率利器重新认识adb shell每次看到那个黑色的命令行窗口很多刚接触Android开发或测试的朋友可能会有点发怵。不就是个命令行工具吗能有多大用处但如果你真的深入用过adb shell你会发现它远不止是“连接手机”那么简单。它更像是一把瑞士军刀能帮你撬开Android设备的内核直接与系统底层对话。无论是排查一个诡异的应用崩溃还是批量自动化处理文件甚至是深度定制系统行为adb shell命令都是绕不开的核心技能。我刚开始做Android性能优化时也以为用Android Studio的Profiler点点图表就够了。直到遇到一个线上用户的卡顿问题日志里干干净净但用户反馈就是“滑动时一顿一顿的”。最后就是靠着一系列adb shell命令深入到进程的调度优先级、内存锁竞争和I/O等待的层面才最终定位到是一个第三方SDK在后台频繁进行小文件读写阻塞了主线程。那一刻我才明白图形化工具告诉你“是什么”而adb shell能告诉你“为什么”。这篇文章我不会给你一个冷冰冰的、按字母排序的命令列表。那种列表网上到处都是但你看完了可能还是不知道什么时候该用什么。我想分享的是我在过去几年里从日常调试到复杂问题排查中真正高频使用、能解决实际问题的那些adb shell命令。我会把它们按照实际的使用场景和目的来分类并附上我踩过的坑和总结的技巧。无论你是开发者、测试工程师还是热衷于搞机的极客这些命令都能让你的效率提升好几个档次。2. 基础生存包设备连接与信息获取在玩转任何高级技巧之前你得先确保你的“手术刀”——adb已经稳稳地连接上了“病人”——Android设备。这个阶段的问题看似简单却绊倒了最多的人。2.1 连接建立与验证不止是adb devicesadb devices这个命令无人不知但它返回的列表里每个设备状态背后的含义你清楚吗$ adb devices List of devices attached emulator-5554 device ABCDEFG unauthorized HIJKLMN offlinedevice理想状态表示设备已连接且已授权电脑进行调试。unauthorized设备已连接但手机上还未点击“允许USB调试”的授权弹窗。这是最常见的问题之一。你需要解锁设备屏幕通常就会看到授权提示。如果没出现可以尝试重插USB线或者重启adb服务adb kill-serveradb start-server。offline设备连接异常。可能原因包括USB线或端口接触不良、设备驱动未正确安装、或者设备本身处于异常状态比如刚刷完机未完全启动。我的经验是优先换一条质量好的数据线并尝试不同的USB口。注意对于无线调试你需要先用USB线执行adb tcpip 5555在设备上开启TCP/IP端口然后adb connect 设备IP:5555。断开无线连接用adb disconnect。无线调试虽方便但传输大文件或进行高实时性操作时稳定性不如有线。连接成功后获取设备信息是你了解“对手”的第一步adb shell getprop ro.product.model获取设备型号如“Pixel 6”。在需要针对特定机型做兼容性测试时非常有用。adb shell getprop ro.build.version.release获取Android系统版本如“13”。adb shell getprop ro.serialno获取设备序列号。在多台同型号设备同时连接时这是区分它们的唯一标识。adb shell wm size获取物理屏幕分辨率。adb shell wm density获取屏幕密度DPI。在做UI适配测试时这两个命令能快速帮你确认设备的显示规格。2.2 深入系统dumpsys信息宝库如果说getprop是查看设备的静态标签那么dumpsys就是给你一台X光机让你透视整个Android系统各个核心服务的实时运行状态。它是Android系统内置的一个强大的诊断工具可以输出所有系统服务Service的详细信息。直接运行adb shell dumpsys会输出海量信息通常需要配合具体的服务名来过滤adb shell dumpsys activity这是使用频率最高的之一。它可以列出所有活动Activity的栈信息。但更常用的是它的子命令adb shell dumpsys activity activities以更清晰的格式显示当前所有Activity栈。在分析应用页面跳转异常、排查“点返回键没反应”等问题时这是首选命令。你可以看到哪个Activity处于RESUMED状态当前用户可见哪些处于PAUSED或STOPPED状态。adb shell dumpsys activity processes显示所有进程信息包括进程名、PID、UID、重要性oom_adj等。结合adb shell dumpsys meminfo package_name可以深入分析应用内存使用情况。adb shell dumpsys window显示窗口管理器信息。adb shell dumpsys window displays可以查看当前屏幕的显示信息对于折叠屏、多屏设备尤其有用。adb shell dumpsys battery获取详细的电池状态包括电量百分比、健康状况、充电状态AC/USB/无线、温度等。在做功耗测试时不可或缺。adb shell dumpsys cpuinfo查看CPU占用情况。虽然top命令更实时但dumpsys cpuinfo的输出格式更规整适合脚本化抓取。adb shell dumpsys package package_name获取某个应用的完整包信息包括版本号、安装路径、权限列表、组件Activity/Service等声明、签名信息等。在确认应用版本、排查权限相关问题时非常高效。dumpsys的输出通常很冗长在电脑上分析时可以结合grepWindows的findstr进行过滤。例如adb shell dumpsys activity activities | grep -A 5 -B 5 “Resumed”可以快速定位当前前台应用。3. 文件与数据管理设备的“资源管理器”在设备上查看、复制、修改文件是调试过程中最常做的事情之一。adb shell提供了完整的文件操作能力。3.1 基础文件操作进入shell环境后你可以使用几乎所有的标准Linux文件命令adb shell ls -la /sdcard/列出SD卡目录详情。-l显示详情-a显示隐藏文件。adb shell cd /data/data/切换到应用数据目录。注意非root设备上你通常无法直接查看其他应用的数据目录。adb shell cat /proc/cpuinfo查看CPU信息。cat命令非常适合查看较小的文本文件如系统配置文件、日志文件片段。adb shell rm /sdcard/test.txt删除文件。使用-r参数删除目录如rm -r /sdcard/folder/。操作需谨慎设备上的文件删除后不易恢复。adb shell mkdir /sdcard/new_folder创建目录。adb shell cp /sdcard/a.txt /sdcard/b.txt复制文件。adb shell mv /sdcard/old.txt /sdcard/new.txt移动或重命名文件。3.2 宿主机与设备间文件传输这是adb最实用的功能之一无需依赖任何第三方助手软件。从电脑推送文件到设备adb push 本地文件路径 设备目标路径adb push ./app-debug.apk /sdcard/Download/这常用于安装包、测试资源、配置文件的快速部署。从设备拉取文件到电脑adb pull 设备文件路径 [本地目标路径]adb pull /sdcard/DCIM/Camera/photo.jpg ./ adb pull /data/anr/traces.txt ./anr_traces/第二个例子是拉取ANR应用无响应日志这是分析卡顿问题的关键。如果本地路径省略则拉取到当前命令行所在目录。心得在拉取日志或数据前尤其是为了复现某个问题最好先清空旧数据或重命名目标文件避免新旧数据混淆。例如可以先adb shell mv /data/anr/traces.txt /data/anr/traces_old.txt然后触发问题再拉取新生成的traces.txt。3.3 应用数据访问与备份直接访问应用沙盒内的数据对于调试至关重要。adb shell run-as package_name这是非Root设备下访问自己开发的应用私有数据的“神技”。执行后你的shell会话权限就切换到该应用的用户从而可以访问其私有目录/data/data/package_name/。$ adb shell $ run-as com.example.myapp $ ls -la $ cat shared_prefs/my_settings.xml你可以查看数据库、SharedPreferences文件等对于调试数据存储问题极其方便。注意这只对debug签名的应用有效。adb backup和adb restore用于备份和恢复应用数据包括APK。但此功能在较新版本的Android上已被限制或需要应用显式支持实用性已大不如前。更通用的做法是直接pull应用的数据目录需root或使用run-as。4. 应用生命周期操控安装、卸载与交互作为开发者安装、卸载、清理数据、启动应用是每日高频操作。adb让这些操作变得可脚本化。4.1 安装与卸载adb install -r -d apk_path安装APK。-r替换已存在的应用覆盖安装。-d允许降级安装版本号比已安装的低。这在测试不同版本兼容性时常用。-t允许安装测试APK即使AndroidManifest.xml中未声明android:testOnly。-g授予APK清单文件中声明的所有运行时权限。避免安装后还要手动点授权。adb uninstall package_name卸载应用。adb uninstall -k package_name可以保留数据和缓存目录仅卸载APK本身用于快速重装测试。4.2 启动应用与发送广播adb shell am start -n package_name/activity_full_name启动一个Activity。adb shell am start -n com.example.myapp/.MainActivity你还可以添加Intent参数例如-a android.intent.action.VIEW -d https://www.example.com来传递数据和Action。adb shell am startservice -n package_name/service_full_name启动一个Service。adb shell am broadcast -a action_name发送一个广播。这在测试广播接收器BroadcastReceiver时非常有用可以模拟系统或其他应用发送的广播事件。adb shell am broadcast -a android.intent.action.BOOT_COMPLETEDadb shell am force-stop package_name强制停止一个应用。这比在最近任务里划掉更彻底会终止其所有进程和服务。在测试应用冷启动或清理状态时常用。adb shell am kill package_name杀死与应用包名相关的所有进程。与force-stop类似但有时行为有细微差别。4.3 清理数据与缓存在测试中经常需要将应用恢复到初始状态。adb shell pm clear package_name清除应用数据包括数据库、SharedPreferences等和缓存。效果等同于在系统设置里点击“清除数据”和“清除缓存”。这是最干净的重置方式。单独清除缓存目录adb shell rm -r /data/data/package_name/cache/*(需要run-as或root)。有时你只想清空缓存文件而不想丢失用户数据如登录态就可以用这种方式。5. 性能与日志监控洞察应用运行实况当应用出现性能问题或崩溃时实时监控和日志抓取是定位问题的生命线。5.1 系统日志抓取logcatlogcat是Android日志系统的门户所有应用和系统组件打印的日志都汇集于此。基础抓取adb logcat。但这样会输出所有日志信息洪流瞬间淹没关键信息。按标签过滤adb logcat -s TAG_NAME。例如adb logcat -s MyApp只显示标签为“MyApp”的日志。你可以在代码中使用Log.d(“MyApp”, “message”)来打印。按优先级过滤adb logcat *:PRIORITY。优先级从低到高为V(Verbose), D(Debug), I(Info), W(Warn), E(Error), F(Fatal), S(Silent)。adb logcat *:E只显示错误及以上级别的日志在排查崩溃时非常高效。组合过滤与格式化adb logcat -v time -s MyApp:D System.err:E-v time在每行日志前加上时间戳对于分析时序问题至关重要。MyApp:D显示标签为MyApp且优先级为Debug及以上的日志。System.err:E同时显示系统标准错误流中Error及以上的日志很多Java异常会打印到这里。清空与重定向adb logcat -c清空当前的日志缓冲区。adb logcat -d log.txt将当前缓冲区中的所有日志一次性导出到文件log.txt然后退出。适合在复现问题后立刻抓取。adb logcat -f /sdcard/log.txt将日志持续写入设备的/sdcard/log.txt文件。适合长时间压力测试时记录日志。踩坑记录默认情况下logcat缓冲区是环形的旧的日志会被新的覆盖。如果问题发生频率低你可能需要增大缓冲区。可以通过adb logcat -G 16M将主日志缓冲区增大到16MB需要设备有root权限或eng/userdebug版本。更常见的做法是在测试开始前执行adb logcat -c清空缓冲区然后立即开始复现操作。5.2 性能指标监控adb shell top实时查看进程的CPU和内存占用。类似于Linux的top命令。常用参数-d 2每2秒刷新一次-m 10显示前10个进程-s cpu按CPU排序。你可以通过adb shell top -d 1 | grep package_name来持续监控特定应用的资源消耗。adb shell dumpsys meminfo package_name或PID获取某个应用详细的内存快照。这是分析内存泄漏和内存使用的黄金命令。输出包括PSS (Proportional Set Size)实际使用的物理内存是评估内存占用的关键指标。私有脏内存仅属于该进程且被修改过的内存如Java堆。Heap Alloc/FreeJava堆的分配和空闲情况。各类别的内存明细Native Heap, Dalvik/ART Heap, .so mmap等。adb shell dumpsys gfxinfo package_name获取应用渲染性能数据。特别是对于**已启用“GPU渲染模式分析”或“Profile GPU Rendering”**的应用此命令会输出最近帧的渲染耗时分析UI卡顿的利器。你需要先在开发者选项里开启相关功能然后在应用内进行一段UI操作如滑动列表最后执行此命令获取数据。adb shell dumpsys batterystats获取详细的耗电统计。配合adb shell dumpsys battery和adb bugreport可以生成全面的功耗分析报告。adb shell procrank查看所有进程的内存占用排名VSS, RSS, PSS, USS。需要root权限但提供的信息比top更内存专精。adb shell vmstat 1每隔1秒输出一次系统级别的内存、进程、中断等统计信息。用于观察系统整体负载。6. 输入模拟与截图录屏自动化测试的基石adb可以模拟几乎所有的用户输入事件这是实现自动化测试或批量操作的核心。6.1 输入事件模拟adb shell input text “hello%sworld”向当前焦点输入框输入文本“hello world”%s代表空格。注意无法输入中文。adb shell input keyevent KEYCODE模拟按键事件。KEYCODE_HOMEHome键 (3)KEYCODE_BACK返回键 (4)KEYCODE_ENTER回车键 (66)KEYCODE_POWER电源键 (26)KEYCODE_VOLUME_UP音量加 (24)KEYCODE_VOLUME_DOWN音量减 (25)完整的键码列表可以通过adb shell input keyevent不加参数来查看会报错但列出列表或查阅Android官方文档。adb shell input tap x y在屏幕坐标(x, y)处模拟点击。坐标基于屏幕分辨率。获取坐标可以通过开发者选项中的“指针位置”功能。adb shell input swipe x1 y1 x2 y2 [duration(ms)]模拟滑动。从(x1, y1)滑动到(x2, y2)可选参数duration表示滑动耗时毫秒时间越长滑动越慢。常用于解锁屏幕、翻页等。adb shell swipe 500 1500 500 500 200 # 从底部中间快速上滑模拟返回桌面手势部分系统6.2 截图与录屏adb shell screencap -p /sdcard/screen.png截取当前屏幕保存为PNG图片到设备。通常紧接着用adb pull /sdcard/screen.png ./拉到电脑上查看。可以组合成一行命令adb shell screencap -p | sed ‘s/\r$//’ screen.png在Linux/macOS上直接保存到电脑且处理Windows换行符问题。adb shell screenrecord [options] output_file录制屏幕Android 4.4。常用选项--size 720x1280分辨率--bit-rate 4000000比特率默认4Mbps--time-limit 180最长秒数。例如adb shell screenrecord --verbose /sdcard/demo.mp4。录制过程中按CtrlC停止。重要限制screenrecord无法录制受DRM保护的内容如某些视频App和安全的屏幕如锁屏密码输入界面。7. 网络与高级调试解决连接与底层问题当应用行为与网络相关或者遇到更深层次的问题时你需要这些命令。7.1 网络状态模拟与查询adb shell ping -c 4 8.8.8.8测试设备到指定IP的网络连通性。adb shell netstat -tunlp查看网络连接状态、监听端口等信息部分设备可能需root或BusyBox。adb shell ifconfig或adb shell ip addr show查看网络接口配置信息IP地址等。模拟网络条件这是测试应用在网络异常情况下表现的关键。adb shell svc wifi enable/disable开启/关闭Wi-Fi。adb shell svc data enable/disable开启/关闭移动数据。adb shell settings put global airplane_mode_on 1然后adb shell am broadcast -a android.intent.action.AIRPLANE_MODE开启飞行模式需要两次命令。更精细的网络模拟如延迟、丢包、带宽限制通常需要root权限并使用tcTraffic Control命令或者在电脑端使用网络代理工具如Charles、Fiddler来实现。7.2 端口转发与反向代理adb forward tcp:本地端口 tcp:设备端口将本地主机上的一个TCP端口转发到设备的某个端口。adb forward tcp:8080 tcp:8080这常用于在电脑上直接访问设备中某个应用开启的调试服务如React Native的开发者菜单、某些本地数据库的Web管理界面。adb reverse tcp:设备端口 tcp:本地端口反向代理将设备上的某个端口请求转发到本地主机。这是Android 5.0以上版本才支持的功能极其有用。adb reverse tcp:8081 tcp:8081在React Native开发中这是让设备上的JavaScript代码连接到电脑上Metro Bundler服务的标准做法。也适用于让设备App访问你电脑本地运行的开发后端API。7.3 深入进程与调试adb shell ps或adb shell ps -A查看系统所有进程列表。结合grep查找特定应用进程adb shell ps -A | grep com.example。adb shell kill PID向指定进程发送终止信号。-9参数表示强制杀死。adb shell killall process_name杀死所有指定名称的进程。adb shell lsof列出被进程打开的文件需要root。在排查“文件被占用无法删除”等问题时有用。启用JNI检查adb shell setprop debug.checkjni 1。对于Native开发C/C开启后会在JNI调用时进行更严格的检查有助于发现潜在错误。重启应用生效。获取Bug报告adb bugreport。这个命令会收集设备在最近一段时间内的极其详细的系统状态、日志、诊断信息并打包成一个ZIP文件。当遇到非常复杂、难以复现的系统级或应用交互问题时提交一个完整的bugreport给有经验的开发者分析往往能发现问题的根源。文件通常较大生成需要几分钟。掌握这些命令你就能从“只会用IDE点按钮”的开发者进阶为能深入系统内部、精准定位问题的“外科医生”。真正的熟练来自于在真实问题场景中的反复运用。下次当你再遇到一个棘手的Bug时别急着搜答案先打开adb shell用它提供的工具亲自去系统里看一看、查一查。你会发现很多问题的答案其实就藏在那些命令行输出里。

相关资讯