1. 程式人生 > >Android 系統編譯之核心編譯

Android 系統編譯之核心編譯

本來想超頻自己的手機的,於是發現需要編譯核心才能實現
作為Android開發者的我 沒有任何核心編譯經驗,只是想試一下, 於是折騰了兩天終於把核心成功編譯出來了 現在分享下學習經驗
我的是小米手機,其實我看了一下github, 其他手機的核心開源的目錄結構幾乎是一樣的,所以應該是同一種編譯方式
編譯核心的時候 各種error 真的是無奈+心累…
無數次想決定放棄了…但是還是堅持了下來…

不多說了 直接開始:

1.下載核心

在github 或 論壇上找到你的手機的核心原始碼開源地址 並下載下來
比如我的小米NotePro的 有5.0核心 和 7.0核心 ,我下載了7.0, 點右邊的連結進去 該分支
小米核心開源地址:

https://github.com/MiCode/Xiaomi_Kernel_OpenSource

這裡寫圖片描述

把該分支的原始碼下載下來, 到這裡有的人是用 git命令下載, 我是vmware 執行的 ubuntu 比較方便 ,就不使用git了 直接在win下用迅雷下載 原始碼然後丟進去虛擬機器裡, 還能更快, 為啥要多折騰呢

2.下載交叉編譯鏈

3.搭建linux環境

搭建環境就不廢話了,如果已經有 可以嘗試跳過, 參考我另一個帖子,裝我帖子裡的那個 ubuntu, 裡面有下載地址
https://blog.csdn.net/u014418171/article/details/53302984
##4.編譯
在ubuntu下
複製win下的剛才下載的那兩個 核心原始碼zip 和 交叉編譯鏈zip檔案 到 ubuntu 桌面下 (直接滑鼠拖進去)
檢查檔案位元組大小和win下的是否一致 是否損壞

先設定ubuntu預設檔案許可權
執行
umask 002
可選, 只是為了確保等會編譯建立檔案的可讀可寫的許可權

然後解壓zip:

cd 桌面/
unzip 你的核心原始碼檔名.zip
unzip 交叉編譯鏈檔名.zip

解壓完成後 資料夾名稱有點長我分別改成了 Kernel 和 Toolchain

開啟終端, 輸入 sudo gedit /etc/profile 在末尾新增環境變數

export ANDROID_AARCH64=/home/ubuntu/桌面/Toolchain/google_gcc/aarch64-linux-android-4.9/bin/
export ARCH=arm64
export SUBARCH=arm64
export PATH=$PATH:$ANDROID_AARCH64
export CROSS_COMPILE=aarch64-linux-android-

儲存,關閉文字編輯器
終端, 輸入

source /etc/profile && . /etc/profile

以使其生效

網上文章都是直接開始編譯了, 反正我直接make 是不行的 需要重新指定 O=輸出目錄 才正常 否則編譯過程中會報錯 無法生成image.gz.dtb 檔案 之類的錯誤

指定make 目錄終端輸入如下命令進行生成 .config 檔案

cd Kernel
mkdir output
make O=output leo_user_defconfig
cd output
make O=output
  • 解釋: make O=output leo_user_defconfig 輸入後
    如圖 輸出了.config檔案 在/Kernel/output/下, 如果看不見請設定資料夾管理器 選擇 [顯示隱藏檔案], 或終端 ls -a
    這裡寫圖片描述

  • 解釋 leo_user_defconfig 是什麼鬼 從哪裡來?
    這個檔案 在 桌面/Kernel/arch/arm64/configs/ 下, 裡面可能有很多手機代號, 你可以檢視你的手機的核心資訊, 或者 手機的 system/build.prop裡有你的代號
    leo_user_defconfig 其中的 leo 就是代表的 小米NotePro ,網上很多文章都是說 make msmxxx_defconfig
    …我不太清楚,具體可能要多編譯幾個 看看哪個正常 , 反正我認為 就是 “代號_user_defconfig” 這樣的格式, 不過這隻對於小米是這樣,其他手機好像是不帶 user 直接 代號_defconfig, 或者是什麼都沒有 就只有cpu型號 那麼你只能選擇 msmXXXX_defconfig 進行編譯. (如果此處有什麼誤解 望指出)

  • 解釋make O=output 代表重定向輸出目錄, 並且開始編譯 , 也可以使用 make -j3 O=output, j3代表 系統的cpu數量+1, 雙核則 -j3

編譯通過如下
這裡寫圖片描述

最後 Image.gz-dtb 等檔案生成在
Kernel/output/arch/arm64/boot/ 下

這裡寫圖片描述

4.使用

在win下, 使用 Android Image Kitchen (軟體請百度,注意分6.x 7.x 8.x 可用版本)
先取出你的手機ROM中的 boot.img 拖到unpackimg.bat去解包, 然後把image.gz-dtb 該檔案替換掉原本的核心檔案 split_img/boot.img-zImage
然後執行repackimg.bat 得到 image-new.img
執行如下命令 刷入

adb reboot bootloader && fastboot flash boot C:\你的路徑\image-new.img  && fastboot reboot

前提是 你刷入的rom正好是 剛才取出boot.img的那個. 否則可能無法正常開機
或者直接把原本的rom中的boot.img替換成編譯好的boot.img 再 從recovery雙清刷入

如有其他問題 請指出,共同學習… 至此 編譯核心教程已完成

注意事項:

雖然編譯操作 不難,但是最浪費時間的就是編譯時的各種錯誤 ,而且網上還找不到? 而且還谷歌不到… 儘管還找到和你一樣的問題卻沒人回答… 絕望, 現在我來說一下需要注意的地方

  • 注意檔案許可權 最好每解壓一次zip 之後 都需要批量修改資料夾許可權
    如: sudo chmod -R 777 資料夾

  • 如果編譯報錯提示出現找不到標頭檔案 < xxx.h > 請改成引號 “xxx.h”

  • 如果編譯報錯提示 錯失 或 無法生成 image.gz.dtb , 那就要注意了 需要指定O=output ,並且 找到根目錄 Kernel.下的 .config檔案 刪掉 , 找到 include/下的 config資料夾 刪掉 (包括資料夾) 這玩意浪費了我很多時間 差點放棄

  • 注意環境變數配置 ,如果按我做的還是出現錯誤,請 把對應的核心資料夾和編譯鏈資料夾 移動到 /桌面/的上一級 , 意思就是 這些檔案放不在桌面進行編譯, 而是放在別的 地方, 可能中文的 '桌面’二字會 影響編譯, 還有我曾經一度懷疑 小米開源的核心是不完整的, 最後發現不是. 所以請先相信小米.

  • 請在每次出現錯誤之後 修改完錯誤後 想要重新編譯時 請先執行 make clean 一下, 刪除上次的檔案 以免影響本次編譯
    ,甚至 多次無果時 你可嘗試 刪掉按本教程重來. 多試幾次

  • 注意手機代號對應的 xxx_user_defconfig, 沒有才選 cpu代號_defconfig, 或者看看你的手機有沒有人發貼 看別人怎麼弄

其他