音视频修炼之前置工具链(四):AS+VSCode+Vim工具链
Android Studio + VSCode + Vim 工具链 —— 音视频开发 IDE 速查
音视频 NDK 工程师每天对着代码 8 小时,IDE 用得顺不顺直接决定效率。这一篇给 Android Studio / VSCode / Vim 三套工具的实用配置 + 调试技巧。
本文速览
| 章节 | 阅读重点 |
|---|---|
| 0. 不同场景用不同工具 | 把握本节核心概念和使用场景 |
| 1. Android Studio —— Android 主力 | 把握本节核心概念和使用场景 |
| 2. VSCode —— 跨语言主力 | 把握本节核心概念和使用场景 |
| 3. Vim —— 极速编辑器 | 把握本节核心概念和使用场景 |
| 4. ADB 调试速查 | 定位常见故障和规避方式 |
| 5. Git 高效命令 | 记住常用接口和关键参数 |
| 6. 跨工具协同 | 把握本节核心概念和使用场景 |
| 7. 调试技巧 | 定位常见故障和规避方式 |
| 8. 性能调优工具 | 把握本节核心概念和使用场景 |
| 9. 几个高效工作流 | 把握本节核心概念和使用场景 |
| 后续章节 | 余下 1 节继续按“概念 → 示例 → 坑点 → 总结”展开 |
0. 不同场景用不同工具
| 场景 | 推荐工具 |
|---|---|
| 看 Java/Kotlin + Android UI | Android Studio⭐ |
| 看 C/C++ Native 代码 | VSCode + clangd⭐ |
| 看 FFmpeg / VLC 大型 C 工程 | VSCode(远程)或 Vim |
| 快速改命令行 / 调试 | Vim |
| 查 Android 系统源码(AOSP) | VSCode + clangd |
不同场景换工具,别死守一个 IDE。
1. Android Studio —— Android 主力
1.1 必装插件
| 插件 | 用途 |
|---|---|
| Kotlin | 默认带 |
| ADB Idea | 一键卸载 / 重启 / 清缓存 |
| Rainbow Brackets | 彩色括号 (大型 C 文件必备) |
| String Manipulation | 字符串处理 |
| Git Toolbox | Git 增强 |
| LeetCode | 摸鱼时刷题 |
1.2 NDK 开发设置
Preferences: Build, Execution, Deployment → CMake
- CMake 路径
- Build directory: app/.cxx/
Preferences: Languages & Frameworks → C/C++
- 启用 Code Completion
- clangd-tidy
1.3 LLDB 调试 Native
参考 ijkplayer 项目的patch-debugging-with-lldb.sh:
shandroid/patch-debugging-with-lldb.sh armv7a之后 Android Studio:
Run: Edit Configurations → Debugger → Symbol Directories
添加 obj/local// 目录
Run: Debug ‘app’ (选 LLDB 模式)
1.4 高频快捷键
| 操作 | 快捷键(Mac/Linux 类似) |
|---|---|
| 跳转到声明 | Cmd+B / Ctrl+B |
| 跳转到实现 | Cmd+Alt+B |
| 找用法 | Alt+F7 |
| 重命名 | Shift+F6 |
| 提取方法 | Cmd+Alt+M |
| 全局搜索 | 双击 Shift |
| 搜索类 | Cmd+O |
| 搜索文件 | Cmd+Shift+O |
| 命令面板 | Cmd+Shift+A |
双击 Shift是最常用的搜索入口。
1.5 Profile 工具
| 项 | 内容 |
|---|---|
| View | Tool Windows → Profiler |
| CPU | 记录 method 级耗时, 看热点 |
| Memory | 看泄漏 / 大对象 |
| Network | 看 HTTP / Socket 流量 |
| Energy | 看耗电 |
2. VSCode —— 跨语言主力
2.1 必装插件
| 插件 | 用途 |
|---|---|
| clangd | C/C++ 智能补全 + 跳转(远比 Microsoft C/C++ 快)⭐ |
| CMake Tools | CMake 工程支持 |
| Native Debug | LLDB / GDB 调试 |
| Better Comments | 注释着色 |
| Error Lens | 错误内联显示 |
| Git Graph | 可视化 Git 历史 |
| Remote - SSH | 远程开发 ⭐ |
| Remote - Containers | Docker 开发 |
2.2 clangd 配置
clangd 是 LLVM 自带的语言服务器,比 IntelliSense 快 10x。
2.2.1 装 clangd
按平台选择安装命令:
| 平台 | 命令 | 说明 |
|---|---|---|
| Linux / Ubuntu | sudo apt install clangd | 直接安装系统仓库里的clangd |
| macOS | brew install llvm | 通过 Homebrew 安装 LLVM 工具链,内含clangd |
2.2.2 生成 compile_commands.json
不同构建系统的生成方式不同,按工程类型选一套即可:
| 工程类型 | 命令 | 产物 / 作用 |
|---|---|---|
| CMake 工程 | mkdir build && cd build | 新建独立构建目录,避免污染源码目录 |
| CMake 工程 | cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1 .. | 生成build/compile_commands.json |
| CMake 工程 | ln -s build/compile_commands.json ../ | 把编译数据库软链到工程根,方便clangd识别 |
| Makefile 工程 | sudo apt install bear | 安装bear,用于捕获编译命令 |
| Makefile 工程 | bear -- make | 替代直接执行make,自动生成compile_commands.json |
2.2.3 VSCode 配置.clangd(工程根)
CompileFlags:Add:[-std=c++17,-Wall]Remove:[-W*]# 去掉某些警告If:PathMatch:src/.*\.cppDiagnostics:ClangTidy:Add:[modernize-*,performance-*]Remove:[modernize-use-trailing-return-type]2.3 VSCode 调试 NDK Native
launch.json:
{"version":"0.2.0","configurations":[{"name":"LLDB Attach Android","type":"lldb","request":"attach","pid":"${command:pickProcess}","preLaunchTask":"build"}]}2.4 远程开发 SSH
适合服务器开发(编译大型 C 工程时本地慢):
2.5 高频快捷键
| 操作 | 快捷键 |
|---|---|
| 跳转到定义 | F12 |
| 找用法 | Shift+F12 |
| 命令面板 | Cmd+Shift+P |
| 文件搜索 | Cmd+P |
| 全文搜索 | Cmd+Shift+F |
| 多光标 | Cmd+D(选中下一处) |
| 同时打开终端 | Ctrl+` |
| 切换文件 | Cmd+Tab |
3. Vim —— 极速编辑器
3.1 为啥要会 Vim
| 序号 | 要点 |
|---|---|
| 1 | 服务器调试(SSH 远程,没图形界面) |
| 2 | 快速改单个文件(启动 < 100ms) |
| 3 | Git rebase 编辑 commit |
| 4 | 命令行 debug(lldb 内嵌) |
NDK 工程师至少要会基础。
3.2 必学 30 个命令
移动
| 命令 | 作用 |
|---|---|
hjkl | 左 / 下 / 上 / 右 |
w/b | 下一个 / 上一个单词 |
0/$ | 行首 / 行尾 |
gg/G | 文件首 / 尾 |
Ctrl+u/Ctrl+d | 半页上 / 下 |
:42 | 跳到第 42 行 |
编辑
| 命令 | 作用 |
|---|---|
i/a/o | 插入:当前位置前 / 后 / 下一行 |
x | 删字符 |
dd | 删行 |
yy | 复制行 |
p | 粘贴 |
u | 撤销 |
Ctrl+r | 重做 |
查找替换
| 命令 | 作用 |
|---|---|
/text | 搜索 |
n/N | 下一个 / 上一个匹配 |
:%s/old/new/g | 全文替换 |
文件
| 命令 | 作用 |
|---|---|
:w | 保存 |
:q | 退出 |
:wq或ZZ | 保存退出 |
:q! | 不保存退出 |
:e file | 打开文件 |
其他
| 命令 | 作用 |
|---|---|
v | 选择(visual mode) |
V | 选行 |
:%y+ | 复制全文到系统剪贴板 |
:set nu | 显示行号 |
3.3 .vimrc 推荐配置
这组配置属于“配置项 + 含义”的对照关系,先用表格扫读每项解决什么问题,再复制下面的完整配置:
| 配置项 | 作用 | 推荐理由 |
|---|---|---|
set number | 显示行号 | 方便日志 / 编译错误跳转到具体行 |
set tabstop=4 | Tab 显示宽度设为 4 | C/C++ / Java 代码缩进更稳定 |
set shiftwidth=4 | 自动缩进宽度设为 4 | 配合tabstop保持缩进一致 |
set expandtab | Tab 转空格 | 避免多人协作时 Tab 宽度不一致 |
set autoindent | 自动继承上一行缩进 | 写代码时减少手动对齐 |
set hlsearch | 高亮搜索结果 | 搜索后能快速定位所有匹配点 |
set incsearch | 输入搜索词时增量匹配 | 边输入边跳转,提高查找效率 |
set clipboard=unnamedplus | 打通系统剪贴板 | Vim 和 IDE / 浏览器之间复制更顺 |
syntax on | 开启语法高亮 | 远程改代码时降低误读概率 |
filetype plugin indent on | 开启文件类型插件和缩进 | 按语言启用更合适的缩进规则 |
nnoremap <leader>w :w<CR> | 快捷保存 | normal 模式下快速保存 |
nnoremap <leader>q :q<CR> | 快捷退出 | normal 模式下快速退出 |
" ~/.vimrc set number " 行号 set tabstop=4 set shiftwidth=4 set expandtab " Tab 转空格 set autoindent set hlsearch " 高亮搜索 set incsearch set clipboard=unnamedplus " 跟系统剪贴板互通 syntax on filetype plugin indent on " 留分屏: Ctrl+w 后跟方向键切换 nnoremap <leader>w :w<CR> nnoremap <leader>q :q<CR>3.4 跟 IDE 协同
日常用 IDE,SSH 远程或单文件改用 Vim。
Vim 用法心智一句话:i进编辑模式 → 改东西 →ESC回 normal →:w保存。
| 阶段 | 按键 / 命令 | 心智模型 |
|---|---|---|
| 进入编辑 | i | 从 normal mode 进入 insert mode,开始改内容 |
| 完成编辑 | ESC | 回到 normal mode,准备执行保存 / 搜索 / 跳转 |
| 保存结果 | :w | 把当前 buffer 写回文件 |
4. ADB 调试速查
4.1 高频 ADB 命令
这些命令互相独立,按“场景 → 命令 → 作用”做速查表更容易扫读:
| 场景 | 命令 | 作用 / 注意点 |
|---|---|---|
| 设备 | adb devices | 查看已连接设备,先确认 USB / Wi-Fi ADB 是否正常 |
| APK | adb install app.apk | 安装 APK |
| APK | adb uninstall com.example.app | 卸载指定包名应用 |
| 启动 | adb shell am start -n com.example/.MainActivity | 直接启动指定 Activity,适合绕过入口页调试 |
| 日志 | adb logcat | 查看完整 logcat |
| 日志 | adb logcat *:W | 只看 warning 及以上日志 |
| 日志 | adb logcat | grep MyTag | 按 tag / 关键字过滤日志 |
| 日志 | adb logcat -c | 清空历史日志,复现场景前常用 |
| 屏幕 | adb shell screencap /sdcard/s.png && adb pull /sdcard/s.png | 截图并拉到本地 |
| 屏幕 | adb shell screenrecord /sdcard/v.mp4 | 录屏,使用Ctrl+C停止 |
| 性能 | adb shell top | 看进程 CPU / 内存占用 |
| 性能 | adb shell dumpsys cpuinfo | 查看系统 CPU 使用情况 |
| 性能 | adb shell dumpsys meminfo com.example | 查看指定应用内存 |
| 性能 | adb shell dumpsys gfxinfo com.example | 查看渲染耗时 / 掉帧信息 |
4.2 音视频专用
音视频问题排查时优先看 codec / 显示 / 音频 / ANR / trace 五类信息:
| 场景 | 命令 | 作用 / 适合排查 |
|---|---|---|
| Codec | adb shell dumpsys media.codec | 查看编解码器实例、状态、输入输出队列等 |
| 显示 | adb shell dumpsys SurfaceFlinger | 查看 Surface / Layer / 合成相关状态 |
| 音频 | adb shell dumpsys audio | 查看 AudioService 侧路由和音量状态 |
| 音频 | adb shell dumpsys media.audio_flinger | 查看 AudioFlinger 线程、track、buffer 状态 |
| 音频 | adb shell dumpsys media.audio_policy | 查看音频策略、设备选择和路由决策 |
| ANR | adb pull /data/anr/traces.txt | 拉取 ANR 堆栈,定位主线程卡顿 |
| Trace | adb shell atrace --async_start gfx view | 开始抓帧率 / 渲染相关 trace |
| Trace | adb shell atrace --async_dump > trace.html | 导出 trace 文件,用于后续可视化分析 |
5. Git 高效命令
5.1 高频
高频 Git 命令按“工作区 / 提交 / 同步 / 历史 / 分支”分组记:
| 场景 | 命令 | 作用 / 注意点 |
|---|---|---|
| 工作区 | git status | 查看当前改动、暂存区和分支状态 |
| 工作区 | git add -p | 分块加入暂存区,适合提交前 audit 自己改了什么 |
| 提交 | git commit -m "..." | 创建一次提交 |
| 提交 | git commit --amend | 修改最近一次 commit |
| 同步 | git push | 推送当前分支 |
| 同步 | git pull --rebase | rebase 拉取,避免无意义 merge commit |
| 历史 | git log --oneline --graph | 用单行图形方式查看提交历史 |
| 历史 | git log -p file | 查看某个文件的历史 patch |
| 历史 | git blame file | 查看每一行最后由谁修改 |
| 分支 | git checkout -b new-branch | 从当前提交创建并切换到新分支 |
| 分支 | git checkout main | 切回main分支 |
| 分支 | git branch -D old-branch | 强制删除本地旧分支 |
5.2 调试型
git bisect是定位“哪个 commit 引入 bug”的二分工具:
| 步骤 | 命令 | 含义 |
|---|---|---|
| 1 | git bisect start | 开始二分定位 |
| 2 | git bisect bad HEAD | 标记当前版本是坏的 |
| 3 | git bisect good v1.0 | 标记v1.0是好的 |
| 4 | git bisect good/git bisect bad | Git 跳到中间 commit 后,根据测试结果继续标记 |
| 5 | git bisect reset | 找到坏 commit 后退出 bisect 状态 |
5.3 撤销
撤销类命令风险差异很大,重点看是否会丢改动:
| 命令 | 作用 | 风险 |
|---|---|---|
git reset --soft HEAD~1 | 撤销最近一次 commit,但保留改动 | 低,改动仍在工作区 / 暂存区 |
git reset --hard HEAD~1 | 撤销最近一次 commit,并丢弃改动 | 高,会丢本地改动 |
git checkout -- file | 撤销单个文件的本地改动 | 中,该文件未提交改动会丢失 |
git stash | 暂存当前改动 | 低,适合临时切分支 |
git stash pop | 恢复最近一次 stash | 中,可能产生冲突 |
6. 跨工具协同
6.1 用 Android Studio 写 Java + VSCode 看 Native
两个 IDE 同时打开同一个工程目录,各管自己擅长的部分。AS 跑 Gradle / 调试 / 装机,VSCode + clangd 写 C++ 跳转更快。
6.2 用 Vim 远程 + AS 本地
服务器侧SSH + Vim 改 FFmpeg 源码并编译,本地侧Android Studio 连 USB 调试 Android 端——服务器跑大型工程不卡,本地用 IDE 调试体验最佳。
7. 调试技巧
7.1 LLDB 命令速查
| 项 | 说明 |
|---|---|
breakpoint set -f file.c -l 42 | 文件 + 行号断点 |
breakpoint set -n function_name | 函数名断点 |
continue | 继续运行 |
next | 单步执行到下一行,不进入函数 |
step | 单步进入函数 |
frame variable | 查看当前栈帧局部变量 |
print var | 打印变量 |
expression code | 执行表达式,例如临时修改变量 |
backtrace | 查看调用堆栈 |
watchpoint set variable my_var | 设置数据断点 |
7.2 GDB 类似(Linux)
| 命令 | 作用 |
|---|---|
break file.c:42 | 在file.c第 42 行打断点 |
run | 启动程序 |
n/s | 下一行 / 进入函数 |
print var | 打印变量 |
bt | 查看调用堆栈 |
7.3 Logcat 过滤技巧
| 场景 | 命令 | 作用 |
|---|---|---|
| 按进程过滤 | adb logcat --pid=$(adb shell pidof com.example.app) | 只看指定应用进程日志 |
| 按 tag 过滤 | adb logcat -s MyTag MediaCodec | 只看指定 tag |
| 显示时间戳 | adb logcat -v time | 排查时间线问题时更直观 |
| 看崩溃 | adb logcat | grep -E “FATAL|AndroidRuntime” | 快速定位 Java / native 崩溃相关日志 |
8. 性能调优工具
8.1 Android Studio Profiler
| 项 | 内容 |
|---|---|
| CPU Profiler | 看 method 级耗时, 找热点 |
| Memory Profiler | 看堆 / native heap / 泄漏 |
| Energy Profiler | 看 CPU / 网络 / GPS 耗电 |
8.2 systrace / Perfetto
# Perfetto (现代)adb shell perfetto-c---txt-o/data/local/tmp/trace.pftrace<<EOF buffers { size_kb: 8960 } data_sources { config { name: "linux.ftrace" ftrace_config { ftrace_events: "sched/sched_switch" } } } EOF# 拉到 https://ui.perfetto.dev 分析8.3 simpleperf
| 步骤 | 命令 | 作用 |
|---|---|---|
| 1 | adb shell simpleperf record -p $(pidof com.example.app) -o /data/local/tmp/perf.data sleep 10 | 抓取指定进程 10 秒性能数据 |
| 2 | adb pull /data/local/tmp/perf.data | 把采样结果拉到本地 |
| 3 | simpleperf report -i perf.data | 在本地生成性能热点报告 |
9. 几个高效工作流
9.1 改 FFmpeg 源码 → 编译 → 部署 → 测试
| 步骤 | 命令 / 动作 | 说明 |
|---|---|---|
| 1 | 修改ffmpeg/下的某个.c文件 | 只改目标模块,方便增量编译 |
| 2 | cd ffmpeg && make -j8 | 编译 FFmpeg |
| 3 | cp libavcodec/libavcodec.so /path/to/app/src/main/jniLibs/arm64-v8a/ | 把新.so拷到 Android Studio 项目 |
| 4 | AS 跑 app | 安装并运行验证包 |
| 5 | 看 logcat | 验证行为和错误日志 |
整个循环可以 1 分钟内搞定(增量编译)。
9.2 看大型 C 工程
VLC 这类源码很大的 C 工程,可以先建索引再跳转:
| 阶段 | 命令 / 快捷键 | 作用 |
|---|---|---|
| 安装工具 | sudo apt install cscope universal-ctags | 安装cscope和ctags |
| 进入源码 | cd vlc-source | 进入 VLC 源码根目录 |
| 生成 tags | ctags -R . | 递归生成符号索引 |
| 生成 cscope 索引 | cscope -bR | 递归生成cscope数据库 |
| Vim 跳定义 | Ctrl+] | 跳到符号定义 |
| Vim 回退 | Ctrl+t | 从定义位置回退 |
| Vim 查函数 | :tag fn | 跳到函数fn |
或 VSCode + clangd(前面讲了)。
9.3 远程编译 + 本地 IDE
本地: VSCode + Remote SSH
服务器: 编译大型工程 (FFmpeg / Chromium)
代码看本地, 编译跑服务器
10. 总结
工具链速记:
| 场景 | 工具 |
|---|---|
| 日常 Android | Android Studio + Profiler + ADB |
| 看 NDK 大型工程 | VSCode + clangd |
| 快速编辑 / SSH | Vim |
| 版本控制 | git CLI + 部分 GUI(Sourcetree) |
| 调试 | LLDB / GDB / atrace / Perfetto |
效率金句:
- 学会键盘所有快捷键—— 不要用鼠标
- clangd 比 IntelliSense 快 10x—— 装上
- 双 IDE 协作(AS + VSCode)—— 各管擅长的
- Vim 至少会 30 个命令—— 服务器调试必备
- ADB / dumpsys / atrace—— 音视频问题排查三件套
金句:写代码工具决定效率上限。Android Studio 写 UI,VSCode + clangd 写 Native,Vim 改服务器,LLDB 调崩溃——四件套熟练用 = 比同行快 2 倍出活。
