How to Flash the Linux Kernel for Android Nexus 5
本篇文章记录了在读完《Android系统源代码情况分析》第二章“硬件抽象层”的动手实践过程。该书讲述了从内核到框架,再到应用的整个知识链条,从它出版到现在,我一直在不断地翻阅它,获益匪浅,推荐给大家。
硬件抽象层(HAL)是连接硬件、内核、框架、应用四者的纽带,理解了它,再去学习其他模块,可以有事半功倍的效果。其中,如何为内核增加新模块,又是学习HAL的必备环节。该书是在模拟器上进行讲解,好处在于学习成本很低,无需准备硬件,弊端就是运行模拟器非常慢,耽误时间。所以,我使用Nexus 5手机进行各种实验,一来效率高,二来最大化手机的功用。
0 前提
因为我一直在学习 Android 源代码,所以早已经把整个代码 Clone 到了本地,当前我使用的 Tag 是 android-6.0.1_r11,Nexus 5正是它所支持的设备之一。当然了,根据官方文档《Codenames, Tags, and Build Numbers》,可以找到所有适合 Nexus 5 手机的所有 Tag。
1 配置编译环境
由于是在 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=/home/poemcode/android-src/prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin:$PATH
2 编译内核
开始编译之前,不要着急开始,先使用 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’.
3 刷新内核
进入到了 Android 源代码目录,设置环境变量,告知已编译好的新内核地址
export TARGET_PREBUILT_KERNEL=/home/poemcode/kernel/msm/arch/arm/boot/zImage-dtb
重新编译bootimage
make bootimage
成功后,若有类似如下的输出:
Target ram disk: out/target/product/hammerhead/ramdisk.img
Target boot image: out/target/product/hammerhead/boot.img
重启手机进入bootloader模式
adb reboot bootloader
刷入内核
fastboot flash boot boot.img
重启手机
fastboot reboot
4 总结
刷内核并不难,最大的困难是恐惧,担心搞砸了,把手机搞成砖头。好在软件这一行当,不像是医生那样治病救人,不小心会出人命。所以,大胆去搞吧。一台手机也就是2K人民币左右,学习知识是需要成本的,除了时间外,金钱也是值得花的。