使用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等開發它的語言提供了原生支持。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章