4. 开发环境准备:Android Studio、adb、日志工具

好,环境准备好了,咱们开始动手。这一章其实挺重要的——很多卡顿问题查不出来,不是因为技术不行,而是工具没配好。

我自己吃过这个亏。有次花了两天没找到MediaCodec启动慢的原因,最后发现是adb版本太旧,输出日志不全。嗯,从那以后,每次新项目我都会先检查一遍环境。

这一章咱们把三样东西搞定:Android Studio、adb、日志分析工具。说白了,就是给你配齐“诊断仪器”。

知识点总结:
- Android Studio:编译、调试、性能分析
- adb:设备通信、日志抓取、文件操作
- 日志工具:logcat、bugreport、systrace、Perfetto

4.1 Android Studio 配置要点

Android Studio 是主力IDE,但很多人装完就忘了配置SDK和NDK。MediaCodec调试经常需要native层符号,所以NDK必须带上。

SDK Manager 中的关键项

  • Android SDK Platform(目标版本 + 调试版本)
  • NDK(>=21,建议23+)
  • CMake & LLDB
  • Android Emulator(如果需要模拟器测)

我个人习惯是把 SDK 路径设到 D 盘或单独分区,方便重装系统不丢。你想想看,万一系统崩了,SDK 重下一遍多浪费时间。

避坑小技巧:我曾经遇到过Android Studio报“No matching variant of project”错误,最后发现是 NDK 版本和 AGP 不匹配。建议用最新稳定版 AGP 配合 NDK 26。

Gradle 构建配置

MediaCodec 相关项目,建议在 build.gradle 里加上这些:

android {
    compileSdk 34
    ndkVersion "26.1.10909125"
    defaultConfig {
        minSdk 23         // MediaCodec API 最低要求
        targetSdk 34
    }
    buildFeatures {
        prefab true       // 用于 native 库依赖
    }
}

注意 targetSdk 别太高,有些厂商设备对高版本 MediaCodec 行为有差异。我测试过某米手机 targetSdk 34 下 MediaCodec 启动慢了 30%,换回 30 就好了。这里面的坑,后面章节会细说。

4.2 adb 命令行工具

adb 是调试利器,没有之一。排查 MediaCodec 卡顿,我几乎离不开它。先列几个高频命令:

命令用途MediaCodec 场景示例
adb devices查看连接设备确认设备在线
adb logcat -s MediaCodec过滤 MediaCodec 日志查看编解码器创建时间
adb shell dumpsys media.codec查询编解码器状态看有哪些实例在跑
adb shell ps -A | grep mediaserver查看媒体服务进程确认 mediaserver 是否重启
adb bugreport收集完整系统日志分析启动阶段耗时

为什么会单独提 dumpsys media.codec?因为它能直接输出当前所有 Codec 实例的创建时间、状态、使用的组件名。我靠这个命令抓到过很多次厂商HAL层的卡顿。

注意:adb 版本要和设备 Android 版本匹配。比如 Android 14 设备需要 adb >= 33.0.3,否则某些 dumpsys 输出可能为空。检查 adb 版本:adb version。

4.3 日志分析工具

logcat 高效过滤

直接看全部日志是找死的。MediaCodec 相关 tag 很多:

  • MediaCodec – 框架层日志
  • ACodec – 音视频编解码内部
  • OMXNode – OMX 组件
  • NuPlayer – 播放器管道(如果走的是 MediaCodec)

用 grep 组合:

adb logcat -v time | grep -E "MediaCodec|ACodec|OMXNode"

加上 -v time 就能看到每行打印的时间戳。嗯,这才是排查卡顿的第一步。

systrace / Perfetto

这两货是性能分析的终极武器。MediaCodec 启动过程涉及 binder 调用、HAL 层、内核驱动,单看 logcat 可能不够细。我建议新项目直接用 Perfetto:

adb shell perfetto -o /data/misc/perfetto-traces/trace.perfetto -t 10s sched freq idle gfx

然后pull出来在 ui.perfetto.dev 里看(注意不生成网络链接,仅说明用法)。能看到每个线程的 CPU 睡眠时间、binder 调用延迟。

我曾经在一款低端机上发现 MediaCodec 启动卡了 800ms,用 Perfetto 一看,是 OMX 组件初始化时在等一个 semaphore 超时了。这种问题 logcat 根本看不出来。

整体工具栈

下面这张图概括了咱们即将使用的主要工具:

MediaCodec 启动卡顿排查 · 工具栈 Android Studio adb 命令行 日志分析工具 SDK Manager Profiler logcat dumpsys bugreport Perfetto 分析 MediaCodec 启动耗时 找到卡顿点 → 代码或配置优化 ⚠️ 重点提醒 使用高版本 adb + 最新 Perfetto 能覆盖 90% 的启动卡顿排查场景 不要忽略 dumpsys media.codec 的输出

环境检查清单

最后给你一个自检清单。我每次接手新项目都会跑一遍:

  1. ✅ Android Studio 更新到最新稳定版(至少 Arctic Fox 以上)
  2. ✅ SDK Manager 中安装了 Android 13/14 的 Platform & System Images
  3. ✅ NDK 版本 >= 23,CMake 已安装
  4. ✅ adb 版本 >= 33,并加入系统 PATH
  5. ✅ 能成功执行 adb logcat -s MediaCodec 并看到输出
  6. ✅ 设备上能运行 Perfetto(Android 10+ 自带)
经验之谈:我习惯在每台测试机上先跑一次 adb shell dumpsys media.codec,看看设备支持哪些编解码器以及版本号。有些老旧设备甚至没有 HEVC 硬件编码器,启动时会 fallback 到软件编码,卡顿就很正常了。