这篇文章教你如何在没有全部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 |
|
这里还得说下,因为平台的不同,编译过程的参数、指令、文件都可能有差异,最好是根据/build/core/Makefile里的过程走,也可以参照其他kernel编译的相关文章。