使用Visual Studio Code阅读Android内核源码

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,如下所示:

{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "defines": [],
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "c11",
            "cppStandard": "c++17"
        }
    ],
    "version": 4
}

其中的configurations.includePath就是代码分析时包含头文件的目录。该数组的值支持一个宏${workspaceFolder},指代工作区所在的路径,由此在填入值的时候,允许根据以上头文件夹与它的相对位置来填写。当然也可以填写绝对路径,不过绝对路径的健壮性(robust)不够强。

填写时要严格遵循顺序,下层在前,上层在后,否则不能确保有依赖关系的头文件均能被找出来。

举例来说,假如工作区在内核源码下security/selinux目录里,那么应该这样填写:

{
            "......"
            "includePath": [
                "${workspaceFolder}/../../arch/arm/mach-<机器方案名>/include/**",
                "${workspaceFolder}/../../arch/arm/include/**",
                "${workspaceFolder}/../../include/**",
                "${workspaceFolder}/**"
            ],
            "......"
}

设置之后,再次打开源代码,即可发现以上提到的特性均能一一实现了。


  1. VS Code只对JavaScript、TypeScript等开发它的语言提供了原生支持。 ↩

你可能感兴趣的:(使用Visual Studio Code阅读Android内核源码)