8.2 Logcat排查与真机模拟器测试


8.2 Logcat 排查与真机模拟器测试

本节摘要:Logcat 让看不见的执行路径现形,级别、标签、过滤三件套把日志从洪流变成探针;断点步进处理更深的疑难;模拟器多环境快扫加真机真实手感组成双轨验证。本节修好"点击提交无反应"的静默失败,为猜数字 App 收官。

先立规矩:日志三件套

故障现象:点了"提交",界面毫无反应,也不崩溃——最麻烦的静默失败。排这类问题靠猜是灾难,埋点测量是正道。但先立日志的规矩,否则调试日志本身会成为新的噪音:

private const val TAG = "GuessGame" Log.d(TAG, "doGuess entered, raw=${binding.etGuess.text}") Log.i(TAG, "parsed guess=$guess") Log.w(TAG, "parse failed, guess is null") Log.e(TAG, "unexpected state", someException)

三件套各自的作用:标签用常量 TAG 收拢(这里 GuessGame),过滤时一眼锁定自己的日志;级别按语义选——d 是开发流水账、i 是关键节点、w 是可恢复异常、e 是真错误,级别不是随便挑的装饰,过滤"只看警告以上"时全靠它;克制是第三件,发布版 BuildConfig.DEBUG 包住 d 级日志,别让用户手机刷你的流水账。

过滤与定位

Logcat 面板底部或侧栏的过滤框敲 tag:GuessGame,世界瞬间清净,只剩自己的日志。埋好点重跑故障:d 行出现了(按钮监听器触发正常),w 行跟着出现——输入解析返回了 null,when 的 null 分支里 Toast 写的是别的页面上下文,提示没显示出来。病根找到:静默不是没执行,是执行了但反馈丢失。修复后日志链完整成对出现 d 与 i,故障闭环。

这套埋点还能顺手验证 7.3 节的复用承诺:

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VH { Log.d(TAG, "create ViewHolder") ... } override fun onBindViewHolder(holder: VH, position: Int) { Log.d(TAG, "bind position=$position") ... }

滚动百条战绩,create 只打出十来行、bind 连绵不绝——回收复用从课本结论变成你亲眼所见的日志证据,这种"自己量出来的知识"比背下来的牢固十倍。

更深的疑难交给断点:代码行号旁点一下出现红点,Debug 按钮启动,运行到断点暂停,F8 单步、变量面板实时看值。什么时候用断点不用日志?交互复杂、一步停不住的场景——比如监听器回调链里某变量莫名变值,日志插桩要改三轮代码,断点停一次全看到了。日常排错日志优先,深度解剖断点收尾。

图:静默失败的排查路径

图:静默失败的排查路径

双轨验证:模拟器与真机

功能修完,最后一关是验证。模拟器的价值是广度:Device Manager 一键开不同分辨率、不同系统版本的设备,横竖屏、深色模式、中文超长文案一轮扫过,兼容性问题在桌面阶段收割;快照功能保存"已登录、有十条战绩"的状态,复测不必每次从零造数据。真机的价值是深度:真实触控延迟、真实屏幕色彩、真实性能档位——开发者选项连上 USB(设置里连点七次版本号解锁,打开 USB 调试),Logcat 与断点全部照常可用。模拟器上丝滑的滑动在低端真机上掉帧、预览里漂亮的颜色在 OLED 屏上过饱和,这类问题只有真机会说真话。

双轨分工的心法一句:模拟器扫场景矩阵,真机校体验手感,上线前的最后一小时永远留给真机。

收官与去向

八章至此闭环:从一块空屏幕,到组件、布局、事件、主题、模式、调试,猜数字 App 走完了第一个 App 的完整养成。带走的不是这个 App,是方法论——层级思维看界面、约束思维摆位置、两拍节奏接事件、令牌化管样式、复用思维造列表、别猜去量修问题。往后无论遇到 Jetpack Compose 还是更深的框架,这套地基都直接复用。

本节要点回顾

  • 日志三件套:TAG 收拢、级别按语义、发布版包住 d 级。
  • 过滤定位断点:tag: 过滤看链断在哪,深度疑难上断点。
  • 埋点可证复用:create 十行 bind 连绵,亲手量出 RecyclerView 的承诺。
  • 模拟器扫广度:分辨率、系统版本、横竖、深色一轮收割。
  • 真机校深度:延迟、色彩、性能只有真机说真话,上线前必过。

三个调试追问

日志里全是别人的消息怎么办? 过滤是第一生产力:tag: 锁定自家标签、package: 只看本应用、level: 只收警告以上,三个过滤器组合能把千行洪流压到十行干货。反向过滤同样有用——排除法确认"我的日志确实没打出来"本身就是证据。

崩溃日志从哪里看? Logcat 里级别选 Error 或直接搜 FATAL,崩溃现场会带完整的调用栈,最顶上几行标着你的包名的就是案发现场。读栈是从下往上找你自己的代码行号,再往下看异常类型与消息——八成崩溃在这一眼里就能定性。

模拟器和真机调试结论冲突信谁? 分类型:界面布局与兼容性问题,模拟器的多环境矩阵更有统计意义;触控手感、滑动惯性、性能与耗电,真机一票否决。冲突本身是信息——它提示这个 bug 可能跟设备特性强相关,记录下来按维度归档,是项目测试资产的起点。

工具链的最后一环是习惯而非软件:给项目立一条"任何静默失败必须先埋日志再排查"的军规,能救回无数个盯着代码发呆的小时;再立一条"修完的 bug 写一行结论进笔记",三个月后同类问题复发时,你的笔记比搜索引擎快十倍。工具会迭代,这两条习惯不会过时。

本章也是全册方法论的总收口:别猜去量,量的对象从界面(Inspector 量测量值)到逻辑(Logcat 量执行路径)再到体验(真机量手感),一把尺子换了三次刻度。把这句口诀带走,本册的调试章就没有白读。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U