调试与性能分析
掌握 Android Studio 的调试和性能分析工具:断点、Logcat、Timber、Memory Profiler、LeakCanary、CPU Profiler、Network Inspector 和 Layout Inspector。
调试与性能分析 是 CoddyKit 上的免费 Android Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Android Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Android Academy 课程共包含 4 节课。
调试概览
调试是查找和修复错误的过程。Android Studio 提供了强大的工具:
- 调试器 — 暂停执行、检查变量、逐步执行代码
- Logcat — 来自设备的实时日志输出
- 布局检查器 — 检查实时用户界面层次结构
- Android 性能分析器 — 分析 CPU、内存和网络
- 数据库检查器 — 实时查看和查询 Room 数据库
Logcat — 您的第一个调试工具
使用 Log 将消息输出到 Logcat。使用 TAG 过滤日志:
import android.util.Log
class UserRepository {
companion object {
private const val TAG = "UserRepo"
}
fun fetchUsers() {
Log.d(TAG, "fetchUsers() called") // Debug
Log.i(TAG, "Fetching ${users.size} users") // Info
Log.w(TAG, "Cache is empty") // Warning
Log.e(TAG, "Network error: $exception") // Error
}
}Timber — 更好的日志记录
Timber 是对 Log 的轻量封装,会从发布构建中移除日志调用,并自动将类名添加为 TAG:
// app/build.gradle:
// implementation 'com.jakewharton.timber:timber:5.0.1'
// In Application.onCreate():
if (BuildConfig.DEBUG) {
Timber.plant(Timber.DebugTree())
}
// Usage anywhere in the app (no TAG needed):
Timber.d("User loaded: %s", user.name)
Timber.e(exception, "Failed to fetch data")
Timber.w("Cache miss for key: %s", key)断点和调试器
在 Android Studio 中使用断点进行调试的步骤:
- 点击代码行旁边的代码槽(左侧边距)— 此时会出现一个红点
- 使用调试(小虫图标)而不是“运行”来启动应用
- 执行到断点时,程序会暂停
- 在变量窗格中检查变量
- 使用单步跳过(F8)逐行执行,使用单步进入(F7)进入函数
计算表达式
在断点处暂停时,使用计算表达式(Alt+F8)在当前作用域中运行 Kotlin 代码。无需重启即可验证假设:
- 检查
list.size和user.email.isNotBlank() - 调用任意方法并查看返回值
- 直接检查复杂对象
内存性能分析器
使用内存性能分析器(查看 → 工具窗口 → 性能分析器)查找内存泄漏:
- 观察堆大小随时间的变化 — 持续增长通常意味着可能存在泄漏
- 强制执行垃圾回收,观察内存是否减少
- 生成堆转储,查看当前存活的对象
- 查找本应已被垃圾回收的 Activity 或 Fragment 实例
LeakCanary — 自动检测泄漏
LeakCanary 会自动检测内存泄漏,并在调试构建中以通知的形式报告:
// app/build.gradle:
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.12'
// That's it — no code changes needed!
// LeakCanary auto-installs via ContentProvider.
// When a leak is detected, it shows a notification with the leak trace.
// Common causes to watch for:
// - Static references to Context/Activity
// - Not releasing ViewBinding in onDestroyView()
// - Listeners registered to singletons but not unregisteredCPU 性能分析器
使用CPU 性能分析器查找性能瓶颈:
- 执行某项操作时录制跟踪信息
- 查看火焰图,了解哪些方法耗时最长
- 查找主线程上运行时间过长的任务 — 这会导致界面卡顿
- 将繁重的计算移至
Dispatchers.IO或Dispatchers.Default
网络检查器
网络检查器会实时显示应用发出的所有 HTTP 调用:
- 查看请求 URL、方法、请求头和请求体
- 查看响应代码、响应体和耗时
- 识别缓慢或失败的请求
- 开箱即用地支持 OkHttp(Retrofit 使用的网络库)
通过查看 → 工具窗口 → 应用检查 → 网络检查器访问。
数据库检查器
在正在运行的设备上实时检查和查询 Room 数据库:
- 查看表及其内容
- 运行自定义 SQL 查询
- 使用应用时观察数据变化
通过应用检查 → 数据库检查器访问。API 26 及更高版本支持 Room。
布局检查器
布局检查器会显示用户界面层次结构的实时三维视图:
- 选择任意视图,查看其属性(外边距、内边距、文本和颜色)
- 发现重叠的视图或错误的可见性设置
- 无需猜测即可调试布局问题
通过查看 → 工具窗口 → 布局检查器访问。连接到设备或模拟器上正在运行的应用。
StrictMode
StrictMode 会检测主线程上意外发生的慢速操作(磁盘读取、网络调用),并在调试构建中记录日志或使应用崩溃:
// In Application.onCreate() — debug builds only:
if (BuildConfig.DEBUG) {
StrictMode.setThreadPolicy(
StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork()
.penaltyLog() // log violations instead of crashing
.build()
)
}快速检查
在 Android 调试构建中,无需额外代码就能自动检测内存泄漏的工具是什么?
回顾:调试与性能分析
高效地查找并修复问题:
- Logcat + Timber — 轻量级日志记录,发布时自动移除
- 断点 + 调试器 — 暂停并检查实时执行过程
- 内存性能分析器 — 检测堆增长和内存泄漏
- LeakCanary — 通过堆栈跟踪自动检测泄漏
- CPU 性能分析器 — 查找主线程上的慢速方法
- 网络检查器 — 监控 HTTP 调用
- 数据库检查器 — 实时查询 Room
- StrictMode — 捕获意外的主线程 IO
恭喜您 — 您已经完成了完整的 Android 开发课程!
常见问题解答
「调试与性能分析」课时是免费的吗?
是的 — 「调试与性能分析」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Android Academy 课程的其余内容,请升级到 CoddyKit PRO。 Android Academy 课程共包含 4 节课。
「调试与性能分析」这节课中我会学到什么?
掌握 Android Studio 的调试和性能分析工具:断点、Logcat、Timber、Memory Profiler、LeakCanary、CPU Profiler、Network Inspector 和 Layout Inspector。 你通过在浏览器中直接运行的动手代码来练习 Android Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Android Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Android Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「调试与性能分析」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Android Academy 课中编写并运行代码吗?
能。每节 Android Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。