如何从AOSP为Android构建Linux内核?

3
我发现AOSP的build.sh dist会创建以下内容:
  • XML files:

    ./out/soong/.intermediates/kernel/configs/q/android-4.19/kernel_config_q_4.19/gen/conditional.xml
    ./out/soong/.intermediates/kernel/configs/q/android-4.19/kernel_config_q_4.19/matrix.xml
    

    from the kernel config files:

    kernel/configs/q/
    ├── android-4.14
    │   ├── android-base-conditional.xml
    │   ├── android-base.config
    │   ├── Android.bp
    │   ├── android-recommended-arm64.config
    │   ├── android-recommended-arm.config
    │   ├── android-recommended.config
    │   └── android-recommended-x86.config
    ├── android-4.19
    │   ├── android-base-conditional.xml
    ... ...
    
  • A whole copy of the Linux kernel directory in:

    out/target/product/sdm660_64/obj/kernel/msm-4.14
    

这个新创建的 msm-4.14 包含一个类似于普通内核配置的.config文件。

我该如何为aarch64编译这个内核?

当我使用make时,它提示重新生成x86_64配置文件,因为.config正确包含了Aarch64的设置。

也许我做错了什么,但是kernel/msm-4.14中的mm忽略了对内核配置的更改,而build.sh dist需要数小时。

我想要能够更改内核配置和源代码,并在几分钟内构建新内核,就像桌面机器一样。

在Android上,我该如何做到这一点?


1
请检查您是否可以按照此处所述编译内核:https://source.android.com/setup/build/building-kernels-deprecated#building。cd <aosp_root_dir>/kernel/msm-4.4/ && export CROSS_COMPILE=<aosp_root_dir>/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android- && export ARCH=arm64 && make sdm660_defconfig && make - Lakindu
@Lakindu 我需要执行 make vendor/sdm660_defconfig。目前正在进行内核构建... - fadedbee
@Lakindu 它失败了,错误信息为:./include/linux/fs.h:3309:56: 警告:格式'%lx'需要类型为'long unsigned int'的参数,但第二个参数的类型为'long long unsigned int' [-Wformat=] 错误,禁止警告:fs.h:3309 - fadedbee
@Lakindu,“make bootimage-j4” 能够正常工作(不会像之前那样失败),并且能够响应我对Linux源代码所做的更改。我认为,仅构建内核还需要一些其他操作。 - fadedbee
1个回答

6
这是编译适用于你的硬件的内核并创建启动镜像的方法:
$ cd <aosp_root_dir>
$ source ./build/envsetup.sh
$ lunch <product_name>-<build_variant>
# Example: lunch sdm660_64-userdebug

$ make bootimage -j4
# This compiles the kernel and copies it to 
# <aosp_root_dir>/out/target/product/<product_name>/kernel,
# and creates boot image at 
# <aosp_root_dir>/out/target/product/<product_name>/boot.img

如果你仍然需要缩短编译内核和创建启动镜像所需的时间,那么你必须找到AOSP构建系统执行的单个命令。
你可以在/out/verbose.log.gz中找到这些命令。这是一个压缩包,包含了上次构建的详细日志。
因此,请先使用“make bootimage”命令构建启动镜像,然后提取verbose.log.gz文件,你就会得到verbose.log文件。
在该文件中,查找包含文本“defconfig”的日志行,这可能是AOSP构建系统用于编译内核的命令。
在我的情况下,我从详细日志中找到了这两个用于编译内核的命令。
# make sdm660_defconfig
${ANDROID_BUILD_TOP}/prebuilts/build-tools/linux-x86/bin/make -j1 \
    -C kernel/msm-4.4 \
    O=${ANDROID_PRODUCT_OUT}/obj/kernel/msm-4.4 \
    HOSTCC=${ANDROID_BUILD_TOP}/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.17-4.8/bin/x86_64-linux-gcc \
    HOSTAR=${ANDROID_BUILD_TOP}/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.17-4.8/bin/x86_64-linux-ar \
    HOSTLD=${ANDROID_BUILD_TOP}/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.17-4.8/bin/x86_64-linux-ld \
    HOSTCFLAGS="-I/usr/include -I/usr/include/x86_64-linux-gnu -L/usr/lib -L/usr/lib/x86_64-linux-gnu" \
    HOSTLDFLAGS="-L/usr/lib -L/usr/lib/x86_64-linux-gnu" \
    ARCH=arm64 \
    CROSS_COMPILE=${ANDROID_BUILD_TOP}/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android- \
    sdm660_defconfig

