Files
2026-01-15 18:21:00 +08:00

11 KiB
Raw Permalink Blame History

调试工具

目录


Logcat

Logcat简介

// LogcatAndroid 系统日志查看工具
// - 查看应用日志
// - 查看系统日志
// - 过滤和搜索日志
// - 保存日志文件

打开Logcat

// 方式1View → Tool Windows → Logcat
// 方式2点击底部 Logcat 标签
// 方式3Alt + 6Windows/Linux
//        Command + 6macOS

日志级别

// 日志级别(从低到高):
// - Verbose (V):详细日志
// - Debug (D):调试日志
// - Info (I):信息日志
// - Warn (W):警告日志
// - Error (E):错误日志
// - Assert (A):断言失败

Log.v(TAG, "Verbose message");
Log.d(TAG, "Debug message");
Log.i(TAG, "Info message");
Log.w(TAG, "Warning message");
Log.e(TAG, "Error message");
Log.wtf(TAG, "Assert message");

过滤日志

// 1. 按包名过滤
// 在 Logcat 顶部输入package:com.example.app

// 2. 按标签过滤
// 输入tag:MyTag

// 3. 按级别过滤
// 选择日志级别下拉菜单

// 4. 按文本过滤
// 输入搜索关键词

// 5. 组合过滤
// package:com.example.app tag:MyTag level:error

保存日志

// 1. 右键 Logcat 窗口
// 2. 选择 "Save Logcat to File"
// 3. 选择保存位置
// 4. 保存日志文件

清除日志

// 点击 Logcat 工具栏的清除按钮
// 或使用快捷键Ctrl + LWindows/Linux
//              Command + KmacOS

Debugger

断点调试

// 1. 设置断点
// 在代码行号左侧点击,或使用 Ctrl + F8Windows/Linux
//                                    Command + F8macOS

// 2. 启动调试
// 点击调试按钮,或使用 Shift + F9

// 3. 调试操作
// - 继续执行F9
// - 单步跳过F8
// - 单步进入F7
// - 单步跳出Shift + F8
// - 停止调试Ctrl + F2Windows/Linux
//            Command + F2macOS

断点类型

// 1. 行断点Line Breakpoint
// 普通断点,程序执行到该行时暂停

// 2. 条件断点Conditional Breakpoint
// 右键断点 → 设置条件
// 例如i > 10

// 3. 日志断点Logpoint
// 右键断点 → 选择 "More" → "Log evaluated expression"
// 输出日志但不暂停执行

// 4. 异常断点Exception Breakpoint
// Run → View Breakpoints → 添加异常断点
// 当抛出异常时暂停

调试窗口

// 1. Variables变量窗口
// - 显示当前作用域的所有变量
// - 可以查看和修改变量值

// 2. Watches监视窗口
// - 添加要监视的表达式
// - 实时显示表达式值

// 3. Frames调用栈窗口
// - 显示方法调用栈
// - 可以跳转到任意调用栈帧

// 4. Console控制台窗口
// - 显示应用输出
// - 可以执行表达式

表达式求值

// 在调试时:
// 1. 选择变量或表达式
// 2. 右键 → Evaluate Expression
// 3. 或使用 Alt + F8Windows/Linux
//        Option + F8macOS
// 4. 输入表达式并求值

Profiler

CPU Profiler

// 打开 CPU Profiler
// View → Tool Windows → Profiler
// 或 Run → Profile 'app'

// 功能:
// - 记录 CPU 使用情况
// - 分析方法调用
// - 查找性能瓶颈
// - 线程分析

// 使用步骤:
// 1. 启动应用
// 2. 点击 CPU 时间线
// 3. 选择记录方法Sampled 或 Instrumented
// 4. 点击 Record
// 5. 执行操作
// 6. 点击 Stop
// 7. 分析结果

Memory Profiler

// 打开 Memory Profiler
// View → Tool Windows → Profiler

