[心得] 編譯修改Android Kernel
修改Android kernel(內核)可以開啟一些隱藏的功能,也意味著要從頭編譯kernel,要懂一
點C語言。
先從簡單的開始: 刷入自己修改過的kernel後,會在手機核心版本顯示自己的名字。
https://i.imgur.com/p1ztOFH.png

網誌好讀版: https://bit.ly/3yWRh7Y
## 一、硬體要求
要刷kernel,手機必定已經解鎖。刷kernel不會重置手機資料,所以刷之前只要備份boot分
區,避免卡開機。
.手機: 紅米Note 5 (whyred),系統為LineageOS 18。
.電腦: Intel Core 2 Q9550 + 4GB DDR2 RAM,作業系統: Lubuntu 20.04。
## 二、步驟概述
編譯kernel包含除錯可能會花至少一天的時間。
下載kernel原始碼 → 下載交叉編譯器 → 簡單加上名字後第一次編譯 → 刷入手機看功能
正不正常 → menuconfig修改kernel → 重新編譯 → 刷入到手機
我們會在Linux電腦桌面建立一個叫做`customkernel`的目錄當作工作目錄。在第五步開始
編譯前裡面大概長這樣:
https://i.imgur.com/F6NVAC9.jpg

接著安裝以下套件
```
sudo apt install git-core gnupg flex bison gperf build-essential zip curl zlib1g
-dev \
gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev \
x11proto-core-dev libx11-dev lib32z-dev libgl1-mesa-dev \
libxml2-utils xsltproc unzip bc
```
## 三、取得kernel原始碼
原廠的kernel或第三方kernel都可以,通常會把原始碼放在Github。
我選擇有額外功能的"RAD Kernel"專案,這個專案程式碼問題比較少。
1. 到他們的Github,使用指令clone原始碼
```bash
git clone https://github.com/radcolor/android_kernel_xiaomi_whyred.git
```
2. 為了方便識別,將clone下來的目錄重新命名為"src"。
## 四、下載交叉編譯器
1. 使用EVA GCC編譯。到[XDA](https://bit.ly/3sDj4sP)下載ARM與ARM64的版本(點選dire
ct download下載)
2. 將下載的arm版本解壓縮,命名為tc32。
3. aarch64解壓縮,命名為tc。
4. 將這二個目錄移動到customkernel,到目前為止目錄長這樣,src是kerenl原始碼的目錄
,tc和tc32則是剛剛下載的交叉編譯器。
https://i.imgur.com/F6NVAC9.jpg

## 五、第一次測試編譯
1. 進入src的目錄,在這裡開啟終端機。先export環境變數:
```
#以下分別對應tc和tc32所在的目錄,以及檔案名稱前綴
export CROSS_COMPILE=/home/ivon/Desktop/customkernel/tc/bin/aarch64-elf-
export CROSS_COMPILE_ARM32=/home/ivon/Desktop/customkernel/tc32/bin/arm-eabi-
export ARCH=arm64
```
2. 按照`機型_config`檔案產生設定,該檔案通常在`arch/arm64/configs`。
```
make whyred_defconfig
#輸出: configuration written to .config
```
3. 開啟src目錄的`MakeFile`,在`EXTRAVERSION`後面加入自己名字的字串:
https://i.imgur.com/Xziza5e.jpg

