音视频修炼之前置工具链(四):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:
sh android/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/.*\.cpp
Diagnostics:
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 个命令
移动
| 命令 | 作用 |
|---|---|
h j k l |
左 / 下 / 上 / 右 |
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 倍出活。
更多推荐
所有评论(0)