最近在学习Android内核,在将Android6.0.1-r1源码、内核3.10.73-g1bbb776过程中中遇到很多的坑,特总结如下:
一、Android内核编译过程
总体步骤:
(1)下载Android内核源码
git clone https://aosp.tuna.tsinghua.edu.cn/kernel/msm.git
cd msm/
git branch -a
git checkout 1bbb776 (1bbb776从内核3.10.73-g1bbb776获取)或者
git checkout remotes/origin/android-msm-bullhead-3.10-marshmallow-mr2
(bullhead 为nexus5x 代号,marshmallow为Android6.0.1代号)
从而获取到Android内核源码(2)编译Android内核源码
从ndk或者Android源码中获取交叉编译链,并加入到PATH中
配置编译环境:
export ARCH=arm64
export SUBARCH=arm64
export CROSS_COMPILE=aarch64-linux-android-
export PATH=$PATH:/home/zh/kernel/aarch64-linux-android-4.9-/bin:$PATH
make bullhead_defconfig
make -j8
从而获取到arch/arm64/boot/Image.gz-dtb文件
(3)烧录到nexus5x中
1.获取到nexus5x 工厂boot.image文件
2.下载编译bootimg-tools
$mkdir bootimg-tools
$cd bootimg-tools
$git clone https://github.com/pbatard/bootimg-tools.git
$make
编译完成以后,在makebootimg目录下生成了相应的二进制执行文件,将该二进制文件所在路径添加到 PATH路径中
解包:
unmkbootimg –i boot.img
覆盖原来的kernel:把内核源码目录下生成的arch/arm/boot目录下的zImage-dtb拷贝到Android源码目录out/target/product/hammerhead下。并改名为kernel(注意备份原始的kernel文件)
重打包:使用步骤2中输出的mkbootimg 命令
烧写:
$ adb reboot bootloader
$ fastboot flash boot boot.img
最后fastboot reboot即可,结果如下,已经换成我编译的内核zh@zh...
二、中间遇到的坑:
1、一定要将交叉编译链版本设置正确,同时环境也要设置正确
一定要将交叉编译链版本设置正确,同时环境也要设置正确
一定要将交叉编译链版本设置正确,同时环境也要设置正确
2、获取Android boot.img
(1)可以从Android源码下获得
(2)Android源码下载需要很长时间,对于nexus手机有一种简单的方法:从google api官网上直接下载对应的包,里面有boot.img,systenm.img等文件,直接解压提取boot.img即可
3、由原来的boot.img文件与dtb文件生成新的boot.img
(1)替换源码中.dtb文件,重新编译即可。此方法耗时较长,不推荐
(2)使用上述文件中的安装方法
(3)使用abootimg生成:
sudo apt-get install abootimg
abootimg -u boot.img.test -k arch/arm64/boot/Image.gz-dtb
但是会报错:update is too big for the booting image (11732 vs 11623 bytes)
因为内核文件变大了,后加上-c “bootsize=11732”即可
abootimg -u boot.img.test -k arch/arm64/boot/Image.gz-dtb -c “bootsize=11732”
4、烧录
(1)烧录时要解锁bootloader
(2)查看fastboot是否可以可以采用fastboot devices命令
(3)Fast boot命令只是加入到缓存中,真正的命令为 fastboot flash boot