4. 接著開始編譯kernel
```bash
make
```
5. 這台電腦編譯至少要20分鐘,若遇到error編譯器就會停下來,要去改程式碼再重新make
,編譯器會從上個中止的地方繼續。關於常見錯誤,參考這篇: [編譯Android kernel遇到
的error紀錄](https://bit.ly/3muc1yY)
https://i.imgur.com/ZtBgwje.jpg

6. 編譯好的檔案位於`arch/arm64/boot/`,應該會有一個`Image.gz-dtb`的檔案。
https://i.imgur.com/FPeyYaQ.jpg

7. 接著要重新打包boot.img,把原廠的boot.img解開之後把我們做的kernel塞進去。到[XD
A](https://bit.ly/3proFAr)下載Linux版AIK (點選文中的AIK-Linux-v3.8-ALL.tar.gz附
件),解壓縮。
8. 手機進入TWRP → Advanced → Terminal,使用dd指令從手機提取原廠的boot.img。
```
dd if=/dev/block/bootdevice/by-name/boot of=/sdcard/stockboot.img
```
9. 把這個原廠的`stockboot.img`檔案傳輸到電腦,放到AIK的工作目錄,並將剛剛編譯的`
Image.gz-dtb`也放到這個目錄。
https://i.imgur.com/qR8rDbw.jpg

10. 在AIK目錄開啟終端機,使用指令解開stockboot.img(需要sudo)
```
./unpackimg.sh stockboot.img
```
11. 進入目錄`split_img`,把`stockboot.img-kernel`檔案替換成我們編譯好的Image.gz-
dtb(檔名要改成stockboot.img-kernel)。
12. 回到AIK目錄,重新打包,應該會得到一個`image-new.img`的檔案。
```
./repackimg.sh
```
https://i.imgur.com/OXKMpKS.jpg

## 六、刷入到手機
將新的`image-new.img`傳輸到手機,用TWRP點選Install Image,刷入到boot分區。
接著就是看看能不能開機了...若卡開機,還原TWRP的boot分區備份,繼續在電腦上debug吧
...
## 七、menuconfig開關kernel功能
如果前六個步驟成功完成,那就來真正修改kernel吧。
1. 在src目錄開啟終端機,輸入指令開啟kconfig選單,用於開關kernel的功能。
```
make menuconfig
```
2. 使用鍵盤上下和Enter進入子選項。找到要開啟的項目按下`y`,然後用鍵盤左右鍵移動
到`Save`儲存設定值。
https://i.imgur.com/6Dng78e.jpg

3. 改好後切換到`Exit`退出,寫入變更,再次開始編譯kernel:
```
make
```
4. 接著重複第五步的步驟,編譯成功後把kernel打包,刷到手機測試。
心得:
編譯kernel不用花大把時間下載原始碼,只要挑到狀況比較好的專案,編譯時遇到的問題就
會少很多。
--
https://i.imgur.com/qBnCgUO.jpg




--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.255.36.253 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/MobileComm/M.1640501948.A.925.html
※ 編輯: ivon852 (111.255.36.253 臺灣), 12/26/2021 14:59:57
推
12/26 15:22,
3年前
, 1F
12/26 15:22, 1F
推
12/26 15:45,
3年前
, 2F
12/26 15:45, 2F
推
12/26 15:52,
3年前
, 3F
12/26 15:52, 3F
→
12/26 15:53,
3年前
, 4F
12/26 15:53, 4F
→
12/26 15:53,
3年前
, 5F
12/26 15:53, 5F
推
12/26 16:14,
3年前
, 6F
12/26 16:14, 6F
推
12/26 16:21,
3年前
, 7F
12/26 16:21, 7F
推
12/26 16:39,
3年前
, 8F
12/26 16:39, 8F
推
12/26 16:43,
3年前
, 9F
12/26 16:43, 9F
推
12/26 16:56,
3年前
, 10F
12/26 16:56, 10F
→
12/26 16:57,
3年前
, 11F
12/26 16:57, 11F
→
12/26 16:57,
3年前
, 12F
12/26 16:57, 12F
推
12/26 16:58,
3年前
, 13F
12/26 16:58, 13F
→
12/26 16:59,
3年前
, 14F
12/26 16:59, 14F
→
12/26 17:07,
3年前
, 15F
12/26 17:07, 15F
→
12/26 17:28,
3年前
, 16F
12/26 17:28, 16F
文中的確是沒有,但是編譯錯誤的時候要手動去改C寫的原始碼。
→
12/26 17:45,
3年前
, 17F
12/26 17:45, 17F
推
12/26 18:05,
3年前
, 18F
12/26 18:05, 18F
噓
12/26 18:15,
3年前
, 19F
12/26 18:15, 19F
→
12/26 18:16,
3年前
, 20F
12/26 18:16, 20F
※ 編輯: ivon852 (111.255.36.253 臺灣), 12/26/2021 18:58:42
推
12/26 19:08,
3年前
, 21F
12/26 19:08, 21F
→
12/26 19:23,
3年前
, 22F
12/26 19:23, 22F
推
12/26 19:35,
3年前
, 23F
12/26 19:35, 23F
推
12/26 20:06,
3年前
, 24F
12/26 20:06, 24F
→
12/26 20:08,
3年前
, 25F
12/26 20:08, 25F
→
12/26 20:08,
3年前
, 26F
12/26 20:08, 26F
→
12/26 20:26,
3年前
, 27F
12/26 20:26, 27F
推
12/26 20:36,
3年前
, 28F
12/26 20:36, 28F
→
12/26 20:36,
3年前
, 29F
12/26 20:36, 29F
推
12/26 20:56,
3年前
, 30F
12/26 20:56, 30F
→
12/26 20:56,
3年前
, 31F
12/26 20:56, 31F
推
12/26 21:14,
3年前
, 32F
12/26 21:14, 32F
推
12/26 21:32,
3年前
, 33F
12/26 21:32, 33F
→
12/26 21:32,
3年前
, 34F
12/26 21:32, 34F
推
12/26 21:38,
3年前
, 35F
12/26 21:38, 35F
→
12/26 21:39,
3年前
, 36F
12/26 21:39, 36F
推
12/26 21:53,
3年前
, 37F
12/26 21:53, 37F
→
12/26 21:53,
3年前
, 38F
12/26 21:53, 38F
推
12/26 22:20,
3年前
, 39F
12/26 22:20, 39F
推
12/26 22:30,
3年前
, 40F
12/26 22:30, 40F
推
12/26 22:53,
3年前
, 41F
12/26 22:53, 41F
→
12/26 23:51,
3年前
, 42F
12/26 23:51, 42F
→
12/26 23:51,
3年前
, 43F
12/26 23:51, 43F
→
12/27 00:12,
3年前
, 44F
12/27 00:12, 44F
推
12/27 00:34,
3年前
, 45F
12/27 00:34, 45F
推
12/27 00:47,
3年前
, 46F
12/27 00:47, 46F
推
12/27 01:58,
3年前
, 47F
12/27 01:58, 47F
推
12/27 02:18,
3年前
, 48F
12/27 02:18, 48F
→
12/27 02:19,
3年前
, 49F
12/27 02:19, 49F
受教了,我的動機也是要跑docker才改kernel的
推
12/27 08:04,
3年前
, 50F
12/27 08:04, 50F
推
12/27 08:14,
3年前
, 51F
12/27 08:14, 51F
推
12/27 09:49,
3年前
, 52F
12/27 09:49, 52F
→
12/27 09:56,
3年前
, 53F
12/27 09:56, 53F
→
12/27 10:27,
3年前
, 54F
12/27 10:27, 54F
→
12/27 10:27,
3年前
, 55F
12/27 10:27, 55F
推
12/27 11:13,
3年前
, 56F
12/27 11:13, 56F
→
12/27 11:13,
3年前
, 57F
12/27 11:13, 57F
→
12/27 11:13,
3年前
, 58F
12/27 11:13, 58F
推
12/27 11:30,
3年前
, 59F
12/27 11:30, 59F
推
12/27 12:24,
3年前
, 60F
12/27 12:24, 60F
推
12/27 12:38,
3年前
, 61F
12/27 12:38, 61F
→
12/27 13:14,
3年前
, 62F
12/27 13:14, 62F
※ 編輯: ivon852 (42.75.233.207 臺灣), 12/27/2021 14:25:43
推
12/27 14:36,
3年前
, 63F
12/27 14:36, 63F
→
12/27 15:50,
3年前
, 64F
12/27 15:50, 64F
推
12/27 18:28,
3年前
, 65F
12/27 18:28, 65F
推
12/27 19:21,
3年前
, 66F
12/27 19:21, 66F
→
12/27 19:21,
3年前
, 67F
12/27 19:21, 67F
推
12/28 00:41,
3年前
, 68F
12/28 00:41, 68F
推
12/28 14:02,
3年前
, 69F
12/28 14:02, 69F
MobileComm 近期熱門文章
PTT數位生活區 即時熱門文章
7
50