Android KitKat(4.4)单独编译Kernel

Android KitKat(4.4)单独编译Kernel

这篇文章教你如何在没有全部Android源码,只有kernel文件夹时编译boot.img。另外这里需要从4.4的源码或者平台源码提取一些工具。

Android源码里的Kernel文件夹是GNU协议的,所以厂家的驱动操作细节基本在其他目录(比如vendor)下的Hal代码里。

如果想熟悉Android大概编译流程的话,最直接的就是看/build/core/Makefile的代码,这样你就会清楚每个img文件是从那些文件里生成的,用的什么参数、工具也一目了然。


关于安卓各版本的差异和平台差异

安卓各版本差异

Android不同版本编译时,需要的JDK版本和C编译工具版本是不一样的,4.4用的JDK版本是1.6,而C的编译器版本可以查看/build/core/Makefile的代码来确认。

平台差异

展讯、MTK、高通下的有些平台在编译完源码后会对img进行签名加密操作,如果涉及到签名加密最好是拥有对应平台的源码,从中提取签名加密工具和参数。


编译脚本的编写

文件目录

├── arm-eabi-4.8 // c编译器
├── build_tools //编译相关工具
├── config
│ ├── kernel_config //kernel编译的config文件,需要从kernel/arch/arm/configs下找到对应机器类型的config文件,或者直接从整体源码编译后的out目录里提取
│ └──xxxxx-native.dtb //kernel对应机器类型的dts文件,用来生成dt.img,需要从kernel/arch/arm/boot/dts目录里提取
├── flash
│ └── ramdisk.img //整体源码编译后的ramdisk.img
├── kernel //源码文件
├── packimage_scripts //签名加密工具,不一定需要,看平台
├── build.sh //编译脚本

编写编译脚本build.sh

编译的过程,简单来说,就是先根据config文件编译kernel文件夹,找到对应机器的dts文件用dtbTool生成dt.img,然后使用mkbootimg工具,合并kernel的编译结果Image、ramdis.img、dt.img生成boot.img。

最后如果需要签名加密在用签名加密工具对boot.img进行签名加密。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
make -j8 -l8 -C ./kernel clean
rm -rf out
mkdir out

rm flash/dt.img flash/boot.img flash/boot-sign.img

cp ./config/kernel_config out/.config
make -j4 -C ./kernel ARCH=arm CROSS_COMPILE=$PWD/arm-eabi-4.8/bin/arm-eabi- O=$PWD/out/

find out/arch/arm/boot/dts/ -name *.dtb ! -name xxxxx.dtb | xargs -I{} rm {}

./build_tools/dtbTool -o flash/dt.img -s 2048 -p out/scripts/dtc/ out/arch/arm/boot/dts/

./build_tools/mkbootimg --kernel out/arch/arm/boot/Image --ramdisk flash/ramdisk.img --cmdline console=ttyS1,115200n8 --base 0x00000000 --pagesize 2048 --dt flash/dt.img --kernel_offset 0x00008000 --ramdisk_offset 0x05400000 --output flash/boot.img

source packimage_scripts/packimage.sh flash/boot.img

 

这里还得说下,因为平台的不同,编译过程的参数、指令、文件都可能有差异,最好是根据/build/core/Makefile里的过程走,也可以参照其他kernel编译的相关文章。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×