将单独构建的Android内核集成到AOSP中。

4
我应该如何正确构建Android内核并使用此内核构建AOSP?目前我正在Linux x86_64主机上虚拟化Android。我使用的AOSP lunch选项是aosp_cf_x86_64_phone-userdebug。AOSP在主分支上,已于2022年1月同步。
我正在按照以下说明构建自己的Android内核:https://source.android.com/setup/build/building-kernels 我已完成以下步骤:
  1. repo同步到https://android.googlesource.com/kernel/manifest上的common-android12-5.10分支
  2. BUILD_CONFIG=common/build.config.gki.x86_64 build/build.sh
  3. BUILD_CONFIG=common-modules/virtual-device/build.config.virtual_device.x86_64 build/build.sh
这给了我一个 android-kernel/out/android12-510/dist/bzImage。我试着按照 https://source.android.com/setup/build/building-kernels#running 的说明做,先执行 export TARGET_PREBUILT_KERNEL=$(realpath android-kernel/out/android12-510/dist/bzImage),然后执行 m bootimagemake bootimage,但是 makem 都没有复制内核。

所以我尝试将预构建的内核直接复制到 aosp/kernel/prebuilts/5.10/x86_64 中,将其粘贴到 kernel-5.10kernel-5.10-allsyms 中,然后只保留 kernel-5.10,在执行 make bootimagem bootimage 时复制了我的构建内核。但两种方法都无法通过 launch_cvd 启动 Android,它一直在不断重启。

什么是将自定义Android内核提供给AOSP并使用该内核构建AOSP的正确方法?为什么Android不使用硬复制粘贴的内核文件启动?

2
https://github.com/nathanchance/android-kernel-clang/blob/master/README.md - alecxs
为什么要使用Clang?这不是非正常的方式吗?从我目前在谷歌文档中看到的内容来看,没有提到Clang,而是使用Soong。 - davidj361
抱歉,我不知道如何构建ROM,但是我猜测您的内核没有成功交叉编译为aarch64。 - alecxs
1
据我所知,内核是x86_64。请注意build.config.virtual_device.x86_64build.config.gki.x86_64。 此外,AOSP应该是x86_64,因为选择的午餐选项是aosp_cf_x86_64_phone-userdebug - davidj361
大多数运行 ARM CPU 的手机,你认为这是某种笔记本电脑或电视盒子吗? - alecxs
我现在只是使用x86_64来进行纯虚拟化。 - davidj361
2个回答

0

我在按照这篇文章构建内核并尝试在goldfish模拟器上使用时遇到了类似的问题(该模拟器可以通过“emulator”命令运行)。虽然不完全相同于cuttlefish,但问题是相似的。我在这里发布它,以防有人需要。

https://source.android.google.cn/docs/setup/build/building-kernels#embedding-into-Android

它说你必须设置TARGET_PREBUILT_KERNEL指向你的内核映像。然而,在模拟器中这样做不起作用。

export TARGET_PREBUILT_KERNEL=DIST_DIR/Image.lz4-dtb

  1. 在使用“lunch sdk_x86_64-eng”配置进行构建时,TARGET_PREBUILT_KERNEL将不会被使用。
  2. 内核构建输出中没有Image.lz4-dtb。

原因是在使用“lunch sdk_x86_64-eng”时,AOSP将使用位于device/generic/goldfish的goldfish构建配置。而gold fish的内核配置则在device/generic/goldfish/x86_64-kernel.mk中指定。

这里指定了三个设置:
  1. 使用内核版本5.10
  2. 内核模块路径,即GKI模块,一堆*.ko文件 - KERNEL_MODULES_PATH。请注意,这是一个目录。
  3. 内核文件路径,内核映像文件路径 - EMULATOR_KERNEL_FILE。
实际上,您可以在AOSP内核目录中找到2)和3)。
您应该将KERNEL_MODULES_PATH和EMULATOR_KERNEL_FILE更改为自定义构建的内核输出目录和文件。例如:
KERNEL_MODULES_PATH=/kernel/out/dir # 一个包含许多*.ko文件的目录
KERNEL_MODULES_PATH=/kernel/out/dir/bzImage # 大约20M左右的文件

更改此文件后,清理并重新构建AOSP。然后模拟器将使用您的自定义内核运行。
对于cuttle fish,aosp_cf_x86_64_phone-userdebug目标,内核配置文件位于 device/google/cuttlefish/vsoc_x86_64/kernel.mk
TARGET_KERNEL_USE ?= 5.10 TARGET_KERNEL_PATH ?= kernel/prebuilts/$(TARGET_KERNEL_USE)/x86_64/kernel-$(TARGET_KERNEL_USE) PRODUCT_COPY_FILES += $(TARGET_KERNEL_PATH):kernel
我不确定为什么它只有TARGET_KERNEL_PATH,而没有内核模块路径(GKI模块,*.ko文件)。您应该能够从此文件device/google/cuttlefish/vsoc_x86_64/phone/aosp_cf.mk中跟踪到。

0

第一步:代码同步 将存储库同步到https://android.googlesource.com/kernel/manifest上的common-android12-5.10分支。

第二步:构建Android通用内核 构建Android通用内核的配置 我将构建common-android13-5.15,因此使用以下配置。

BUILD_CONFIG=common-modules/virtual-device/build.config.cuttlefish.x86_64 
build/build.sh

然后在模拟器上运行以下命令。
BUILD_CONFIG=common-modules/virtual-device/build.config.virtual_device.x86_64
build/build.sh

构建完成后,请检查内核文件。
/home/saurabh/kernel-common-android13-5.15/out/android13-5.15/dist/bzImage

第三步:在AOSP构建系统中包含自定义内核
编辑通常位于设备文件夹中的内核make文件。对于模拟器路径是
device/generic/goldfish/x86_64-kernel.mk

第四步:构建完整的AOSP并运行模拟器 在修改内核的make文件之后,您需要完全重新构建AOSP以替换内核映像。
make -j8

成功构建后,使用以下命令运行模拟器。
emulator -verbose -show-kernel -selinux permissive -writable-system

更多详细信息请关注我的博客:https://saurabhsharma123k.blogspot.com/2023/07/build-android-kernel-and-load-your.html

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接