天天看點

Android系統源代碼編譯—[5]建構核心選擇一個核心下載下傳源代碼搭建編譯環境配置核心編譯核心運作核心

本文描述了僅建構核心的細節。接下來的說明假設你已經下載下傳了完整的AOSP,并分别以真機和模拟器為例描述建構過程。

如果你是按照前面的文章已經下載下傳了完整的Android代碼就說明你的AOSP是完整的。

選擇一個核心

這個表列出來核心源代碼和二進制檔案的名稱和位置:

Device Binary location Source location Build configuration
hikey device/linaro/hikey-kernel kernel/hikey-linaro hikey_defconfig
angler device/huawei/angler-kernel kernel/msm angler_defconfig
bullhead device/lge/bullhead-kernel kernel/msm bullhead_defconfig
shamu device/moto/shamu-kernel kernel/msm shamu_defconfig
fugu device/asus/fugu-kernel kernel/x86_64 fugu_defconfig
volantis device/htc/flounder-kernel kernel/tegra flounder_defconfig
hammerhead device/lge/hammerhead-kernel kernel/msm hammerhead_defconfig
flo device/asus/flo-kernel/kernel kernel/msm flo_defconfig
deb device/asus/flo-kernel/kernel kernel/msm flo_defconfig
manta device/samsung/manta/kernel kernel/exynos manta_defconfig
mako device/lge/mako-kernel/kernel kernel/msm mako_defconfig
grouper device/asus/grouper/kernel kernel/tegra tegra3_android_defconfig
tilapia device/asus/grouper/kernel kernel/tegra tegra3_android_defconfig
maguro device/samsung/tuna/kernel kernel/omap tuna_defconfig
toro device/samsung/tuna/kernel kernel/omap tuna_defconfig
panda device/ti/panda/kernel kernel/omap panda_defconfig
stingray device/moto/wingray/kernel kernel/tegra stingray_defconfig
wingray device/moto/wingray/kernel kernel/tegra stingray_defconfig
crespo device/samsung/crespo/kernel kernel/samsung herring_defconfig
crespo4g device/samsung/crespo/kernel kernel/samsung herring_defconfig

真機(Nexus 5)

可以通過使用/dev/block/platform目錄下的條目,來确定目标裝置使用的晶片,

root@hammerhead:/dev/block/platform # ls
msm_sdcc.
           

我這裡是Nexus 5 得到的晶片資訊是msm。

模拟器

模拟器的核心固定是goldfish。

下載下傳源代碼

Nexus 5

選擇好要建構的核心後,就可以通過git clone開始下載下傳對應的核心源代碼,

[email protected]:~/android_source/android_442# mkdir kernel && cd $_
[email protected]:~/android_source/android_442/kernel# git clone \
> https://android.googlesource.com/kernel/msm.git
           

Clone完成後,我們就得到了對應代碼分支的倉庫,然而你會發現目前目錄下沒有任何檔案,

root@Tangxx:~/android_source/android_442/kernel# cd msm
root@Tangxx:~/android_source/android_442/kernel/msm# ls
root@Tangxx:~/android_source/android_442/kernel/msm#
           

要獲得AOSP支援裝置的核心源代碼,最後一步是check out正确的commit,由于在git倉庫中kernel檔案的commit資訊和文檔,總是落後于新裝置的釋出,我們可以使用/proc/version下的版本字元串,或者解壓後的核心鏡像。這裡使用/proc/version下的版本字元串:

[email protected]:/ # cat /proc/version                                          
Linux version -gadb2201 ([email protected].mtv.corp.google.com) (gcc version  (GCC) ) #1 SMP PREEMPT Wed Nov 20 14:42:53 PST 2013
           

在獲得的版本資訊中最重要的是核心版本号中3.4.0-g後面的7位十六進制數字—adb2201 。用這個字元串就能check out 出準确的commit,

root@Tangxx:~/android_source/android_442/kernel/msm# git checkout adb2201
HEAD is now at adb2201… mm: Hold a file reference in madvise_remove
           

至此,已經獲得了目标裝置的核心源代碼副本。

模拟器

模拟器git clone goldfish版本核心,

[email protected]:~/android_source/android_442/kernel# git clone \
> http://android.googlesource.com/kernel/goldfish.git
           

git clone完成後,可以使用

來檢視支援那些Linux核心版本的下載下傳,這裡直接選擇3.4版本核心進行下載下傳,

