本文描述了僅建構核心的細節。接下來的說明假設你已經下載下傳了完整的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版本核心進行下載下傳,

root@Tangxx:~/android_source/android_442/kernel/goldfish# git checkout -t \
> remotes/origin/android-goldfish- -b goldfish3.
搭建編譯環境
編譯核心需要正确的編譯環境,包括ARM編譯工具鍊以及各種編譯工具(eg,make),本文主要使用AOSP中預編譯好的工具鍊。
第一步,配置編譯環境,
Nexus 5 hammerhead
模拟器
這樣AOSP目錄就有了編譯工具鍊,可以通過查詢編譯版本确認,
第二步,設定系統環境變量通知核心我們使用的編譯工具鍊,
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
完事。