欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

编译android goldfish内核(x86_64)

程序员文章站 2024-02-02 21:44:04
...

Android linux内核

Android并没有使用标准的Linux内核,而是做了很多的修改。AOSP网站提供了适应各种芯片或设备的linux内核源码的仓,只有少部分google设备支持的内核源码可以通过repo构建,其他的需要做一些编译配置。

手动编译内核

这里选择emulator模拟器跑Android内核,所以选择goldfish版本作为我的的Linux Kernel,下面通过编译goldfish内核来介绍这个过程。
按照官方的教程没有找到xxx_defconfig编译配置文件,之后在网上找到一篇相似的博客,以下步骤基本上是按照那个教程来的。
1、下载源码

[email protected]:kernel$ git clone https://android.googlesource.com/kernel/goldfish

2、查看当前Android系统对应的内核版本

[email protected]:android-10$ emulator   # 虚拟机运行起来,点Setting -> Android version 查看内核版本信息

3、检出对应分支

[email protected]:kernel$ cd goldfish/
git branch -a
#....
#....
git checkout -b dev remotes/origin/android-goldfish-4.14-dev.20190417  # 对应的内核版本为4.14
#....

4、进行编译配置

export PATH=$PATH:/home/hinzer/source/android-10/prebuilts/gcc/linux-x86/x86/x86_64-linux-android-4.9/bin
export ARCH=x86_64
export CROSS_COMPILE=x86_64-linux-android-
export REAL_CROSS_COMPILE=x86_64-linux-android-

5、编译

/home/hinzer/source/android-10/prebuilts/qemu-kernel/build-kernel.sh  --arch=x86_64    # 需要在kernel的源码的根目录下执行

但是出现error,没有发现"x86_64_emu_defconfig"这个文件。于是我将x86_64_defconfig改为x86_64_emu_defconfig

cp -a /home/hinzer/source/android-10/kernel/goldfish/arch/x86/configs/x86_64_defconfig /home/hinzer/source/android-10/kernel/goldfish/arch/x86/configs/x86_64_emu_defconfig
/home/hinzer/source/android-10/prebuilts/qemu-kernel/build-kernel.sh  --arch=x86_64    # 继续编译
...
...
Kernel: arch/x86/boot/bzImage is ready  (#1)
Kernel x86_64_emu prebuilt images (kernel-qemu and vmlinux-qemu) copied to /tmp/kernel-qemu/x86_64-4.14.88 successfully !

6、加载内核并运行系统
模拟器默认使用的kernel是/prebuilts/qemu-kernel/x86/kernel-qemu,需要指定我们编译出的kernel。emulator启动相关的参数,可参考官方手册 - 命令行启动选项

# 编译生成的内核放在/tmp/kernel-qemu/x86_64-3.10.0/kernel-qemu
[email protected]:android-10$ emulator -kernel /tmp/kernel-qemu/x86_64-4.14.88/kernel-qemu  # 配置参数

7、再次查看当前Android系统对应的内核版本

补充

将编译出的kernel-qemu加载到emulator上发现界面直接卡死,adb devices命令也连接不上。发现在emulator界面查看到的kernel版本为4.1.4,/prebuilts/qemu-kernel/x86/kernel-qemu的版本信息却是3.4的。初步怀疑是编译的linux内核版本不对,导致无法正常启动。
但是又后来编译了3.4kernel,启动出现

[email protected]:android-10$ emulator -kernel prebuilts/qemu-kernel/x86/kernel-qemu 
emulator: WARNING: Couldn't find crash service executable /home/mi/source/android-10/prebuilts/android-emulator/linux-x86_64/emulator64-crash-service

emulator: ERROR: New emulator backend requires minimum kernel version 3.10+ (currently got lower)
Please make sure you've got updated system images and do not force the specific kernel image together with the engine version

(这个问题暂时还没有解决,只是目前单独编译不影响)

另外,进一步研究了kernel源码下的README文件,发现make ${PLATFORM}_defconfig说明。想到之前按照官方的步骤可能出了一点差错,修改为

cd goldfish
export ARCH=x86     # cpu架构
export CROSS_COMPILE=x86_64-linux-android-
make x86_64_defconfig    # 将arch/$ARCH/configs/xxx_defconfig写入.config文件,编译阶段build系统会检索
make

success!!此时编译出的映像文件输出arch/x86/boot/bzImage,

参考资料