Android系統源代碼編譯—[5]建構核心選擇一個核心下載下傳源代碼搭建編譯環境配置核心編譯核心運作核心
root@Tangxx:~/android_source/android_442/kernel/goldfish# git checkout -t \
> remotes/origin/android-goldfish- -b goldfish3.
           

搭建編譯環境

編譯核心需要正确的編譯環境,包括ARM編譯工具鍊以及各種編譯工具(eg,make),本文主要使用AOSP中預編譯好的工具鍊。

第一步,配置編譯環境,

Android系統源代碼編譯—[5]建構核心選擇一個核心下載下傳源代碼搭建編譯環境配置核心編譯核心運作核心

Nexus 5 hammerhead

Android系統源代碼編譯—[5]建構核心選擇一個核心下載下傳源代碼搭建編譯環境配置核心編譯核心運作核心
Android系統源代碼編譯—[5]建構核心選擇一個核心下載下傳源代碼搭建編譯環境配置核心編譯核心運作核心

模拟器

Android系統源代碼編譯—[5]建構核心選擇一個核心下載下傳源代碼搭建編譯環境配置核心編譯核心運作核心

這樣AOSP目錄就有了編譯工具鍊,可以通過查詢編譯版本确認,

Android系統源代碼編譯—[5]建構核心選擇一個核心下載下傳源代碼搭建編譯環境配置核心編譯核心運作核心

第二步,設定系統環境變量通知核心我們使用的編譯工具鍊,

root@Tangxx:~/android_source/android_442# cd kernel/msm/
root@Tangxx:~/android_source/android_442/kernel/msm# export CROSS_COMPILE=arm-eabi-
root@Tangxx:~/android_source/android_442/kernel/msm# export SUBARCH=arm
root@Tangxx:~/android_source/android_442/kernel/msm# export ARCH=arm
root@Tangxx:~/android_source/android_442/kernel/msm#
           

如果核心代碼不在AOSP目錄裡,則需要将編譯工具鍊添加到目前環境變量中,上面由于我的核心代碼就在源代碼目錄中,是以沒有添加,

export PATH=<AndroidSourceDir>/prebuilts/gcc/linux-x86/arm/arm-eabi-
/bin/:$PATH
           

Nexus 5X bullhead

設定系統環境變量,

tangxx@tangxx ~/android_source/android_70/kernel/msm $ export ARCH=arm64
tangxx@tangxx ~/android_source/android_70/kernel/msm $ export CROSS_COMPILE=aarch64-linux-android-
           

同樣,如果核心代碼不在AOSP目錄,需要額外的設定,

至此,編譯環境就搭建好了。

配置核心

Linux核心支援很多架構和硬體組合,為了能夠給任意一種配置組合編譯核心,可以指定一個defconfig的配置面闆,這個模闆位于/arch/arm/configs目錄中,比如,Nexus 5 的hammerhead代碼版本可以使用hammerhead_defconfig。

最終編譯系統會讀取該配置模闆,并寫入.config檔案中。

.config檔案隐藏在核心代碼根目錄/kernel/msm下,可以通過CTRL+H檢視,除了使用模闆,還可以直接編輯這個配置檔案,但推薦使用模闆。
           

這裡直接使用預設的配置面闆即可,如果需要對編譯後的核心進行調試,就需要修改特定的配置了,後續文章會講到。

編譯核心

當完成編譯環境配置和核心配置後,就可以執行編譯了,

root@Tangxx:~/android_source/android_442/kernel/msm# make
[…]
 Kernel:arch/arm/boot/zImage is ready
root@Tangxx:~/android_source/android_442/kernel/msm#
           

至此,核心就編譯完成了。

運作核心

編譯完成後,可以通過下面指令來生成核心boot.ing檔案,

tangxx android_601 # export TARGET_PREBUILT_KERNEL=<msm_dir>/arch/arm64/boot/Image.gz-dtb
tangxx android_601 # source build/envsetup.sh
tangxx android_601 # lunch 
tangxx android_601 # make bootimage
           

其中msm_dir為核心所在的目錄。

生成的boot.ing檔案就在android編譯結果根目錄下,我的在out/target/product/bullhead/boot.img。

tangxx android_601 # cd out/target/product/bullhead
tangxx bullhead # adb reboot-bootloader
tangxx bullhead # fastboot flash boot boot.img
target reported max download size of  bytes
sending 'boot' ( KB)...
OKAY [  368s]
writing 'boot'...
OKAY [  199s]
finished. total time: 567s
tangxx bullhead # fastboot reboot
           

完事。

繼續閱讀