編譯安卓?jī)?nèi)核前需要準(zhǔn)備的東西。
- 一臺(tái)支持解鎖bootloader的手機(jī)
- 官方開(kāi)源地址,或者第三方整合好的也行
- 一個(gè)linux環(huán)境,虛擬機(jī)、wsl、termux等都可以
- 看得懂中文
開(kāi)始操作!
一、 從你的手機(jī)里面提取config.gz文件,在/proc/config.gz路徑,這個(gè)文件是構(gòu)建你手機(jī)內(nèi)核的配置文件,這個(gè)默認(rèn)是官方的,如果沒(méi)有這個(gè)文件,那你需要通過(guò)解包boot.img來(lái)獲取,稍后會(huì)說(shuō)。
二、拉取你官方開(kāi)源的內(nèi)核源碼以及設(shè)備樹(shù)(安卓9以后,默認(rèn)只開(kāi)源內(nèi)核了,設(shè)備樹(shù)這些,都不再開(kāi)放了)。
-
從你的品牌官方獲取開(kāi)源代碼,比如小米開(kāi)源地址,摩托羅拉開(kāi)源地址,真我手機(jī)開(kāi)源地址。把源碼拉取到本地。
-
如果你不想用官方的,想用第三方的,比如LineageOS,Crdroid也可以。
-
你沒(méi)有官方開(kāi)源也沒(méi)有第三方官方支持,那你可以不用看了,省點(diǎn)流量跟電量,去做別的事情吧- - 。
#git拉取示例
#--depth=1代表只拉取最新的源碼,可以極大減少拉取后的體積,縮減拉取時(shí)間
git clone --depth=1 https://github.com/ProjectBlaze-Devices/kernel_xiaomi_chime
三、配置基本構(gòu)建環(huán)境。
1.安裝Linux環(huán)境。(wsl、vm虛擬機(jī)、雙系統(tǒng)實(shí)體機(jī)的Linux,都可以)
2.安裝編譯工具。
Debian系列:(包括Ubuntu、Linux mint、優(yōu)麒麟、Uos、termux)
#Debian系列:
apt-get install -y bc bison build-essential ccache curl flex g++-multilib gcc-multilib git git-lfs gnupg gperf imagemagick
lib32ncurses5-dev lib32readline-dev lib32z1-dev libelf-dev liblz4-tool libncurses5 libncurses5-dev
libsdl1.2-dev libssl-dev libxml2 libxml2-utils lzop pngcrush rsync
schedtool squashfs-tools xsltproc
zip zlib1g-dev
ArchLinux系列
pacman -Syu git
cd ~
git clone https://aur.archlinux.org/aosp-devel.git
cd aosp-devel
makepkg -si
其它系列,自行查找對(duì)應(yīng)的工具安裝.
3.拉取內(nèi)核編譯工具(剛剛只是安裝基本構(gòu)建環(huán)境,這個(gè)編譯工具才是重頭戲,構(gòu)建安卓?jī)?nèi)核的工具,只能從安卓源碼里面拉取,而且有版本限制,太新不行,太老了也不行)
- 直接去LineageOS的GitHub官方倉(cāng)庫(kù)拉取
#官方GitHub拉取
git clone https://github.com/LineageOS/android_prebuilts_clang_kernel_linux-x86_clang-r416183b
#國(guó)內(nèi)gitee拉取
git clone https://gitee.com/SorryMyLife/android_prebuilts_clang_kernel_linux-x86_clang-r416183b
#如果你還需要GCC進(jìn)行編譯,那么就拉取這個(gè)
#arm64
git clone https://github.com/LineageOS/android_prebuilts_gcc_linux-x86_aarch64_aarch64-linux-android-4.9
#國(guó)內(nèi)gitee
git clone https://gitee.com/SorryMyLife/android_prebuilts_gcc_linux-x86_aarch64_aarch64-linux-android-4.9
#arm32
git clone https://github.com/LineageOS/android_prebuilts_gcc_linux-x86_arm_arm-linux-androideabi-4.9
#國(guó)內(nèi)gitee
git clone https://gitee.com/SorryMyLife/android_prebuilts_gcc_linux-x86_arm_arm-linux-androideabi-4.9
-
去Google source官方拉取
如果你有才藝,可以直接訪問(wèn)Google
#arm64的gcc
git clone https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9
#arm32的gcc
git clone https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9
#arm64的clang
git clone https://android.googlesource.com/platform/prebuilts/clang/host/linux-x86
國(guó)內(nèi)的臨時(shí)解決方案
git config --global url."https://mirrors.tuna.tsinghua.edu.cn/git/AOSP".insteadOf https://android.googlesource.com
#arm64的gcc
git clone https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9
#上面配置完后,再拉取下面的代碼,就可以了
#arm32的gcc
git clone https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9
#arm64的clang
git clone https://android.googlesource.com/platform/prebuilts/clang/host/linux-x86
四、開(kāi)始構(gòu)建內(nèi)核源碼
- 先去你的內(nèi)核源碼里面看看,有沒(méi)有config文件。
cd 你的內(nèi)核源碼文件夾/arch/你的設(shè)備架構(gòu)/configs/
一般配置文件會(huì)在這里,以你這臺(tái)設(shè)備的代號(hào)命名,比如你的手機(jī)代號(hào)(codename)叫做lime,那么這個(gè)位置會(huì)有個(gè)帶lime字母的config文件。
cd 你的內(nèi)核源碼文件夾/arch/你的設(shè)備架構(gòu)/configs/vendor/
有的則是在這個(gè)路徑下的vendor文件夾里面
設(shè)備代號(hào)為chime的 示例 (可能會(huì)無(wú)法訪問(wèn),最好帶才藝進(jìn)去)
如果里面沒(méi)有config文件,那么你就需要從你的官方boot里面提取了,先下載或者從你設(shè)備提取boot分區(qū)出來(lái),上傳到Linux環(huán)境里面,cd到內(nèi)核源碼里面,執(zhí)行scripts/extract-ikconfig工具提取config信息。
cd 你的內(nèi)核源碼路徑
./scripts/extract-ikconfig 你的boot分區(qū)文件路徑 >> device_config
cp device_config arch/你的設(shè)備cpu架構(gòu)/configs/你的設(shè)備代號(hào)名稱_config
#或者這樣
cp device_config arch/你的設(shè)備cpu架構(gòu)/configs/temp_config
#取一個(gè)臨時(shí)的名字
2.解決完config文件后,那么就開(kāi)始構(gòu)建內(nèi)核。
cd 你的內(nèi)核源碼路徑
#告訴編譯器你構(gòu)建的是arm64的內(nèi)核,如果你不是64位的,那就把64刪掉
export ARCH=arm64
export SUBARCH=arm64
#配置之前同步好的內(nèi)核編譯器環(huán)境變量,讓當(dāng)前環(huán)境可以直接使用
#/home/sir/pstar/kernel/clang是clang編譯器的路徑
#它下面的bin則是可執(zhí)行二進(jìn)制文件存放的文件夾,我們需要調(diào)用這個(gè)里面的程序來(lái)開(kāi)始構(gòu)建內(nèi)核
export PATH="/home/sir/pstar/kernel/clang/bin:/home/sir/pstar/kernel/gcc64/bin:/home/sir/pstar/kernel/gcc32/bin:$PATH"
args="-j$(nproc --all) \ #-j$(nproc --all)這里是說(shuō)用當(dāng)年環(huán)境下最高的cpu線程進(jìn)行編譯
ARCH=arm64 \
SUBARCH=arm64 \
O=out \ #輸出路徑是在當(dāng)前位置的out文件夾
CC=clang \ #指定C語(yǔ)言文件編譯器為clang
CROSS_COMPILE=aarch64-linux-android- \ #配置交叉編譯的目標(biāo)平臺(tái)為arm64
CROSS_COMPILE_ARM32=arm-linux-androideabi- \ #配置32位交叉編譯器
CLANG_TRIPLE=aarch64-linux-gnu- " #負(fù)責(zé)交叉編譯的Linux編譯器
#這個(gè)也不清楚干嘛用的,就是它在構(gòu)建的時(shí)候,需要用到Linux的一些標(biāo)準(zhǔn)庫(kù)內(nèi)容
#但是安卓的編譯器閹割了,直接用安卓的編譯,會(huì)出現(xiàn)很多莫名其妙的錯(cuò)誤,所以就需要再配置一下這個(gè)編譯器了
#如果你的設(shè)備是32位的,這里也要修改的
#清理之前構(gòu)建的殘留內(nèi)容
make clean && make mrproper
#刪除out文件夾,也就是之前指定輸出的文件夾
rm -rf out
#新建out文件夾,用來(lái)保存臨時(shí)產(chǎn)生的垃圾文件還有最終生成的內(nèi)核文件
mkdir -p out
#先檢測(cè)配置文件有沒(méi)有問(wèn)題,進(jìn)行初次構(gòu)建
make ${args} vendor/lineageos_pstar_defconfig
#這里如果不加vendor,就會(huì)讀取
#內(nèi)核源碼/arch/你的設(shè)備架構(gòu)/configs/里面的配置文件
#這個(gè)完整路徑為: 內(nèi)核源碼/arch/你的設(shè)備架構(gòu)/configs/vendor/lineageos_pstar_defconfig
#不加vendor的完整路徑為:內(nèi)核源碼/arch/你的設(shè)備架構(gòu)/configs/lineageos_pstar_defconfig
#這里的args就是上面設(shè)置的臨時(shí)變量args里面的內(nèi)容
#開(kāi)始構(gòu)建內(nèi)核
make ${args}
3.構(gòu)建內(nèi)核中如果出現(xiàn)一些報(bào)錯(cuò),你應(yīng)該去GitHub里面搜索,而不是用百度
4.構(gòu)建完成的內(nèi)核文件會(huì)根據(jù)不同的壓縮規(guī)則存放在:
你的內(nèi)核源碼/out/arch/你的設(shè)備架構(gòu)/boot/
END文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-631820.html
參考文章:小米開(kāi)源 摩托羅拉開(kāi)源文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-631820.html
到了這里,關(guān)于編譯安卓?jī)?nèi)核教程(2023,6,13)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!