編譯修改Android Kernel - 手機討論

Odelette avatar
By Odelette
at 2021-12-26T14:59

Table of Contents

修改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
https://i.imgur.com/klpjZcQ.jpg
https://i.imgur.com/yLTmoHs.jpg
https://i.imgur.com/WepO17T.jpg

--
Tags: 手機

All Comments

Suhail Hany avatar
By Suhail Hany
at 2021-12-29T19:08
看不懂先推
Ethan avatar
By Ethan
at 2022-01-01T23:17
認真玩手機,推
Hardy avatar
By Hardy
at 2021-12-30T21:43
原廠沒有開源kernel是不是就不能修改了
Anonymous avatar
By Anonymous
at 2022-01-03T01:52
前陣子看到1+9開發人員在罵1+不開源kernel
應該說XDA上的第三方開發人員
William avatar
By William
at 2021-12-30T21:43
推。看不懂的我先存留後詳讀。
Daniel avatar
By Daniel
at 2022-01-03T01:52
可以刷首抽嗎
Suhail Hany avatar
By Suhail Hany
at 2021-12-30T21:43
先推再說
Necoo avatar
By Necoo
at 2022-01-03T01:52
看不懂, 先推一下
Steve avatar
By Steve
at 2021-12-30T21:43
夠hardcore 給推
Kumar avatar
By Kumar
at 2022-01-03T01:52
1+不是對開發者很友好?會有不給kernel source code的問
題嗎
Mason avatar
By Mason
at 2021-12-30T21:43
所以沒開源的只能用原廠的 boot.img
Charlotte avatar
By Charlotte
at 2022-01-03T01:52
1+9 不是內核不更新才被罵的嗎
Yuri avatar
By Yuri
at 2021-12-30T21:43
隔壁有AndroidDev...
Una avatar
By Una
at 2022-01-03T01:52
所以你到底哪裡用到C語言??
Anonymous avatar
By Anonymous
at 2021-12-30T21:43
樓上一說我才發現 整篇哪裡有用到C?
Erin avatar
By Erin
at 2022-01-03T01:52
文章其實可以轉到AndroidDev......
Belly avatar
By Belly
at 2021-12-30T21:43
你修改了什麼C語言內容?
Frederic avatar
By Frederic
at 2022-01-03T01:52
而且telnet BBS又不吃md語法…到底…
Iris avatar
By Iris
at 2021-12-30T21:43
kernel理論上一定要開源,授權的規範是這樣
Jake avatar
By Jake
at 2022-01-03T01:52
干貨太多了吧
Ula avatar
By Ula
at 2021-12-30T21:43
不懂 但還是推
Noah avatar
By Noah
at 2022-01-03T01:52
敢不開源,在美國混的話會先吃GPL v2的法律問題吧
Daniel avatar
By Daniel
at 2021-12-30T21:43
然後這邊要說的是,原PO這比較像是敲門磚,其他的東西其實
要改很吃經驗和背景知識,每隻手機的狀況也不盡相同
Caitlin avatar
By Caitlin
at 2022-01-03T01:52
刷了以後可以幹嘛?
Caitlin avatar
By Caitlin
at 2021-12-30T21:43
推,md本來就是設計為純文字也能方便讀寫的標記語言,用md
不覺得有什麼問題
Necoo avatar
By Necoo
at 2022-01-03T01:52
用md在純文字介面下真的沒什麼問題
幾個#或```不會太影響閱讀
Queena avatar
By Queena
at 2021-12-30T21:43
Hazel avatar
By Hazel
at 2022-01-03T01:52
原廠的內核有時候沒有第三方的大神寫的好
畢竟領錢辦事的跟基於愛好的,結果還是有點不同
Caroline avatar
By Caroline
at 2021-12-30T21:43
BSP的來推個~
Sarah avatar
By Sarah
at 2022-01-03T01:52
Build code蠻花時間的 還有電腦速度有差
Isla avatar
By Isla
at 2021-12-30T21:43
謝啦,等到了,一直想在Android上面開docker,過年有空有
Jake avatar
By Jake
at 2022-01-03T01:52
玩具了
Edward Lewis avatar
By Edward Lewis
at 2021-12-30T21:43
阿賀野級真香
Eartha avatar
By Eartha
at 2022-01-03T01:52
有些第三方開放了很多功能,真的蠻實用的
Puput avatar
By Puput
at 2021-12-30T21:43
Queena avatar
By Queena
at 2022-01-03T01:52
以前android 2.x的時代刷內核是常有的事情 以前xperia x
Jack avatar
By Jack
at 2021-12-30T21:43
8要刷naa內核才有多點觸控
Carolina Franco avatar
By Carolina Franco
at 2022-01-03T01:52
居然還在用Q9550
Selena avatar
By Selena
at 2021-12-30T21:43
嗯嗯原來如此
Isla avatar
By Isla
at 2022-01-03T01:52
推推
Delia avatar
By Delia
at 2021-12-30T21:43
推推
Ina avatar
By Ina
at 2022-01-03T01:52
應該要加個syscall來玩一下 單純build沒意思
Rosalind avatar
By Rosalind
at 2021-12-30T21:43
改名字不能叫修改kernel吧
Thomas avatar
By Thomas
at 2022-01-03T01:52
我從來都不知道內核和Rom有什麼關連...
Daniel avatar
By Daniel
at 2021-12-30T21:43
Genevieve avatar
By Genevieve
at 2022-01-03T01:52
現在都gki了 自己build是為了?
Heather avatar
By Heather
at 2021-12-30T21:43
恭喜你可以開發鴻蒙3.0啦(誤
Blanche avatar
By Blanche
at 2022-01-03T01:52
感覺這邊不寫程式的居多 所以要玩這個建議拿不要的
手機來玩 不然怎麼死的都不知道
Gilbert avatar
By Gilbert
at 2021-12-30T21:43
好懷念那個時候為了讓手機功能豐富 或是為了新UI在那邊
刷啊 現在手機功能足了 又多了銀行支付等等的功能 已經
沒有動力修修改改了
Carolina Franco avatar
By Carolina Franco
at 2022-01-03T01:52
這篇在幹嘛...?
Skylar DavisLinda avatar
By Skylar DavisLinda
at 2021-12-30T21:43
跟我想的一樣 給推
Kyle avatar
By Kyle
at 2022-01-03T01:52
先推
John avatar
By John
at 2021-12-30T21:43
動機...?
Skylar Davis avatar
By Skylar Davis
at 2022-01-03T01:52
不懂 但感覺很屌 推
Daniel avatar
By Daniel
at 2021-12-30T21:43
懂C不代表會用到C
Leila avatar
By Leila
at 2022-01-03T01:52
先推再說
Genevieve avatar
By Genevieve
at 2021-12-30T21:43
Hardcore推,上次這樣玩大概已經是小米2S那個時期了,
現在已經沒那個時間這樣玩了
Candice avatar
By Candice
at 2022-01-03T01:52
推技術
Donna avatar
By Donna
at 2021-12-30T21:43
Isabella avatar
By Isabella
at 2022-01-03T01:52
推 hard core

三星S20+遊戲時這功能要怎麼關掉?

Tracy avatar
By Tracy
at 2021-12-26T14:38
直接附圖 https://i.imgur.com/OCUfKp4.jpg 最近比較少玩手遊 今天無聊發現開任何遊戲左上角都多了那個側邊半透明按鈕 點下去螢幕亮度直接調到最暗 因為還蠻容易誤觸到有點惱人 摸了老半天也看不到去哪關掉 請問有人知道這功能要在哪關嗎? - ...

現在的5G是不是很雞肋啊

Hardy avatar
By Hardy
at 2021-12-26T12:55
最近因為合約快到了所以稍微看了一下各家的網路方案 結果現在月費1000以下的方案幾乎都是限流量,就算1399也是限熱點 可是5G的目的不就是超快網速嗎,那麼快但只給用一點點量是還限制一堆有屁用啊== 而且以日常使用來說4G→5G也不像當初3G→4G那麼有感 我拿我朋友辦的5G吃到飽看影片跟用我自己4G網路看也 ...

Pixel 3升級android 12後無法登入Google

Bethany avatar
By Bethany
at 2021-12-26T09:19
我3a 原本用10從來沒有更新過 一直被通知要升級 昨天睡前也是手殘不小心點到 起床要去打球時 發現跟原po一樣問題 搜尋掛掉 地圖掛掉 YouTube不行用 google play也一直要我驗證 查了很多方法目前也還是無法解決問題.... 幹原本用很爽還打算買個幾隻6給同事當公司機 現在整個滅火. ...

中華499被鎖上傳速度?

Olga avatar
By Olga
at 2021-12-26T08:55
印象中以前都是在30~50間 最近怎麼測都在10左右 中華不是不限速? 偷偷鎖上傳也太 不過下載還是可以跑200~400間 - ...

poco x3pro line雙開問題

Caroline avatar
By Caroline
at 2021-12-26T07:56
請問我在poco x3pro雙開下 原本的line是都可傳送圖片 跟看的到別人 傳送過來的圖 都很正常 雙開分身第二帳號的line卻無法 拍照 傳圖 也無法看到別人傳送來的圖耶!只有雙方文字? 拍照 傳圖 跟對方傳送來的圖都無法顯示 問題出在哪呢? 已經砍過好幾次加重新安裝了! 還是問題一樣耶! ...