Visual Studio Code是阅读代码的不二选择,尤其是与传统IDE工程并驾齐驱的、由构建器(Make、Ninja、CMake等)组织的工程,只需打开一个文件夹作为工作区,即可立刻开始。而VS Code对C语言的多方面支持,使得用它来阅读、学习、调试C语言源代码,尤有一种舒心简便的体验。
——所以,对于学习Linux Android内核源码的程序员,我首先推荐VS Code。只需简单的配置,就可以将VS Code打造成贴心的Linux代码阅读工具。
第一步:安装C语言相关扩展
VS Code默认未提供对C语言的完整支持[^1],因此需要先安装相应的扩展。
在扩展管理器中安装以下扩展:
扩展名称 | 介绍 |
---|---|
C/C++ | 微软推出的C/C++扩展,可以将VS Code打造成C/C++的IDE |
C++ Intellisense | austin 推出的智能提示(Intellisense)扩展,可以在用户键入代码时给出自动完成提示 |
安装完成后,在扩展管理器中选择“重新加载”(Reload),重载VS Code窗口,使扩展生效。
第二步:配置“C/C++”扩展
打开Linux源码目录,可以打开源码的根目录,也可以打开其中任意一个模块的子目录(如SELinux模块的子目录security/selinux
),由此开始对源码的管理。
不过这个时候,由于配置文件未设置好,与代码提示有关的功能还不能使用,这会大大降低我们的体验。实际体验中,代码提示体现在如下功能特性:
特性 | 说明 |
---|---|
悬停提示 | 在鼠标悬停时,自动显示悬停处对象的定义 不需搜索文本即可快速了解一个对象的定义和使用方法 |
自动完成 | 键入代码时,给出自动完成提示,即相关备选项的菜单 |
上下文定位 | 按住Ctrl 键,单击对象名,即可跳转到它的定义处 |
上下文查看 | 可以跳转到对象的由来【声明(declaration)或定义(definition)】所在的地方; 并提供速览(peek)——在当前代码窗口中分裂出一块小区域显示它的由来 |
代码提示工作的基础是对源码包含(#include
)的头文件进行分析,分析其中的各种定义,其次才分析上下文。默认情况下,C/C++扩展只会查找工作目录下的所有头文件,然而Linux的源码还会用到其他的头文件。为此需要配置这个扩展。
一般涉及的头文件都在内核源码里的如下子目录中,自低向高分层次列举如下。注意在上层的头文件会调用下层的头文件,如此形成依赖关系:
层级 | 头文件包含目录 | 说明 |
---|---|---|
1 | arch/arm/mach-<机器方案名>/include |
由机器方案厂商提供的专用于某一系列设备的程序源码 |
2 | arch/arm/include |
架构的头文件,包含的文件以用于汇编为主 |
3 | include |
内核的主要头文件 |
以上针对ARM架构介绍,其他架构(如X86、MIPS)类推即可。机器方案名根据设备配置文件来确定。
接下来就编辑配置文件,把上述相应的目录加入进来。按Ctrl+Alt+P
打开命令面板,输入Edit configurations
,在其中选择C/Cpp: Edit configurations
,进入配置文件编辑。配置文件的格式是JSON,如下所示:
1 |
|
其中的configurations.includePath
就是代码分析时包含头文件的目录。该数组的值支持一个宏${workspaceFolder}
,指代工作区所在的路径,由此在填入值的时候,允许根据以上头文件夹与它的相对位置来填写。当然也可以填写绝对路径,不过绝对路径的健壮性(robust)不够强。
填写时要严格遵循顺序,下层在前,上层在后,否则不能确保有依赖关系的头文件均能被找出来。
举例来说,假如工作区在内核源码下security/selinux
目录里,那么应该这样填写:
1 |
|
设置之后,再次打开源代码,即可发现以上提到的特性均能一一实现了。
[^1]: VS Code只对JavaScript、TypeScript等开发它的语言提供了原生支持。
- 本文作者: 爱拼安小匠
- 本文链接: https://anclark.github.io/2018/09/04/Android_Adapting_Note/使用Visual-Studio-Code阅读Android内核源码/
- 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-ND 3.0(署名-非商用-禁止演绎 3.0) 许可协议。转载请注明出处!