公司买了一台Nexus10,上面搭在最新的Android4.2系统。
由于自android4.1以后,在现实模块有相当大的改进,android4.1增加了vsync同步,使得显示更加顺滑流畅,android4.2增加了external display,使得对HDMI的支持更加完善。于是想以Nexus10为载体,研究下对应的内核在这方面的改动。
android不愧是开放式系统,拿到一台标准的android设备,可以在android官网下载对应的源码,然后自己编译并烧写到设备中,让设备运行自己编译的代码,对于linux hacker来说,这是一个十分有趣的事情。
于是想自己编译一份代码在Nexus10上跑起来,其实公司其他部门已经有同事做到了,不过和这位同事不熟,还是自己来研究好了,通过google,折腾了一天,终于成功了,步骤如下:
(1)下载Nexus10内核源码
git clone https://android.googlesource.com/kernel/exynos.git
(2)编译
make ARCH=arm manta_defconfig //manta是Nexus10的开发代号
make ARCH=arm CROSS_COMPILE=/usr/local/arm/toolchain/arm-eabi-4.6/bin/arm-eabi-
最终编译会生成arch/arm/boot/zImage,就是运行android系统所需要的内核镜像。
这里需要注意的是,cross tool需要用4.6.x的版本,低版本的编译不过。
(3) 生成包含内核镜像的boot.img
标准的android ROM内核镜像是和android编译生成的ramdisk.img一起打包在boot.img 里面在。所以需要用自己编译生成的zImage重新生成boot.img。打包过程如下:
(a)先从google官网下载Nexus10的最新固件,取得里面的boot.img ,并从boot.img 里面提取ramdisk.img
./getramdisk.py boot.img //getramdisk.py是一个脚本,在xda论坛上找的
(b)用自己编译的zImage和上一步提取的ramdisk.img 重新打包,生成新的boot.img
./mkbootimg --kernel zImage --ramdisk ramdisk.img -o new-boot.img //mkbootimg 也是在xda论坛上找的工具
(4)把新的new-boot.img 下载到Nexus10的内存中运行
(a)用usb连接Nexus10和PC,确保adb功能可用,用adb命令是Nexus10进入fastboot模式
adb reboot bootloader
(b)下载new-boot.img 到Nexus10的内存中运行
fastboot boot new-boot.img
成功后机器会自动重启,这时候系统跑的就是自己编译的内核,可以通过cat proc/version命令验证。
需要注意的是,这种方式,只是把boot.img下载到机器的内存里面运行,flash中固化的还是机器自带的boot.img,如果希望把自己的boot.img固化到系统中,命令如下
fastboot flash boot new-boot.img