Android常用的adb和logcat命令
ADB
ADB,即 Android Debug Bridge 是一种允许模拟器或已连接的 Android 设备进行通信的命令行工具,它可为各种设备操作提供便利,如安装和调试应用,并提供对 Unix shell(可用来在模拟器或连接的设备上运行各种命令)的访问。
adb简单命令
//查看版本
adb version
//查看已经连接的设备和开始连接设备命令
adb devices
adb connect
adb应用命令
//查看所有应用
adb shell pm list packages
//查看系统应用
adb shell pm list packages -s
// 查看第三方应用
adb shell pm list packages -3
// 查看前台 Activity
adb shell dumpsys activity activities | grep mFocusedActivity//查看正在运行的 Services
adb shell dumpsys activity services [<package-name>]
// 查看应用详细信息
adb shell dumpsys package <package-name>
// 查看应用安装路径
adb shell pm path <package-name>
1.WLAN 连接
借助 USB 通过 WiFi 连接来正常使用 adb 需要以下步骤:
操作步骤:
- 将 Android 设备与要运行 adb 的电脑连接到同一个 WiFi。
- 将设备与电脑通过 USB 线连接(可通过 adb devices 命令查看设备连接情况)。
- 通过 adb tcpip 5555 命令让设备在 5555 端口监听 TCP/IP 连接。
- 断开 USB 连接。
- 找到设备的 IP 地址(可以在「设置」-「关于手机」-「状态信息」-「IP地址」查看 IP 地址)。
- 通过 adb connect <device-ip-address> 命令使用 IP 地址将 Android 设备与电脑连接。
- 通过 adb devices 命令查看设备连接情况。
- 使用完毕后可通过 adb disconnect <device-ip-address> 命令断开无线连接。
2.adb抓取ANR日志
1. 复现 ANR 并获取错误报告
当应用出现 ANR 时,系统会生成错误报告并存储在设备中。可通过以下方式获取:
方法一:从设备直接导出
使用 ADB 拉取 ANR 日志:
adb pull /data/anr/traces.txt ~/Desktop/anr_traces.txt
ANR 日志通常存储在 /data/anr/traces.txt
,包含应用卡死时的线程堆栈信息。
查看日志时间戳:
日志中会按时间顺序记录多个 ANR 事件,找到最新的时间戳(通常在文件末尾),确认与复现的问题匹配。
2.ADB 调试分析设备尺寸和分辨率
- 查看当前分辨率5:
使用命令adb shell wm size
,执行后会输出设备当前的屏幕分辨率,如Physical size: 1080x1920
,若设备支持双分辨率,可能会显示Override size:2610x1920
等信息。
- 设置分辨率5:
若要修改分辨率,可使用命令adb shell wm size <宽度>x<高度>
,例如将分辨率设置为 720x1280,可输入adb shell wm size 720x1280
。
设置完成后,通常需要重启设备以使设置生效,可使用命令adb reboot
。若要恢复原始分辨率,执行adb shell wm size reset
即可。
- 获取屏幕像素密度4:
使用命令adb shell wm density
,可查看屏幕的像素密度,单位为 dpi(dots per inch)。也可通过adb shell wm density <数值>
来设置像素密度,如adb shell wm density 160
,并使用adb shell wm density reset
恢复默认像素密度。
- 获取有效显示区域6:
获取到设备的物理分辨率后,还可进一步计算有效显示区域。
首先使用adb shell dumpsys window | grep -i 'statusbar'
获取状态栏高度,使用adb shell dumpsys window | grep -i 'navigation'
获取导航栏高度。
假设状态栏高度为statusBarHeight
,导航栏高度为navigationBarHeight
,屏幕宽度为screenWidth
,屏幕高度为screenHeight
,则有效显示区域宽度为screenWidth
,有效高度为screenHeight - statusBarHeight - navigationBarHeight
。
3. 分析 ANR 日志内容
ANR 日志包含关键信息,重点关注以下部分:
(1)基本信息
Reason:ANR 原因,常见类型:
Input dispatching timed out
:输入事件(如点击、触摸)处理超时
Service timeout
:Service 在主线程执行耗时操作(超过 20 秒)。
ContentProvider timeout
:ContentProvider 初始化超时(超过 10 秒)。
(2)主线程堆栈
日志中会显示 main
线程的调用栈,查看正在执行的方法:
"main" prio=5 tid=1 Blocked| group="main" sCount=1 dsCount=0 flags=1 obj=0x73b2c3c0 self=0x7f8a1c0000| sysTid=12345 nice=0 cgrp=default sched=0/0 handle=0x7f8a3009e0| state=S schedstat=( 0 0 0 ) utm=12 stm=3 core=0 HZ=100| stack=0x7fe5d1c000-0x7fe5d1e000 stackSize=8MB| held mutexes=at android.os.MessageQueue.nativePollOnce(Native method)- waiting to lock <0x12345678> (a android.os.MessageQueue) held by thread 2at android.os.MessageQueue.next(MessageQueue.java:326)at android.os.Looper.loop(Looper.java:181)at android.app.ActivityThread.main(ActivityThread.java:7050)...
重点排查:
是否在主线程执行网络请求、文件读写等耗时操作。
是否存在死锁(多个线程互相等待锁释放)。
(3)CPU 使用率
日志会显示系统和应用的 CPU 使用情况,判断是否因资源耗尽导致 ANR:
CPU usage from 0ms to 5000ms later:100% 12345/com.example.app: 90% user + 10% kernel20% 12346/RenderThread: 15% user + 5% kernel
Logcat
Android Studio 中的 Logcat 窗口是调试应用的重要工具,其核心功能在于实时显示来自设备或模拟器的日志信息,包括应用通过Log
类添加的自定义消息、系统服务运行记录(如垃圾回收),以及应用抛出异常时带代码行链接的堆栈跟踪,能高效帮助开发者定位问题。
默认情况下日志会自动滚动到末尾,点击或滚动鼠标可暂停该功能,如需恢复,可点击工具栏的 “Scroll to the End” 图标;同时,工具栏还提供清除、暂停、重启日志等基础操作选项。
每条日志条目包含丰富信息,涵盖日期、时间戳、进程及线程 ID、标签、包名称、优先级(如FATAL
ERROR
WARNING
等)和具体消息,不同标签有独特颜色,便于区分日志类型。
1.优先级,日志优先级从低到高分以下几种
v -verbose 最低级别,开发调试中的一些详细信息,仅在开发中使用,不可出现在发布的产品中
D- debug 用于调试的信息,可以在与发布中关闭,比较常见
I -info 一般提示性的消息
W- warming 警告日志
E- error 错误:已经出现可影响运行的错误,比如crash时候输出的日志
首先是基础的键值筛选逻辑,Logcat 支持多种关键键名,每种键对应特定的筛选维度。
比如tag
键用于匹配日志条目的标签字段,package
键针对日志所属应用的包名,level
键可筛选出优先级大于或等于指定级别的日志(如level:INFO
会包含INFO
WARNING
ERROR
等更高优先级的日志,且级别不区分大小写),age
键则根据时间戳筛选,格式为age:<数字><单位>
(s
秒、m
分钟、h
小时、d
天),像age:30s
就是筛选过去 30 秒的日志,不过需注意时间对比以主机时间为准,设备时间错误可能影响结果。此外,还有is:crash
(匹配应用崩溃日志)、is:stacktrace
(匹配 Java 堆栈跟踪)等特殊键,进一步拓展筛选场景。
2.查询中使用的常用键:
tag
:与日志条目的 tag
字段匹配。
package
:与日志记录应用的软件包名称匹配。
process
:与日志记录应用的进程名称匹配。
message
:与日志条目的消息部分匹配。
level
:与指定或更高严重级别的日志匹配,例如 DEBUG
。
age
:如果条目时间戳是最近的,则匹配。值要指定为数字,后跟表示时间单位的字母:s
表示秒,m
表示分钟,h
表示小时,d
表示天。例如,age: 5m
只会过滤过去 5 分钟内记录的消息。
其次是高级筛选语法,让筛选更精准灵活。否定筛选通过在键名前加-
实现,例如-tag:MyTag
可排除所有标签为MyTag
的日志;正则表达式匹配则在键名后加~
,如tag~:My.*Tag
能匹配标签以My
开头、Tag
结尾的日志,且否定与正则可组合,如-tag~:My.*Tag
表示排除符合该正则的标签日志。
逻辑运算符方面,&
代表 “与”、|
代表 “或”,且支持括号改变优先级,比如(tag:foo | level:ERROR) & package:mine
表示筛选标签为foo
或级别为ERROR
,且包名为mine
的日志;若未显式使用运算符,多个非否定条件默认按 “或” 处理(如tag:foo tag:bar
等价于tag:foo | tag:bar
),含否定条件则默认按 “与” 处理(如tag:foo -tag:bar
等价于tag:foo & -tag:bar
)。
最后是查询的管理与优化,查询历史可通过点击查询字段旁的 “Show history” 查看,方便复用之前的筛选条件;点击历史记录旁的星号可将查询收藏,使其在所有项目中保留;使用name:
键为查询命名(如name:MyFilter tag:foo
),能在历史记录中快速识别,提升筛选效率。这些功能结合起来,让开发者能根据具体调试需求,快速定位所需日志信息。
整体总结:
ADB(Android Debug Bridge)是一种允许模拟器或已连接的 Android 设备进行通信的命令行工具,可提供安装和调试应用、访问 Unix shell 等设备操作便利,其简单命令包括查看版本(adb version)、查看和连接设备(adb devices、adb connect)等,应用命令有查看所有 / 系统 / 第三方应用(adb shell pm list packages 及带 - s、-3 参数)、查看前台 Activity、正在运行的 Services、应用详细信息和安装路径等;
借助 USB 通过 WiFi 连接 ADB 需将设备与电脑连同一 WiFi、用 USB 线连接后通过 adb tcpip 5555 让设备在 5555 端口监听 TCP/IP 连接,断开 USB 后找到设备 IP,用 adb connect <device-ip-address>连接,结束后用 adb disconnect 断开;抓取 ANR 日志可通过 adb pull /data/anr/traces.txt ~/Desktop/anr_traces.txt 拉取,日志包含基本信息(如 ANR 原因)、主线程堆栈和 CPU 使用率等关键内容;
Logcat 是 Android Studio 中调试应用的重要工具,可实时显示设备或模拟器日志,包含日期、时间戳等丰富信息,日志优先级从低到高为 v(verbose)、D(debug)、I(info)、W(warming)、E(error),支持通过 tag、package 等键进行筛选,还有否定筛选、正则表达式匹配、逻辑运算符等高级筛选语法,以及查询历史管理、收藏等功能,助力开发者快速定位所需日志信息。