# make
${ANDROID_BUILD_TOP}/prebuilts/build-tools/linux-x86/bin/make -j4 \
    -C kernel/msm-4.4 \
    O=${ANDROID_PRODUCT_OUT}/obj/kernel/msm-4.4 \
    HOSTCC=${ANDROID_BUILD_TOP}/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.17-4.8/bin/x86_64-linux-gcc \
    HOSTAR=${ANDROID_BUILD_TOP}/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.17-4.8/bin/x86_64-linux-ar \
    HOSTLD=${ANDROID_BUILD_TOP}/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.17-4.8/bin/x86_64-linux-ld \
    HOSTCFLAGS="-I/usr/include -I/usr/include/x86_64-linux-gnu -L/usr/lib -L/usr/lib/x86_64-linux-gnu" \
    HOSTLDFLAGS="-L/usr/lib -L/usr/lib/x86_64-linux-gnu" \
    ARCH=arm64 \
    CROSS_COMPILE=${ANDROID_BUILD_TOP}/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-

按照以上命令编译内核后,根据详细日志,它将编译输出复制到 <aosp_root_dir>/out/target/product/<product_name>/kernel。 这就是用于创建启动映像的内核文件。

cp "${ANDROID_PRODUCT_OUT}/obj/kernel/msm-4.4/arch/arm64/boot/Image.gz" \
    "${ANDROID_PRODUCT_OUT}/kernel"

最后,您可以找到创建引导镜像的命令。根据我的 详细日志,以下是该命令:

${ANDROID_BUILD_TOP}/out/host/linux-x86/bin/mkbootimg  \
    --kernel ${ANDROID_PRODUCT_OUT}/kernel  \
    --ramdisk ${ANDROID_PRODUCT_OUT}/ramdisk-recovery.img \
    --cmdline "console=ttyMSM0,115200,n8 androidboot.console=ttyMSM0 earlycon=msm_serial_dm,0xc170000 androidboot.hardware=qcom user_debug=31 msm_rtb.filter=0x37 ehci-hcd.park=3 lpm_levels.sleep_disabled=1 sched_enable_hmp=1 sched_enable_power_aware=1 service_locator.enable=1 swiotlb=1 loop.max_part=7 buildvariant=eng veritykeyid=id:`openssl x509 -in build/target/product/security/verity.x509.pem -text | grep keyid | sed 's/://g' | tr -d '[:space:]' | tr '[:upper:]' '[:lower:]' | sed 's/keyid//g'`" \
    --base 0x00000000 \
    --pagesize 4096 \
    --os_version 10 \
    --os_patch_level yyyy-mm-dd \
    --header_version 1 \
    --output  ${ANDROID_PRODUCT_OUT}/boot.img

如此一来,您可以找到编译适合您硬件的内核并创建引导镜像的命令。


感谢您的所有帮助。我已经授予了这个答案的赏金(因为它即将到期),一旦我测试过它,可能会在下周接受这个答案。 - fadedbee
@fadedbee,感谢您的慷慨奖励。如果您遇到任何问题,请告诉我。 - Lakindu
谢谢,它起作用了。我的日志中的代码非常复杂,每行超过7,000个字符。这就解释了为什么简单的内核构建尝试失败了。 - fadedbee

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