當前位置: 華文問答 > 數位

【胎教】從零開始的小米(紅米)手機內核編譯教程——以紅米note5為例

2024-01-13數位

0.0 序

內核編譯的難點在於配置環境,不同手機、系統的內核源碼版本、編譯器版本、依賴項甚至所需系統版本各不相同,給入門帶來了極大困難。依托於開源系統lineage,我們可以很便捷的下載到與系統對應的源碼,減少不必要的麻煩。

本文將以盡可能普適的步驟,從最核心的環境配置及編譯過程開始更新,逐步完善,目標是讓零基礎選手都能完成整個內核編譯流程。(本文待更新的內容均可以百度到詳細教程)

註意:請確保自己有環境或能力進入github並從中下載檔,否則將不能完成全過程。日後將更新github加速方法。



0.1 目錄

1 解除bl鎖、刷入TWRP、 刷入系統ROM 、root

2 安裝VMware、建立ubuntu20.04虛擬機器

3 在ubuntu中安裝所需依賴項

4 下載與手機對應的內核源碼、下載編譯工具

5 配置環境變量

6 完成第一次編譯

7 將內核打包刷入裝置

0.2 查詢裝置代號

在開始前,請在百度查詢您手機對應的代號,我使用的紅米note5手機,代號為whyred。

圖0.1 查詢裝置代號

1 解除bl鎖 、刷入TWRP、刷入系統ROM、root

在本節中,您需要完成標題所示4個步驟。

為了確保成功率,我們使用lineage系統,以便獲取到與系統完全對應的內核源碼。

系統rom在https://download.lineageos.org/changes中獲取,裝置代號相同即可下載(同一個代號可能對應多款裝置)。上述網址中找不到的,說明已經停止支持,沒有最新版本的系統,在https://lineageosroms.com/xiaomi/中尋找舊版本即可。

root我使用的是magisk,其他root也可以使用。

詳細步驟施工中……



2 安裝VMware、建立ubuntu20.04虛擬機器

在本節中,您需要安裝vmware,並建立一個ubuntu20.04虛擬機器(其他發行版應該也可以,未測試)

詳細步驟施工中……



3 在ubuntu中安裝所需依賴項

在ubuntu虛擬機器中,點選圖示左側圖示開啟檔管理器。(如找不到圖示,可以按win鍵後輸入files,點選出現的圖示)(記住該操作,下文需要開啟檔管理器時不再重復)

圖3.1 開啟檔管理器

為了演示,我將刪除目錄下不需要的資料夾,即把除「desktop」以外的資料夾全部刪除。

刪除後新建一個資料夾,命名為「kernel」,用來存放源碼及編譯工具。雙擊「kernel」資料夾進入。(記住新建、刪除、重新命名的操作方法)

圖3.2 刪除檔 圖3.3 新建資料夾 圖3.4 重新命名檔

按win鍵後輸入「terminal」,點選出現的圖示,開啟命令列視窗。(記住該操作,下文需要開啟命令列時不再重復)

圖3.5 開啟命令列 圖3.6 命令列視窗

在命令列內一次性輸入以下內容並回車(可以復制文字,在命令列內右單擊,點「paste」貼上 ):

sudo apt install bc bison build-essential ccache curl flex g++-multilib gcc-multilib git git-lfs gnupg gperf imagemagick lib32ncurses5-dev lib32readline-dev lib32z1-dev libelf-dev liblz4-tool libncurses5 libncurses5-dev libsdl1.2-dev libssl-dev libxml2 libxml2-utils lzop pngcrush rsync schedtool squashfs-tools xsltproc zip zlib1g-dev adb fastboot -y

(命令中的空格、「-」符號都不要漏掉,符號個數要完全一致,下同,不再提示 )

會提示輸入密碼,輸入後回車即可。

下載過程中會提示」Do you want to continue? [Y/n]」,直接回車即可,後面如果遇到也一樣 。

4 下載與手機對應的內核源碼、下載編譯工具

4.1 下載內核源碼

進入https://wiki.lineageos.org/devices/,在右上角搜尋框中查詢您的裝置代號,並點選進入裝置詳情頁。

圖4.1 查詢裝置 4.2 裝置詳情頁

將裝置詳情頁下滑至最底端,點選 (source code)超連結,進入github源碼倉庫頁面。

在左上角圖示處選擇系統版本,需要與剛剛刷入的系統版本一致。我刷入的系統版本為18.1,所以此處選擇「lineage-18.1」(記住版本號全名,方法二中需要用到) 。

圖4.3 選擇源碼版本

選擇好後有兩種方法可以下載源碼,方法二一般下載更快些,選其中一種執行後就不需要再執行另一種方法。

方法一:

選擇好後點選右側綠色「Code」按鈕,點選彈出的「Download ZIP」進行下載。

圖4.4 直接下載計畫壓縮包

下載好後是一個zip壓縮檔,將該檔復制到虛擬機器中剛剛建立的kernel資料夾內。(復制時ubuntu可能會彈出一個提示框,點選skip all即可)

