[心得] 編譯修改Android Kernel

看板MobileComm (行動通訊)作者 (內容農場殺手)時間3年前 (2021/12/26 14:59), 3年前編輯推噓37(38130)
留言69則, 48人參與, 3年前最新討論串1/1
修改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
-- ※ 發信站: 批踢踢實業坊(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
原廠沒有開源kernel是不是就不能修改了
12/26 15:52, 3F

12/26 15:53, 3年前 , 4F
前陣子看到1+9開發人員在罵1+不開源kernel
12/26 15:53, 4F

12/26 15:53, 3年前 , 5F
應該說XDA上的第三方開發人員
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
夠hardcore 給推
12/26 16:56, 10F

12/26 16:57, 3年前 , 11F
1+不是對開發者很友好?會有不給kernel source code的問
12/26 16:57, 11F

12/26 16:57, 3年前 , 12F
題嗎
12/26 16:57, 12F

12/26 16:58, 3年前 , 13F
所以沒開源的只能用原廠的 boot.img
12/26 16:58, 13F

12/26 16:59, 3年前 , 14F
1+9 不是內核不更新才被罵的嗎
12/26 16:59, 14F

12/26 17:07, 3年前 , 15F
隔壁有AndroidDev...
12/26 17:07, 15F

12/26 17:28, 3年前 , 16F
所以你到底哪裡用到C語言??
12/26 17:28, 16F
文中的確是沒有,但是編譯錯誤的時候要手動去改C寫的原始碼。

12/26 17:45, 3年前 , 17F
樓上一說我才發現 整篇哪裡有用到C?
12/26 17:45, 17F

12/26 18:05, 3年前 , 18F
文章其實可以轉到AndroidDev......
12/26 18:05, 18F

12/26 18:15, 3年前 , 19F
你修改了什麼C語言內容?
12/26 18:15, 19F

12/26 18:16, 3年前 , 20F
而且telnet BBS又不吃md語法…到底…
12/26 18:16, 20F
※ 編輯: ivon852 (111.255.36.253 臺灣), 12/26/2021 18:58:42

12/26 19:08, 3年前 , 21F
kernel理論上一定要開源,授權的規範是這樣
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
敢不開源,在美國混的話會先吃GPL v2的法律問題吧
12/26 20:06, 24F

12/26 20:08, 3年前 , 25F
然後這邊要說的是,原PO這比較像是敲門磚,其他的東西其實
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
推,md本來就是設計為純文字也能方便讀寫的標記語言,用md
12/26 20:36, 28F

12/26 20:36, 3年前 , 29F
不覺得有什麼問題
12/26 20:36, 29F

12/26 20:56, 3年前 , 30F
用md在純文字介面下真的沒什麼問題
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
BSP的來推個~
12/26 21:38, 35F

12/26 21:39, 3年前 , 36F
Build code蠻花時間的 還有電腦速度有差
12/26 21:39, 36F

12/26 21:53, 3年前 , 37F
謝啦,等到了,一直想在Android上面開docker,過年有空有
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
以前android 2.x的時代刷內核是常有的事情 以前xperia x
12/26 23:51, 42F

12/26 23:51, 3年前 , 43F
8要刷naa內核才有多點觸控
12/26 23:51, 43F

12/27 00:12, 3年前 , 44F
居然還在用Q9550
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
應該要加個syscall來玩一下 單純build沒意思
12/27 02:18, 48F

12/27 02:19, 3年前 , 49F
改名字不能叫修改kernel吧
12/27 02:19, 49F
受教了,我的動機也是要跑docker才改kernel的

12/27 08:04, 3年前 , 50F
我從來都不知道內核和Rom有什麼關連...
12/27 08:04, 50F

12/27 08:14, 3年前 , 51F
12/27 08:14, 51F

12/27 09:49, 3年前 , 52F
現在都gki了 自己build是為了?
12/27 09:49, 52F

12/27 09:56, 3年前 , 53F
恭喜你可以開發鴻蒙3.0啦(誤
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
好懷念那個時候為了讓手機功能豐富 或是為了新UI在那邊
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
懂C不代表會用到C
12/27 15:50, 64F

12/27 18:28, 3年前 , 65F
先推再說
12/27 18:28, 65F

12/27 19:21, 3年前 , 66F
Hardcore推,上次這樣玩大概已經是小米2S那個時期了,
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
文章代碼(AID): #1Xo1Ayab (MobileComm)
文章代碼(AID): #1Xo1Ayab (MobileComm)