顯示廣告
隱藏 ✕
※ 本文轉寄自 ptt.cc 更新時間: 2021-12-27 00:24:12
看板 MobileComm
作者 ivon852 (內容農場殺手)
標題 [心得] 編譯修改Android Kernel
時間 Sun Dec 26 14:59:04 2021


修改Android kernel(內核)可以開啟一些隱藏的功能,也意味著要從頭編譯kernel,要懂一
點C語言。

先從簡單的開始: 刷入自己修改過的kernel後,會在手機核心版本顯示自己的名字。
https://i.imgur.com/p1ztOFH.png
[圖]

網誌好讀版: https://bit.ly/3yWRh7Y
如何編譯修改Android Kernel(內核) | Ivon's Blog
[圖]
[圖]
本文簡述如何自行修改Android kernel,開啟特定的功能,再重新編譯檔案,將其刷入手機。先從簡單的開始: 刷入自己修改過的kernel後,會在手機核心版本顯示自己的名字。 如果成功了,那麼就能更進一步去調kernel的功能,例如把docker要求的功能全部打開,就能在Android手機跑do ...

 

## 一、硬體要求

要刷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
[圖]


## 三、取得kernel原始碼

原廠的kernel或第三方kernel都可以,通常會把原始碼放在Github。
我選擇有額外功能的"RAD Kernel"專案,這個專案程式碼問題比較少。

1. 到他們的Github,使用指令clone原始碼
``bash
git clone https://github.com/radcolor/android_kernel_xiaomi_whyred.git
GitHub - radcolor/android_kernel_xiaomi_whyred: 🐧 Linux kernel sources for Redmi Note 5 Pro/AI (whyred) • https://telegra.ph/Rad-Kernel-Sources-whyred-09-04
[圖]
🐧 Linux kernel sources for Redmi Note 5 Pro/AI (whyred) • - GitHub - radcolor/android_kernel_xiaomi_whyred: 🐧 Linux kernel sources for Redmi Note 5 Pr ...

 
``

2. 為了方便識別,將clone下來的目錄重新命名為"src"。


## 四、下載交叉編譯器
1. 使用EVA GCC編譯。到[XDA](https://bit.ly/3sDj4sP)下載ARM與ARM64的版本(點選dire
[GCC][Toolchain] Eva GCC | Calling all kernel devs! | XDA Forums
[圖]
Introducing Eva GCC Toolchain
What is GCC?
The GNU Compiler Collection (GCC) is an optimizing compiler produced by the GNU Project supporting various. ...

 
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)
編譯Android Kernel遇到的error紀錄 | Ivon's Blog
這篇文章紀錄我編譯Android kernel(內核)遇到的錯誤,大多不是深入的程式寫法的問題,只要找到正確的檔案修改一下就解決了。把問題拿去Google通常都有簡單的答案,錯誤訊息用” “框起來搜尋更有機會找到別人遇過的錯誤。 ...

 
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附
[TOOL] Android Image Kitchen - Unpack/Repack Kernel Ramdisk [Win/Android/Linux/Mac] | XDA Forums
[圖]
Android Image Kitchen -- Unpack/Repack Kernel+Recovery Images, and Edit the ramdisk.
Windows ports of the necessary Linux utils for Android image... ...

 
件),解壓縮。

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

--
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.255.36.253 (臺灣)
※ 文章代碼(AID): #1Xo1Ayab (MobileComm)
※ 文章網址: https://www.ptt.cc/bbs/MobileComm/M.1640501948.A.925.html
※ 編輯: ivon852 (111.255.36.253 臺灣), 12/26/2021 14:59:57
bingo77786: 看不懂先推1F 12/26 15:22
speed7022: 認真玩手機,推2F 12/26 15:45
pmes9866: 原廠沒有開源kernel是不是就不能修改了3F 12/26 15:52
pmes9866: 前陣子看到1+9開發人員在罵1+不開源kernel
pmes9866: 應該說XDA上的第三方開發人員
ta497636: 推。看不懂的我先存留後詳讀。6F 12/26 16:14
Nigger5566: 可以刷首抽嗎7F 12/26 16:21
ShibaTatsuya: 先推再說8F 12/26 16:39
athraugh: 看不懂, 先推一下9F 12/26 16:43
oppoR20: 夠hardcore 給推10F 12/26 16:56
oppoR20: 1+不是對開發者很友好?會有不給kernel source code的問
oppoR20: 題嗎
abc0922001: 所以沒開源的只能用原廠的 boot.img13F 12/26 16:58
abc0922001: 1+9 不是內核不更新才被罵的嗎
brli7848: 隔壁有AndroidDev...15F 12/26 17:07
starskyjth: 所以你到底哪裡用到C語言??16F 12/26 17:28
文中的確是沒有,但是編譯錯誤的時候要手動去改C寫的原始碼。
school4303: 樓上一說我才發現 整篇哪裡有用到C?17F 12/26 17:45
Fm4n: 文章其實可以轉到AndroidDev......18F 12/26 18:05
nigue: 你修改了什麼C語言內容?19F 12/26 18:15
brli7848: 而且telnet BBS又不吃md語法…到底…20F 12/26 18:16
※ 編輯: ivon852 (111.255.36.253 臺灣), 12/26/2021 18:58:42
nimiq5566: kernel理論上一定要開源,授權的規範是這樣21F 12/26 19:08
ruizachi: 干貨太多了吧22F 12/26 19:23
gbls9527341: 不懂 但還是推23F 12/26 19:35
Arbin: 敢不開源,在美國混的話會先吃GPL v2的法律問題吧24F 12/26 20:06
Arbin: 然後這邊要說的是,原PO這比較像是敲門磚,其他的東西其實
Arbin: 要改很吃經驗和背景知識,每隻手機的狀況也不盡相同
qscgy4: 刷了以後可以幹嘛?27F 12/26 20:26
romber: 推,md本來就是設計為純文字也能方便讀寫的標記語言,用md28F 12/26 20:36
romber: 不覺得有什麼問題
ededws1: 用md在純文字介面下真的沒什麼問題30F 12/26 20:56
ededws1: 幾個#或``不會太影響閱讀
Taichun318: 推32F 12/26 21:14
abc0922001: 原廠的內核有時候沒有第三方的大神寫的好33F 12/26 21:32
abc0922001: 畢竟領錢辦事的跟基於愛好的,結果還是有點不同
abc127845: BSP的來推個~35F 12/26 21:38
abc127845: Build code蠻花時間的 還有電腦速度有差
Cireiat: 謝啦,等到了,一直想在Android上面開docker,過年有空有37F 12/26 21:53
Cireiat: 玩具了
mdk3500: 阿賀野級真香39F 12/26 22:20
ja881213: 有些第三方開放了很多功能,真的蠻實用的40F 12/26 22:30
kyocartoon: 推41F 12/26 22:53
oppoR20: 以前android 2.x的時代刷內核是常有的事情 以前xperia x42F 12/26 23:51
oppoR20: 8要刷naa內核才有多點觸控
ben79968: 居然還在用Q955044F 12/27 00:12

--
※ 看板: MobileComm 文章推薦值: 0 目前人氣: 0 累積人氣: 302 
分享網址: 複製 已複製
guest
x)推文 r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