// 功能:
// - 查看内存使用
// - 捕获堆转储
// - 查找内存泄漏
// - 分析对象分配

// 使用步骤:
// 1. 启动应用
// 2. 点击 Memory 时间线
// 3. 执行操作
// 4. 点击 Dump Java Heap
// 5. 分析内存使用
// 6. 查找内存泄漏

Network Profiler

// 打开 Network Profiler
// View → Tool Windows → Profiler

// 功能:
// - 监控网络请求
// - 查看请求详情
// - 分析网络性能
// - 查看请求时间线

// 使用步骤:
// 1. 启动应用
// 2. 点击 Network 时间线
// 3. 执行网络操作
// 4. 查看请求详情
// 5. 分析网络性能

Energy Profiler

// 打开 Energy Profiler
// View → Tool Windows → Profiler

// 功能:
// - 监控电量使用
// - 分析电量消耗
// - 查找耗电问题

// 使用步骤:
// 1. 启动应用
// 2. 点击 Energy 时间线
// 3. 执行操作
// 4. 分析电量使用

Layout Inspector

打开Layout Inspector

// 方式1Tools → Layout Inspector
// 方式2View → Tool Windows → Layout Inspector

// 要求:
// - 应用必须运行在 Android 5.0+ 设备上
// - 启用 USB 调试

功能

// 1. 查看视图层次
// - 显示完整的视图树
// - 可以展开和折叠节点

// 2. 查看视图属性
// - 显示所有视图属性
// - 可以查看属性值

// 3. 查看视图边界
// - 在设备上高亮显示视图
// - 查看视图位置和大小

// 4. 实时更新
// - 可以实时查看布局变化
// - 支持交互式调试

使用步骤

// 1. 启动应用
// 2. 打开 Layout Inspector
// 3. 选择设备和应用进程
// 4. 点击 "Capture Layout"
// 5. 查看布局层次和属性
// 6. 点击视图节点查看属性
// 7. 在设备上高亮显示视图

其他调试工具

ADBAndroid Debug Bridge

# 查看连接的设备
adb devices

# 查看日志
adb logcat

# 安装应用
adb install app.apk

# 卸载应用
adb uninstall com.example.app

# 启动Activity
adb shell am start -n com.example.app/.MainActivity

# 发送广播
adb shell am broadcast -a com.example.ACTION

# 查看应用信息
adb shell dumpsys package com.example.app

# 查看内存信息
adb shell dumpsys meminfo com.example.app

StrictMode

// StrictMode检测主线程中的违规操作
// 在 Application 或 Activity 中启用

if (BuildConfig.DEBUG) {
    StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
        .detectAll()
        .penaltyLog()
        .penaltyDeath()
        .build());
    
    StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
        .detectAll()
        .penaltyLog()
        .penaltyDeath()
        .build());
}

LeakCanary

// LeakCanary内存泄漏检测工具

// 1. 添加依赖
dependencies {
    debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.12'
}

// 2. 自动集成(无需代码)
// LeakCanary 会自动检测内存泄漏
// 当检测到泄漏时,会显示通知

Systrace

# Systrace系统级性能分析工具

# 1. 开始跟踪
python systrace.py --time=10 -o trace.html sched freq idle am wm gfx view binder_driver hal dalvik camera input res

# 2. 在设备上执行操作
# 3. 停止跟踪
# 4. 查看 trace.html

Hierarchy Viewer

// Hierarchy Viewer查看视图层次和性能
// 已弃用,推荐使用 Layout Inspector

GPU Profiler

// GPU Profiler分析 GPU 性能
// 在开发者选项中启用:
// Settings → Developer Options → Profile GPU Rendering → On screen as bars

调试技巧

1. 使用日志标签

// 定义日志标签
private static final String TAG = "MainActivity";

// 使用日志
Log.d(TAG, "onCreate: Activity created");
Log.d(TAG, "onCreate: savedInstanceState = " + savedInstanceState);

