※ 本文轉寄自 ptt.cc 更新時間: 2021-12-27 00:24:12
看板 MobileComm
作者 標題 [心得] 編譯修改Android Kernel
時間 Sun Dec 26 14:59:04 2021
修改Android kernel(內核)可以開啟一些隱藏的功能,也意味著要從頭編譯kernel,要懂一
點C語言。
先從簡單的開始: 刷入自己修改過的kernel後,會在手機核心版本顯示自己的名字。
https://i.imgur.com/p1ztOFH.png
![[圖]](https://i4.disp.cc/imgur/p1ztOFHh.png)
網誌好讀版: https://bit.ly/3yWRh7Y
如何編譯修改Android Kernel(內核) | Ivon's Blog
![[圖]]()
本文簡述如何自行修改Android kernel,開啟特定的功能,再重新編譯檔案,將其刷入手機。先從簡單的開始: 刷入自己修改過的kernel後,會在手機核心版本顯示自己的名字。 如果成功了,那麼就能更進一步去調kernel的功能,例如把docker要求的功能全部打開,就能在Android手機跑do ...
![[圖]](https://i4.disp.cc/t/s2/i.imgur.com/p1ztOFHb.png)
![[圖]](https://i4.disp.cc/t/s2/i.imgur.com/F6NVAC9b.jpg)
## 一、硬體要求
要刷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
![[圖]](https://i4.disp.cc/imgur/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. ...
![[圖]](https://forum.xda-developers.com/data/assets/logo/header-forum.jpeg)
What is GCC?
The GNU Compiler Collection (GCC) is an optimizing compiler produced by the GNU Project supporting various. ...
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
![[圖]](https://i4.disp.cc/imgur/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通常都有簡單的答案,錯誤訊息用” “框起來搜尋更有機會找到別人遇過的錯誤。 ...
這篇文章紀錄我編譯Android kernel(內核)遇到的錯誤,大多不是深入的程式寫法的問題,只要找到正確的檔案修改一下就解決了。把問題拿去Google通常都有簡單的答案,錯誤訊息用” “框起來搜尋更有機會找到別人遇過的錯誤。 ...
![[圖]](https://i4.disp.cc/imgur/ZtBgwje.jpg)
6. 編譯好的檔案位於
arch/arm64/boot/
,應該會有一個Image.gz-dtb
的檔案。https://i.imgur.com/FPeyYaQ.jpg
![[圖]](https://i4.disp.cc/imgur/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... ...
![[圖]](https://forum.xda-developers.com/data/assets/logo/header-forum.jpeg)
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
![[圖]](https://i4.disp.cc/imgur/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
![[圖]](https://i4.disp.cc/imgur/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
![[圖]](https://i4.disp.cc/imgur/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
--
推 : 看不懂先推1F 12/26 15:22
推 : 認真玩手機,推2F 12/26 15:45
推 : 原廠沒有開源kernel是不是就不能修改了3F 12/26 15:52
→ : 前陣子看到1+9開發人員在罵1+不開源kernel
→ : 應該說XDA上的第三方開發人員
→ : 前陣子看到1+9開發人員在罵1+不開源kernel
→ : 應該說XDA上的第三方開發人員
推 : 推。看不懂的我先存留後詳讀。6F 12/26 16:14
推 : 可以刷首抽嗎7F 12/26 16:21
推 : 先推再說8F 12/26 16:39
推 : 看不懂, 先推一下9F 12/26 16:43
推 : 夠hardcore 給推10F 12/26 16:56
→ : 1+不是對開發者很友好?會有不給kernel source code的問
→ : 題嗎
→ : 1+不是對開發者很友好?會有不給kernel source code的問
→ : 題嗎
推 : 所以沒開源的只能用原廠的 boot.img13F 12/26 16:58
→ : 1+9 不是內核不更新才被罵的嗎
→ : 1+9 不是內核不更新才被罵的嗎
→ : 隔壁有AndroidDev...15F 12/26 17:07
→ : 所以你到底哪裡用到C語言??16F 12/26 17:28
文中的確是沒有,但是編譯錯誤的時候要手動去改C寫的原始碼。→ : 樓上一說我才發現 整篇哪裡有用到C?17F 12/26 17:45
推 : 文章其實可以轉到AndroidDev......18F 12/26 18:05
噓 : 你修改了什麼C語言內容?19F 12/26 18:15
→ : 而且telnet BBS又不吃md語法…到底…20F 12/26 18:16
※ 編輯: ivon852 (111.255.36.253 臺灣), 12/26/2021 18:58:42推 : kernel理論上一定要開源,授權的規範是這樣21F 12/26 19:08
→ : 干貨太多了吧22F 12/26 19:23
推 : 不懂 但還是推23F 12/26 19:35
推 : 敢不開源,在美國混的話會先吃GPL v2的法律問題吧24F 12/26 20:06
→ : 然後這邊要說的是,原PO這比較像是敲門磚,其他的東西其實
→ : 要改很吃經驗和背景知識,每隻手機的狀況也不盡相同
→ : 然後這邊要說的是,原PO這比較像是敲門磚,其他的東西其實
→ : 要改很吃經驗和背景知識,每隻手機的狀況也不盡相同
→ : 刷了以後可以幹嘛?27F 12/26 20:26
推 : 推,md本來就是設計為純文字也能方便讀寫的標記語言,用md28F 12/26 20:36
→ : 不覺得有什麼問題
→ : 不覺得有什麼問題
推 : 用md在純文字介面下真的沒什麼問題30F 12/26 20:56
→ : 幾個#或```不會太影響閱讀
→ : 幾個#或```不會太影響閱讀
推 : 推32F 12/26 21:14
推 : 原廠的內核有時候沒有第三方的大神寫的好33F 12/26 21:32
→ : 畢竟領錢辦事的跟基於愛好的,結果還是有點不同
→ : 畢竟領錢辦事的跟基於愛好的,結果還是有點不同
推 : BSP的來推個~35F 12/26 21:38
→ : Build code蠻花時間的 還有電腦速度有差
→ : Build code蠻花時間的 還有電腦速度有差
推 : 謝啦,等到了,一直想在Android上面開docker,過年有空有37F 12/26 21:53
→ : 玩具了
→ : 玩具了
推 : 阿賀野級真香39F 12/26 22:20
推 : 有些第三方開放了很多功能,真的蠻實用的40F 12/26 22:30
推 : 推41F 12/26 22:53
→ : 以前android 2.x的時代刷內核是常有的事情 以前xperia x42F 12/26 23:51
→ : 8要刷naa內核才有多點觸控
→ : 8要刷naa內核才有多點觸控
→ : 居然還在用Q955044F 12/27 00:12
--
※ 看板: MobileComm 文章推薦值: 0 目前人氣: 0 累積人氣: 336
作者 ivon852 的最新發文:
- 22F 17推
- 25F 16推
- 20F 15推
- 本文分享如何用免費開源的Moonlight,讓iPad化身電腦延伸螢幕,達到類似專有軟體「 Duet Display」效果。 如下圖,連線後iPad會變成Windows的第二個螢幕,可以從iPad觸 …53F 30推
- 17F 11推
點此顯示更多發文記錄
→
guest
回列表(←)
分享