选中高亮插件:

hightlight-selections-vscode

Kernel阅读环境:

  1. 编译内核
1
2
repo init -u https://android.googlesource.com/kernel/manifest -b common-androidxx-x.x
repo sync

选择自己需要的config文件,开启build.sh脚本 这里以build.config.gki.aarch64为例: BUILD_CONFIG=common/build.config.gki.aarch64 build/build.sh

  1. 生成编译描述文件
    仔细观察我们编译的out目录,会发现有很多后缀为cmd的文件,这些其实就是编译过程中的临时文件,包含了编译命令等。
    vscode-linux-kernel其实就是利用编译后的cmd等文件做解析,生成编译描述文件compile_commands.json。
    进入内核源码的根目录,将vscode-linux-kernel项目拉下来:
1
2
3
4
cd common # 进入内核源码根目录
# clone vscode-linux-kernel项目到.vscode文件夹
# 该文件夹为vscode配置文件夹 类似于.idea
git clone --depth=1 https://github.com/amezin/vscode-linux-kernel.git .vscode

运行python脚本,并指定-O参数到编译产出目录:

1
2
3
python .vscode/generate_compdb.py -O ../out/androidxx-x.xx/common/
ls -al | grep compile_commands.json
# -rw-r--r--   1 kali kali 8888862 Nov 30 01:07 compile_commands.json
  1. 配置VsCode
    setting.json文件:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
{
    "files.associations": {
        "iostream": "cpp",
        "intrinsics.h": "c",
        "ostream": "cpp",
        "vector": "cpp"
    },
    "editor.formatOnPaste": true,
    "editor.formatOnSave": true,
    "editor.formatOnType": true,
    // 关闭 C/C++ Extension Pack 插件的提示 防止其与clangd冲突
    "C_Cpp.errorSquiggles": "Disabled",
    "C_Cpp.intelliSenseEngineFallback": "Disabled",
    "C_Cpp.intelliSenseEngine": "Disabled",
    "C_Cpp.autocomplete": "Disabled", // So you don't get autocomplete from both extensions.
    // 指向clangd路径
    "clangd.path": "/tmp/NDK/ndk-r25b/toolchains/llvm/prebuilt/linux-x86_64/bin/clangd",
    "clangd.arguments": [
        // compelie_commands.json 文件的目录位置
        "--compile-commands-dir=${workspaceFolder}/",
        // 让 Clangd 生成更详细的日志
        "--log=verbose",
        // 输出的 JSON 文件更美观
        "--pretty",
        // 全局补全
        "--all-scopes-completion",
        // 建议风格:打包(重载函数只会给出一个建议)相反可以设置为detailed
        "--completion-style=bundled",
        // 跨文件重命名变量
        "--cross-file-rename",
        // 允许补充头文件
        "--header-insertion=iwyu",
        // 输入建议中,已包含头文件的项与还未包含头文件的项会以圆点加以区分
        "--header-insertion-decorators",
        // 在后台自动分析文件 基于 complie_commands
        "--background-index",
        // 启用 Clang-Tidy 以提供「静态检查」
        "--clang-tidy",
        // Clang-Tidy 静态检查的参数,指出按照哪些规则进行静态检查
        // 参数后部分的*表示通配符
        // 在参数前加入-,如-modernize-use-trailing-return-type,将会禁用某一规则
        "--clang-tidy-checks=cppcoreguidelines-*,performance-*,bugprone-*,portability-*,modernize-*,google-*",
        // 默认格式化风格: 谷歌开源项目代码指南
        "--fallback-style=file",
        // 同时开启的任务数量
        "-j=2",
        // pch优化的位置(memory 或 disk,选择memory会增加内存开销,但会提升性能)
        "--pch-storage=disk",
        // 启用这项时,补全函数时,将会给参数提供占位符
        // 我选择禁用
        "--function-arg-placeholders=false"
    ],
}
  1. 打开Kernel根目录,等待索引结束 .