4、源码阅读工具:Source Insight、VS Code、Understand的配置与使用技巧
做Framework开发,说白了就是跟几百万行代码打交道。没有趁手的工具,你连代码在哪儿都找不到,更别提改bug了。我这些年折腾过不少编辑器,最后真正留下来、每天都在用的,就是这三款:Source Insight、VS Code、Understand。它们各有各的脾气,也各有各的绝活。
今天我就把这三款工具的配置心得和实战技巧,一次性倒给你。
4.1 Source Insight:老牌劲旅,看源码的“显微镜”
Source Insight是我入行时用的第一款源码阅读工具。说实话,它的界面确实有点复古,但它的代码分析能力,至今没有哪个工具能完全替代。尤其是看C/C++写的Framework底层代码,它简直就是神器。
4.1.1 项目配置:别偷懒,建好“项目”是关键
很多人拿到源码,直接打开文件就开看。嗯,这样你永远体会不到Source Insight的威力。正确的做法是:新建一个项目,把整个Framework源码加进去。
具体步骤我简单说一下:
- 点击
Project → New Project,给项目起个名字,比如Android14_Framework。 - 指定源码根目录,比如
aosp/frameworks/base。 - 添加文件类型:默认只加
.c/.h/.cpp,但Framework里还有大量.java文件。记得在Project Settings → File Filter里加上*.java。 - 点击
Synchronize Files,让工具建立符号索引。这一步会花几分钟,但值得等。
Show only files in project 勾上。这样能过滤掉一些无关的编译中间文件,索引速度会快很多。
4.1.2 核心功能:跳转、查找、关系图
索引建好后,你就可以体验“飞一般的感觉”了。
- 跳转到定义: 选中一个函数名或变量,按
Ctrl + =,直接跳到它的定义处。我经常用这个功能,从ActivityManagerService一路追到ProcessRecord,再追到Zygote,整个调用链一目了然。 - 查找引用: 按
Ctrl + /,可以列出所有引用某个符号的地方。比如你想知道startActivity这个方法在哪些地方被调用了,用它准没错。 - 关系图(Relation Window): 这是Source Insight的独门绝技。选中一个类,打开
View → Relation Window,它会以图形方式展示这个类的父类、子类、成员变量、调用关系。我在分析WindowManagerService的继承体系时,全靠这张图理清了头绪。
Options → Preferences → Colors → Background),舒服多了。建议你也调一调,毕竟要盯着它看一整天。
4.2 VS Code:现代利器,轻量且强大
VS Code刚出来时,我其实不太看好它。觉得它就是个“高级记事本”。但后来插件生态起来了,尤其是微软官方出了C/C++和Java的Language Server,我才发现它有多香。现在它是我写代码的主力工具。
4.2.1 必备插件:装好这些,你才算入门
VS Code的强大,全靠插件。我列几个看Framework源码必装的:
| 插件名称 | 作用 | 备注 |
|---|---|---|
| C/C++ (ms-vscode.cpptools) | 提供C/C++的语法高亮、跳转、调试 | 必装,看Native层代码全靠它 |
| Java Extension Pack | 提供Java的代码补全、重构、调试 | 必装,Framework的Java代码量巨大 |
| GitLens | 在代码行内显示Git提交信息 | 强烈推荐,能帮你看到每行代码是谁写的、为什么改 |
| Bookmarks | 给代码行加书签,方便快速跳转 | 我习惯用它标记关键函数,比如 onCreate、handleMessage |
| Todo Tree | 高亮显示代码中的 TODO、FIXME 注释 |
看源码时,这些注释往往是理解代码逻辑的线索 |
4.2.2 配置技巧:让VS Code读懂Framework
VS Code默认不认识Android的源码结构。你需要告诉它:头文件在哪儿、宏定义是什么。不然跳转功能会失灵。
在项目根目录下创建 .vscode/c_cpp_properties.json 文件,内容大致如下:
{
"configurations": [
{
"name": "Android",
"includePath": [
"${workspaceFolder}/**",
"/path/to/aosp/frameworks/native/include",
"/path/to/aosp/system/core/include",
"/path/to/aosp/hardware/libhardware/include"
],
"defines": [
"__ANDROID__",
"ANDROID_SMP=1"
],
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "clang-x64"
}
],
"version": 4
}
includePath 一定要指向你本地的AOSP源码路径。我见过有人直接复制网上的配置,结果跳转全失效,折腾了半天才发现路径不对。
4.2.3 实战技巧:用“工作区”管理多个项目
Framework源码通常涉及多个仓库:frameworks/base、packages/apps、system/core 等等。你不可能把它们全塞进一个文件夹里。VS Code的“工作区”功能正好解决这个问题。
点击 File → Add Folder to Workspace,把相关的源码目录都加进来。然后保存为 .code-workspace 文件。下次打开时,所有目录都在,搜索也能跨文件夹进行。我个人习惯把 frameworks/base、system/core、hardware 这三个目录加到一个工作区里,基本覆盖了Framework的核心代码。
4.3 Understand:代码分析的“瑞士军刀”
Understand这个工具,知道的人不多。但如果你要做深度的代码分析,比如统计代码复杂度、绘制调用图、检查依赖关系,它比Source Insight和VS Code都强。我是在做系统裁剪时接触到它的,当时需要分析哪些模块可以移除,Understand的依赖分析功能帮了大忙。
4.3.1 项目创建与索引
Understand支持的语言非常多,C/C++、Java、Python都不在话下。创建项目时,选择 New Project → Add Source Directory,指定源码路径,然后选择语言。它会自动扫描并建立索引。
索引完成后,你会看到一个“项目浏览器”,里面按文件、类、函数、变量等维度组织了所有符号。这个视图比Source Insight的“项目窗口”更清晰,因为它把符号之间的关系也列出来了。
4.3.2 核心功能:图表与度量
Understand最让我惊艳的是它的图表功能。
- 调用图(Call Graph): 选中一个函数,右键
Graph → Call Graph,它会生成一张图,显示这个函数调用了哪些函数,又被哪些函数调用。我在分析SystemServer的启动流程时,用这个功能画出了完整的调用链,比看代码快十倍。 - 控制流图(Control Flow Graph): 这个图展示的是函数内部的执行路径。比如
ActivityManagerService.startActivity这个方法,里面有大量的条件判断和分支,用控制流图一看,逻辑瞬间清晰了。 - 代码度量(Metrics): Understand可以统计每个函数的圈复杂度、代码行数、注释率等。我一般用它来找出那些“过于复杂”的函数——圈复杂度超过20的,基本就是重构对象了。
4.3.3 与其他工具的配合
Understand不擅长写代码,所以我的工作流通常是:
- 用Understand做全局分析,理清代码结构和依赖关系。
- 用Source Insight或VS Code深入阅读具体文件,修改代码。
- 改完后,再回到Understand,重新索引,检查改动是否引入了新的依赖问题。
这三个工具各司其职,配合起来效率非常高。
4.4 三款工具对比:什么时候用哪个?
说了这么多,你可能想问:那我到底该用哪个?我的建议是:
| 场景 | 推荐工具 | 理由 |
|---|---|---|
| 快速浏览代码,跳转查找 | Source Insight | 索引快,跳转精准,适合“读”代码 |
| 写代码、调试、Git管理 | VS Code | 插件丰富,编辑体验好,适合“写”代码 |
| 深度分析、架构梳理、度量 | Understand | 图表强大,度量全面,适合“分析”代码 |
当然,如果你硬盘空间够大,我建议三个都装上。毕竟,工具是死的,人是活的。哪个顺手就用哪个,不用给自己设限。