2. 条件断点

// 设置条件断点
// 例如:只在 i > 10 时暂停
// 右键断点 → 设置条件i > 10

3. 日志断点

// 使用日志断点代替 System.out.println
// 右键断点 → More → Log evaluated expression
// 输入i = $i, value = $value

4. 异常断点

// 设置异常断点
// Run → View Breakpoints → 添加异常断点
// 选择异常类型(如 NullPointerException

5. 远程调试

// 使用 ADB 进行远程调试
// 1. 连接设备
// 2. 启用 USB 调试
// 3. 在 Android Studio 中选择设备
// 4. 启动调试

6. 多进程调试

// 调试多进程应用
// 1. Run → Edit Configurations
// 2. 选择 "Debugger" 标签
// 3. 选择 "Auto" 或特定进程

7. 使用条件日志

// 只在调试模式下输出日志
if (BuildConfig.DEBUG) {
    Log.d(TAG, "Debug message");
}

8. 性能分析技巧

// 1. 使用 CPU Profiler 查找性能瓶颈
// 2. 使用 Memory Profiler 查找内存泄漏
// 3. 使用 Network Profiler 优化网络请求
// 4. 使用 Energy Profiler 优化电量消耗

常见问题

问题1Logcat不显示日志

// 解决方案:
// 1. 检查设备连接
// 2. 选择正确的设备和进程
// 3. 检查日志级别过滤
// 4. 清除日志并重新查看
// 5. 重启 Logcat

问题2断点不生效

// 解决方案:
// 1. 确保使用 Debug 构建变体
// 2. 检查代码是否被混淆
// 3. 重新编译项目
// 4. 检查断点是否在可执行代码行
// 5. 清除断点并重新设置

问题3调试器无法连接

// 解决方案:
// 1. 检查设备连接
// 2. 检查 USB 调试是否启用
// 3. 重启 ADBadb kill-server && adb start-server
// 4. 检查防火墙设置
// 5. 重新连接设备

问题4Profiler无法启动

// 解决方案:
// 1. 确保设备运行 Android 5.0+
// 2. 检查应用是否正在运行
// 3. 检查设备连接
// 4. 重启 Android Studio
// 5. 检查 Profiler 插件是否启用

问题5内存泄漏检测不准确

// 解决方案:
// 1. 等待足够长时间让 GC 运行
// 2. 多次触发可能导致泄漏的操作
// 3. 使用 Memory Profiler 手动分析
// 4. 检查 LeakCanary 配置

调试最佳实践

1. 使用合适的日志级别

// Verbose详细调试信息
Log.v(TAG, "Detailed debug info");

// Debug一般调试信息
Log.d(TAG, "Debug info");

// Info重要信息
Log.i(TAG, "Important info");

// Warn警告信息
Log.w(TAG, "Warning");

// Error错误信息
Log.e(TAG, "Error", exception);

2. 避免在生产环境输出敏感信息

// 使用 BuildConfig.DEBUG 控制日志输出
if (BuildConfig.DEBUG) {
    Log.d(TAG, "Sensitive info: " + sensitiveData);
}

3. 使用有意义的日志标签

// 使用类名作为标签
private static final String TAG = MainActivity.class.getSimpleName();

4. 定期检查性能

// 定期使用 Profiler 检查应用性能
// - CPU 使用率
// - 内存使用
// - 网络请求
// - 电量消耗

5. 使用自动化测试

// 使用单元测试和集成测试
// 在 CI/CD 中自动运行测试
// 使用 Espresso 进行 UI 测试

总结

Android 提供了丰富的调试工具,熟练掌握这些工具可以大大提高开发效率和问题排查能力。建议:

  1. 熟悉 Logcat 的使用
  2. 掌握断点调试技巧
  3. 定期使用 Profiler 分析性能
  4. 使用 Layout Inspector 调试布局
  5. 结合 ADB 进行高级调试

最后更新2024年