调试是每个 Android 开发者必须掌握的核心技能。高效的调试不仅能帮你快速定位 Bug,还能帮你深入理解代码的运行逻辑。本文将系统地介绍 Android Studio 强大的调试工具,从基础操作到进阶技巧。
1. 启动调试模式
你可以通过两种方式开始调试:
- 直接调试启动 (Debug App):
-
- 点击工具栏上的绿色"小虫子"图标
。 - 或者按下快捷键
Shift + F9(Mac:Control + D)。 - 适用场景:应用尚未启动,或者你想从应用启动的第一刻就开始追踪。
- 点击工具栏上的绿色"小虫子"图标
- 附加调试器 (Attach Debugger to Android Process):
-
- 如果应用已经在运行,点击工具栏上的"带有箭头的手机和小虫子"图标
。 - 在弹出的进程列表中选择你的应用进程。
- 适用场景:应用已经在运行,突然发现异常,不想重启应用。
- 如果应用已经在运行,点击工具栏上的"带有箭头的手机和小虫子"图标
2. 断点 (Breakpoints):不仅仅是暂停
断点是调试的核心。在代码行号旁边的灰色区域点击,会出现一个红点,这就是行断点。但 Android Studio 的断点功能远不止于此。
2.1 基础断点
程序运行到这一行会暂停(Suspend)。
2.2 条件断点 (Conditional Breakpoints)
- 场景:代码在循环中执行了 1000 次,你只想看第 500 次或者某个特定变量值时的状态。
- 操作 :右键点击红点 -> 在
Condition输入框中写 Kotlin/Java 表达式(如count == 10)。 - 效果 :只有当表达式为
true时,程序才会暂停。

2.3 日志断点 (Non-suspending / Logging Breakpoints)
- 场景 :你想看某个变量的值,但不想重新编译代码加
Log.d,也不想让程序暂停打断操作流。 - 操作 :右键点击断点 -> 取消勾选
Suspend-> 勾选Evaluate and log-> 输入想打印的内容(如"Current value: $code")。 - 效果 :程序经过该行时不会暂停 ,但会在控制台(Console)输出日志。神器!

2.4 异常断点 (Exception Breakpoints)
- 场景 :程序崩溃了,但你不知道具体在哪一行崩的,或者被
try-catch吞掉了。 - 操作 :在断点管理面板(
Ctrl+Shift+F8/Cmd+Shift+F8)中,点击+号 ->Java Exception Breakpoints。 - 效果:当发生特定异常(即使被捕获)时,调试器会自动暂停在抛出异常的那一行。

3. 调试控制台与变量观察
当程序暂停时,Debug 面板会激活。
3.1 变量区 (Variables)
- 显示当前作用域内的所有变量值。
- Inline Debugging:Android Studio 会直接在代码编辑器右侧显示变量的当前值,非常直观。

3.2 监视区 (Watches)
- 如果 Variables 区东西太多,或者你想看一个复杂的表达式(如
list.size + 10),可以点击 Variables 面板上的+号,或者右键选择Add to Watches。 - 这里的值会随着单步调试实时更新。

3.3 表达式求值 (Evaluate Expression)
- 快捷键 :
Alt + F8(Mac:Option + F8)。 - 功能:这是调试器最强大的功能之一。你可以在当前上下文执行任意代码:
-
- 查看变量:
user.address - 调用方法:
user.isValid() - 甚至修改数据 :
price = "546"(这会直接改变运行时的内存数据,方便模拟边界情况)。
- 查看变量:

4. 单步调试 (Stepping)
控制程序一步步执行,观察逻辑流向。
|------------------------------------------------------------------------------------------------------------|---------------------|-------------------|----------------------------------------------|
| 图标描述 | 名称 | 快捷键 (Windows/Mac) | 作用 |
| 折线箭头 (Step Over)
| Step Over | F8 | 步过 。执行当前行,如果当前行有函数调用,不进入函数内部,直接到下一行。 |
| 向下箭头 (Step Into)
| Step Into | F7 | 步入 。如果当前行有函数调用,进入该函数内部查看细节。 |
| 红色箭头 (Force Step Into)
| Force Step Into | Alt + Shift + F7 | 强制步入。即使是系统源码或第三方库(通常会被忽略),也强制进入。 |
| 向上箭头 (Step Out)
| Step Out | Shift + F8 | 步出。执行完当前函数的剩余代码,返回到调用该函数的地方。 |
| 播放按钮 (Resume)
| Resume Program | F9 / Cmd+Opt+R | 恢复运行。直接运行到下一个断点,如果没有断点则一直运行。 |
5. 进阶技巧:分析堆栈与线程
5.1 线程切换 (Frames)
在 Debug 面板左侧的 Frames 区域,你可以看到当前的调用堆栈。
- 点击堆栈中的不同行,可以"时光倒流"查看上层调用者的局部变量状态(注意:这只是查看,程序指针依然停在断点处)。
- 通过下拉菜单,可以切换查看不同线程的状态,这在调试并发问题(如死锁、线程同步)时至关重要。
5.2 渲染调试 (Layout Inspector)
虽然不是传统断点调试,但 Layout Inspector 是调试 UI 的利器。
- 入口 :
Tools->Layout Inspector。 - 功能:实时查看 View 树结构、属性、甚至 Compose 的重组次数(Recomposition Counts)。
6. 总结
调试不仅仅是修 Bug,更是阅读代码、验证猜想的过程。
- 善用日志断点,避免反复编译。
- Evaluate Expression 是修改运行时状态的神器。
- 条件断点 能帮你从海量循环中精准定位问题。
掌握这些技巧,你的开发效率将得到质的飞跃。