一、下載nexus5 對應的內核源碼python
Android系統使用的是Linux內核,但與主線分枝的Linux內核又有一些差別,各個不一樣的廠商又有本身的修改。內核源碼位於谷歌境外服務器,不FQ沒法訪問,這給同步源碼形成很大的不便。幸虧清華大學的開源服務器上也同步了AOSP內核的源碼,使得咱們無須FQ就能夠同步源碼。linux
映射關係以下:android
名稱 Google GIT地址 清華服務器地址 common https://android.googlesource.com/kernel/common.git https://aosp.tuna.tsinghua.edu.cn/kernel/common.gitexynos https://android.googlesource.com/kernel/exynos.git https://aosp.tuna.tsinghua.edu.cn/kernel/exynos.gitgoldfish https://android.googlesource.com/kernel/goldfish.git https://aosp.tuna.tsinghua.edu.cn/kernel/goldfish.githikey-linaro https://android.googlesource.com/kernel/hikey-linaro https://aosp.tuna.tsinghua.edu.cn/kernel/hikey-linaro.gitlk https://aosp.tuna.tsinghua.edu.cn/kernel/lk.gitmsm https://android.googlesource.com/kernel/msm.git https://aosp.tuna.tsinghua.edu.cn/kernel/msm.gitomap https://android.googlesource.com/kernel/omap.git https://aosp.tuna.tsinghua.edu.cn/kernel/omap.gitsamsung https://android.googlesource.com/kernel/samsung.git https://aosp.tuna.tsinghua.edu.cn/kernel/samsung.gittegra https://android.googlesource.com/kernel/tegra.git https://aosp.tuna.tsinghua.edu.cn/kernel/tegra.gitx86_64 https://android.googlesource.com/kernel/x86_64.git https://aosp.tuna.tsinghua.edu.cn/kernel/x86_64.git
因爲nexus5使用的是高通處理器,因此直接同步msm的連接git
ninjame@ubuntu1604:~/aosp$ mkdir kernel ninjame@ubuntu1604:~/aosp$ cd kernel ninjame@ubuntu1604:~/aosp/kernel$ git clone https://aosp.tuna.tsinghua.edu.cn/kernel/msm.git
git branch 查看Android內核源碼的代碼版本分支ubuntu
ninjame@ubuntu1604:~/aosp/kernel/msm$ git branch -a* (頭指針分離於 7717f76) master remotes/origin/HEAD -> origin/master remotes/origin/android-4.4 remotes/origin/android-4.4.y …… remotes/origin/android-msm-hammerhead-3.4-kitkat-mr1 remotes/origin/android-msm-hammerhead-3.4-kitkat-mr2 remotes/origin/android-msm-hammerhead-3.4-kk-fr1 remotes/origin/android-msm-hammerhead-3.4-kk-fr2 remotes/origin/android-msm-hammerhead-3.4-kk-r1 remotes/origin/android-msm-hammerhead-3.4-l-preview remotes/origin/android-msm-hammerhead-3.4-lollipop-mr1 remotes/origin/android-msm-hammerhead-3.4-lollipop-mr1.1 remotes/origin/android-msm-hammerhead-3.4-lollipop-release remotes/origin/android-msm-hammerhead-3.4-m-preview remotes/origin/android-msm-hammerhead-3.4-marshmallow remotes/origin/android-msm-hammerhead-3.4-marshmallow-mr1 remotes/origin/android-msm-hammerhead-3.4-marshmallow-mr2 remotes/origin/android-msm-hammerhead-3.4-marshmallow-mr3 ……
和nexus5 相關的且是adnoid6.0 版本的內核分支共有4個,到底checkout哪一個分支呢?對於Android的源碼與Android內核源碼版本的對應關係,很難說得清楚。通過摸索,找到一種比較討巧的方法,直接進入手機設置,查看關於手機服務器
內核版本是3.4.0-g7717f76架構
ninjame@ubuntu1604:~/aosp/kernel/msm$ git checkout 3.4.0-g7717f76
當發現真的把相應分支源碼的源碼給同步過來,居然有種意外的驚喜,這是怎麼回事呢?ide
ninjame@ubuntu1604:~/aosp/kernel/msm$ git branch -r --contains 7717f769b2d0bf26db19598d8826a01b82ab6540 origin/android-msm-hammerhead-3.4-marshmallow-mr1 origin/android-msm-hammerhead-3.4-marshmallow-mr2 origin/android-msm-hammerhead-3.4-marshmallow-mr3
7717f76對應着源碼中的一個commit節點,能夠看作是git庫上最小的分支(分支都是從commit節點拉出來的,那麼每個節點均可以看作一個分支,固然某些分支中只包含它本身)ui
3.4.0-g7717f76 就能夠解讀爲該內核版本大的分支爲linux3.4.0,具體的源碼對應於commit節點爲7717f76 那一次提交代碼對應的快照。google
下載部分參考博客:
http://blog.csdn.net/sunao2002002/article/details/53057374
http://blog.csdn.net/qq1084283172/article/details/54880488
二、配置編譯環境
因爲是在 Linux / Mac OS X 上進行編譯,因此交叉編譯的環境變量是必需要設置的,一共涉及到三個。
首先設定 ARCH,–注意,因爲 Nexus 5 是32位架構,因此取值爲 arm,若是是64位,則要取值爲 arm64
export ARCH=arm
而後設定 CROSS_COMPILE,同上,64位要取值 aach64-linux-android-
export CROSS_COMPILE=arm-eabi-
對應地,告訴編譯系統到哪裏尋找編譯器
export PATH=$PATH:/home/ninjame/aosp/prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin
三、編譯
開始編譯以前,不要着急開始,先使用 help 看有哪些預約義好的配置
make help
從上面能夠找到 hammerhead_defconfig,這正是 Nexus 5 的默認配置
make hammerhead_defconfig
上述就是生成配置,若是須要調整,則能夠繼續執行
make menuconfig
最後執行編譯吧
make
成功編譯後,能夠看到相似以下的輸出:
OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready
DTC arch/arm/boot/msm8974-hammerhead-rev-11.dtb
DTC arch/arm/boot/msm8974-hammerhead-rev-11j.dtb
DTC arch/arm/boot/msm8974-hammerhead-rev-10.dtb
DTC arch/arm/boot/msm8974-hammerhead-rev-c.dtb
DTC arch/arm/boot/msm8974-hammerhead-rev-b.dtb
DTC arch/arm/boot/msm8974-hammerhead-rev-bn.dtb
DTC arch/arm/boot/msm8974-hammerhead-rev-a.dtb
DTC arch/arm/boot/msm8974-hammerhead-rev-f.dtb
CAT arch/arm/boot/zImage-dtb
Kernel: arch/arm/boot/zImage-dtb is ready
make[1]: Nothing to be done for 'arch/arm/boot/dtbs'.
編譯碰到的問題;
, line , m.group( /usr/bin/ -s /usr/bin/python2. /usr/bin/python,默認設置成python2.
其實,提示的錯誤信息已經明確告訴你了,你應該省略defined() 。打開 kernel/timeconst.pl
四、刷新內核
進入到了 Android 源代碼目錄,設置環境變量,告知已編譯好的新內核地址
ninjame@ubuntu1604:~/aosp/kernel/msm$ cd arch/arm/boot/ninjame@ubuntu1604:~/aosp/kernel/msm/arch/arm/boot$ ls -l zImage-dtb-rw-rw-r-- 1 ninjame ninjame 8441144 5月 23 00:27 zImage-dtb ninjame@ubuntu1604:~/aosp/kernel/msm/arch/arm/boot$ pwd/home/ninjame/aosp/kernel/msm/arch/arm/boot
export TARGET_PREBUILT_KERNEL=/home/ninjame/aosp/kernel/msm/arch/arm/boot/zImage-dtb
從新編譯bootp_w_picpath
make bootp_w_picpath
成功後,如有相似以下的輸出:
Copy: out/target/product/hammerhead/kernel Target boot p_w_picpath: out/target/product/hammerhead/boot.img out/target/product/hammerhead/boot.img maxsize=23519232 blocksize=135168 total=9369600 reserve=270336#### make completed successfully (03:29 (mm:ss)) ####
重啓手機進入bootloader模式
adb reboot bootloader
刷入內核
fastboot flash boot boot.img
重啓手機
fastboot reboot
~曬圖,換上本身的簽名了,哈哈~ ,不過g4ad03fa 打臉了。。。