圖4.5 下載好的壓縮包 4.6 將壓縮包復制到ubuntu

開啟命令列。

圖4.7 命令列視窗

在其中輸入以下命令:

cd ~/kernel

unzip 你下載的zip檔名 (記得帶字尾,例如unzip android_kernel_xiaomi_sdm660-lineage-18.1.zip)

圖4.8 執行unzip解壓命令完成

此時檢視檔管理器,kernel目錄下將解壓出一個資料夾,為了方便,將該資料夾重新命名為「src」。

圖4.9 重新命名完成的資料夾

至此源碼下載完畢。

方法二:

在github頁面中點選右側Code按鈕,點選一串網址後的方塊圖示,復制該計畫地址。記住您選擇的版本全名,比如我選擇的是「lineage-18.1」。

圖4.10 復制計畫地址

ubuntu虛擬機器中開啟命令列視窗。

圖4.11 命令列視窗

在出現的視窗中輸入以下命令:

cd ~/kernel

git clone 剛剛復制的網址,輸入完前面的字後右單擊貼上即可 -b 選擇的版本全名 --depth 1

(例如我的命令應該是 git clone https://github.com/LineageOS/android_kernel_xiaomi_sdm660.git -b lineage-18.1 --depth 1)

待下載完後,「kernel」資料夾內將出現一個源碼資料夾,為了方便操作,將其重新命名為「src」。此時源碼下載完成。

圖4.12 執行git clone命令完成

4.2 下載編譯工具

我們選擇的工具是「Proton Clang」,github頁面是https://github.com/kdrag0n/proton-clang。安裝方法與下載源碼的兩種方法相同,且不需要選擇版本。

方法一:

點選右側Code按鈕,再點選Download Zip,下載壓縮包。將壓縮包復制到Ubuntu中的「kernel」資料夾內(復制時ubuntu可能會彈出一個提示框,點選skip all即可)。開啟命令列,輸入下面的命令進行解壓:

cd ~/kernel

unzip 壓縮檔名 (例如unzip proton-clang-master.zip)

解壓完成後,將解壓出的資料夾重新命名為「toolchains」。至此編譯工具下載完成。

方法二:

ubuntu中開啟命令列,輸入如下命令:

cd ~/kernel

git clone https://github.com/kdrag0n/proton-clang.git

將新下載下來的資料夾重新命名為「toolchains」。至此編譯工具下載完成。

圖4.13 內核源碼及編譯工具下載完畢

下載完畢後,「kernel」資料夾中應存在src和toolchains兩個資料夾。如果使用方法一下載,還會留有zip壓縮包,不必理會即可。

5 配置環境變量

ubuntu中開啟命令列,依次輸入如下命令(註意第二、三行末尾都是一個「-」號 ):

export PATH=$PATH:~/kernel/toolchains/bin

export CROSS_COMPILE=aarch64-linux-gnu-

export CROSS_COMPILE_ARM32=arm-linux-gnueabi-

export ARCH=arm64

export CC=clang

圖5.1 配置環境變量

本節所述操作,每次開啟命令列之後都需要重新執行一次。

6 完成第一次編譯

6.1 編譯預設配置

命令列裏輸入以下命令:

cd ~/kernel/src

ls ~/kernel/src/arch/arm64/configs

在顯示出來的配置檔裏找出帶有您裝置代號的一項,比如我需要找到的配置檔名稱為「whyred_defconfig」。記住該名稱。

圖6.1 尋找裝置對應的預設配置檔

輸入命令:

make ARCH=arm64 CC=clang O=out 配置檔名稱 (比如我的命令是make ARCH=arm64 O=out whyred_defconfig)

此時可以看到編譯器在執行,src資料夾下生成了一個out資料夾。

繼續輸入命令:

make ARCH=arm64 O=out CC=clang -j執行緒數(執行緒數通常為cpu核心數乘2,我設定為8,則命令為make ARCH=arm64 O=out CC=clang -j8)

此時開始進行編譯,螢幕上閃過編譯資訊,等待幾分鐘後出現「CA T arch/arm64/boot/Image.gz-dtb」字樣,編譯就完成了。

圖6.2 編譯完成

編譯完成後的內核檔會保存在out/arch/arm64/boot資料夾中,名稱為Image.gz-dtb。

6.2 修改配置

輸入如下命令:

cd ~/kernel/src/out

make menuconfig

圖6.3 配置頁面

即可進入配置頁面,在該頁面中選擇需要開啟的選項。配置完畢後,方向鍵左右選擇「Save」,回車。然後選擇「Exit」結束,返回命令列頁面。

輸入命令:

cd ../

make ARCH=arm64 O=out CC=clang -j執行緒數

即可按新配置進行編譯。



7 將內核打包刷入裝置

在本節中,您需要使用打包工具將內核刷入裝置。

我使用的是AIK,計畫地址為https://github.com/ndrancs/AIK-Linux-x32-x64

還可以使用AnyKernel3進行打包,地址為https://github.com/osm0sis/AnyKernel3,教程地址https://github.com/tiann/KernelSU/discussions/952

詳細步驟施工中……