須要知道的一點是Android使用的都是prebuild的kernel,這篇文章記錄了我替換內核的過程html
首先,咱們須要肯定當前Android使用的kernel版本,而後要肯定下載kernel的版本linux
$ dd if=kernel-qemu bs=1 skip=$(LC_ALL=C grep -a -b -o $'\x1f\x8b\x08\x00\x00\x00\x00\x00' kernel-qemu | cut -d ':' -f 1) | zgrep -a 'Linux version'
結果爲:android
Linux version 3.4.0-gfb3ea4f (keunyoung@keunyoung-linux.mtv.corp.google.com) (gcc version 4.7 (GCC) ) #1 Tue Apr 2 17:27:47 PDT 2013
從結果能夠看出來電腦模擬器使用的是3.4.0的內核git
$ mkdir android_kernel $ cd android_kernel $ git clone https://android.googlesource.com/kernel/goldfish.git
下載完成後shell
Cloning into 'goldfish'... remote: Sending approximately 609.12 MiB ... remote: Counting objects: 28280, done remote: Finding sources: 100% (7/7) remote: Getting sizes: 100% (6/6) remote: Compressing objects: 100% (3709/3709) remote: Total 3063030 (delta 2572134), reused 3063028 (delta 2572134) Receiving objects: 100% (3063030/3063030), 608.82 MiB | 303 KiB/s, done. Resolving deltas: 100% (2574828/2574828), done.
查看內核版本app
$ git branch -a
結果ui
* master remotes/origin/HEAD -> origin/master remotes/origin/android-goldfish-2.6.29 remotes/origin/android-goldfish-3.10 remotes/origin/android-goldfish-3.4 remotes/origin/linux-goldfish-3.0-wip remotes/origin/master
Checkout相對應版本google
$ git checkout remotes/origin/android-goldfish-3.4
在一開始我是打算編譯3.10的,可是3.10目前位置尚未goldfish_defconfig文件,因此退而求其次編譯3.4的內核。spa
在checkout後就能夠開始編譯內核了3d
$ export ANDROID_SRC_PATH=~/work/android_src/ $ export PATH=$ANDROID_SRC_PATH/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin:$PATH $ export ARCH=arm $ export SUBARCH=arm $ export CROSS_COMPILE=arm-eab $ make goldfish_armv7_defconfig $ make
編譯成功後獲得以下的輸出:
Kernel: arch/arm/boot/zImage is ready
注意:一開始我使用的是make goldfish_defconfig來進行編譯, 這樣能夠成功編譯出內核來,可是編譯出來的內核在模擬器中沒法啓動。Google以後得知,須要使用goldfish_armv7_defconfig才能make出能夠啓動的內核。
如今就能夠使用咱們編譯出來的內核啓動了
emulator -kernel ~/src/android_kernel/goldfish/arch/arm/boot/zImage &
啓動後經過adb shell查看對比先後兩個版本的內核有什麼區別
替換前:
Linux version 3.4.0-gd853d22 (nnk@nnk.mtv.corp.google.com) (gcc version 4.6.x-google 20120106 (prerelease) (GCC) ) #1 PREEMPT Tue Jul 9 17:46:46 PDT 2013
替換後:
Linux version 3.4.0-g48b9692 (vincent@vincent-pc) (gcc version 4.6.x-google 20120106 (prerelease) (GCC) ) #2 PREEMPT Sun Feb 16 12:30:13 CST 2014
以後咱們就能夠把編譯出來的內核拷貝到Android source tree下或者使用make bootimage來製做boot image了。
http://source.android.com/source/building-kernels.html