安卓构建内核(转载待查)

摘要:
//来源。安卓com/setup/build/building kernels#下载此页面详细介绍了为Android设备构建自定义内核的过程。内核树包含内核源代码和用于构建内核的所有工具。如果您需要构建一个较旧的内核或未在此页面中列出的内核,则常规内核列表(以及大多数其他列表)将定义要完全克隆(而不是浅层克隆)的内核git代码库。
构建内核

 来源: https://source.android.com/setup/build/building-kernels#downloading

本页详细介绍了为 Android 设备构建自定义内核的流程。以下说明会逐步指导您如何选择正确的源代码,构建内核,以及将结果嵌入到根据 Android 开源项目 (AOSP) 构建的系统映像中。

您可以使用 Repo 获取最新的内核源代码;通过在源代码检出的根目录下运行 build/build.sh 来构建这些内核源代码,而无需更多配置。

注意:内核源代码检出的根目录包含 build/build.sh。Android 树仅包含预构建的内核二进制文件。内核树包含内核源代码和用于构建内核的所有工具,包括此脚本。

如需构建较旧的内核或本页面中未列出的内核,请参阅有关如何构建旧版内核的说明。

下载源代码和构建工具

对于最新的内核,可以使用 repo 下载源代码、工具链和构建脚本。一些内核(例如 Pixel 3 内核)需要从多个 git 代码库获取源代码,而其他内核(如通用内核)只需要一份源代码。使用 repo 方法可确保源目录设置正确。

下载相应分支的源代码:

 
mkdir android-kernel && cd android-kernel
 
repo init -u https://android.googlesource.com/kernel/manifest -b BRANCH
 
repo sync

下表列出了可通过此方法获取的内核的 BRANCH 名称。

设备AOSP 树中的二进制文件路径Repo 分支
Pixel 5a (barbet)device/google/barbet-kernelandroid-msm-barbet-4.19-android11-d2
Pixel 5 (redfin)
Pixel 4a (5G) (bramble)
device/google/redbull-kernelandroid-msm-redbull-4.19-android11-qpr3
Pixel 4a (sunfish)device/google/sunfish-kernelandroid-msm-sunfish-4.14-android11-qpr3
Pixel 4 (flame)
Pixel 4 XL (coral)
device/google/coral-kernelandroid-msm-coral-4.14-android11-qpr3
Pixel 3a (sargo)
Pixel 3a XL (bonito)
device/google/bonito-kernelandroid-msm-bonito-4.9-android11-qpr3
Pixel 3 (blueline)
Pixel 3 XL (crosshatch)
device/google/crosshatch-kernelandroid-msm-crosshatch-4.9-android11-qpr3
Pixel 2 (walleye)
Pixel 2 XL (taimen)
device/google/wahoo-kernelandroid-msm-wahoo-4.4-android10-qpr3
Pixel (sailfish)
Pixel XL (marlin)
device/google/marlin-kernelandroid-msm-marlin-3.18-pie-qpr2
Hikey960device/linaro/hikey-kernelhikey-linaro-android-4.14
hikey-linaro-android-4.19
common-android12-5.4
Beagle x15device/ti/beagle_x15-kernelomap-beagle-x15-android-4.14
omap-beagle-x15-android-4.19
Android 通用内核common-android-4.4
common-android-4.9
common-android-4.14
common-android-4.19
common-android-4.19-stable
common-android11-5.4
common-android12-5.4
common-android12-5.10
common-android-mainline
注意:您可以在一个 Repo 检出中切换不同的分支。通用内核清单(以及大多数其他清单)定义了要完全克隆(非浅克隆)的内核 git 代码库,这使您能够在这些分支之间快速切换。切换到不同的分支类似于初始化分支;-u 参数是可选的。例如,要从现有的 repo 检出切换到 common-android-mainline,请运行以下命令:
$ repo init -b common-android-mainline && repo sync

构建内核

然后使用以下内容构建内核:

 
build/build.sh
注意:通用内核是通用的可自定义内核,因此不会定义默认配置。如需了解如何为通用内核指定构建配置,请参阅自定义内核构建。例如,如需为 aarch64 平台构建 GKI 内核,请运行以下命令:
$ BUILD_CONFIG=common/build.config.gki.aarch64 build/build.sh

内核二进制文件、模块和相应的映像位于 out/BRANCH/dist 目录下。

构建 GKI 模块

Android 11 引入了 GKI,用于将内核拆分为由 Google 维护的内核映像和由供应商维护的模块,二者分别单独构建。

以下示例展示了内核映像配置:

 
BUILD_CONFIG=common/build.config.gki.x86_64 build/build.sh

以下示例展示了模块配置(Cuttlefish 和模拟器):

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

运行内核

您可以通过多种方式运行以自定义方式构建的内核。下面介绍了几种适合各种开发场景的已知方法。

嵌入到 Android 映像构建中

将 Image.lz4-dtb 复制到 AOSP 树中相应的内核二进制位置,然后重新构建启动映像。

或者,您也可以在使用 make bootimage(或用于构建启动映像的任何其他 make 命令行)时定义 TARGET_PREBUILT_KERNEL 变量。所有设备均支持该变量,因为它是通过 device/common/populate-new-device.sh 进行设置的。例如:

 
export TARGET_PREBUILT_KERNEL=DIST_DIR/Image.lz4-dtb

使用 fastboot 刷新和启动内核

最新的设备具有引导加载程序扩展,可以简化生成和启动启动映像的过程。

要启动内核而不刷新,请运行以下命令:

 
adb reboot bootloader
fastboot boot Image.lz4-dtb

使用此方法时,内核实际上并未刷新,因此不会在重新启动时保留。

注意:内核名称因设备而异。要找到内核的正确文件名,请参阅 AOSP 树中的 device/VENDOR/NAME-kernel

自定义内核构建

构建流程和结果可能会受环境变量的影响。它们中的大多数是可选的,并且每个内核分支都应该具有适当的默认配置。此处列出了最常用的变量。如需完整(且最新)的列表,请参阅 build/build.sh

环境变量说明示例
BUILD_CONFIG用于初始化构建环境的 build 配置文件。 必须相对于 Repo 根目录定义其具体位置。默认为 build.config
必须为通用内核指定此变量。
BUILD_CONFIG=common/build.config.gki.aarch64
CC替换要使用的编译器。回退至 build.config 定义的默认编译器。CC=clang
DIST_DIR内核分发版本的基本输出目录。DIST_DIR=/path/to/my/dist
OUT_DIR内核 build 的基本输出目录。OUT_DIR=/path/to/my/out
SKIP_DEFCONFIG跳过 make defconfigSKIP_DEFCONFIG=1
SKIP_MRPROPER跳过 make mrproperSKIP_MRPROPER=1

本地构建的自定义内核配置

如果您需要定期切换内核配置选项(例如,在开发某项功能时),或者需要设置一个用于开发用途的选项,可以通过维护构建配置的本地修改或副本来实现这种灵活性。

将 POST_DEFCONFIG_CMDS 变量设为一个在常规 make defconfig 步骤完成后立即接受评估的语句。由于 build.config 文件源于构建环境,因此 build.config 中定义的函数可以作为 post-defconfig 命令的一部分进行调用。

一个常见示例是在开发期间针对 crosshatch 内核停用链接时优化 (LTO)。虽然 LTO 对已发布的内核有益,但构建时产生的开销可能巨大。添加到本地 build.config 的以下代码段将在使用 build/build.sh 时永久停用 LTO。

 
POST_DEFCONFIG_CMDS="check_defconfig && update_debug_config"
function update_debug_config() {
    ${KERNEL_DIR}/scripts/config --file ${OUT_DIR}/.config 
         -d LTO 
         -d LTO_CLANG 
         -d CFI 
         -d CFI_PERMISSIVE 
         -d CFI_CLANG
    (cd ${OUT_DIR} && 
     make O=${OUT_DIR} $archsubarch CC=${CC} CROSS_COMPILE=${CROSS_COMPILE} olddefconfig)
}

确定内核版本

您可以通过以下两个来源确定要构建的正确版本:AOSP 树和系统映像。

AOSP 树中的内核版本

AOSP 树包含预构建的内核版本。git 日志会在提交消息中显示正确的版本:

 
cd $AOSP/device/VENDOR/NAME
git log --max-count=1

如果内核版本未在 git 日志中列出,请从系统映像中获取,如下所述。

系统映像中的内核版本

如需确定系统映像中使用的内核版本,请对内核文件运行以下命令:

 
file kernel

对于 Image.lz4-dtb 文件,请运行以下命令:

 
grep -a 'Linux version' Image.lz4-dtb

构建启动映像

可以使用内核构建环境构建启动映像。为此,您需要一个 ramdisk 二进制文件,该二进制文件可以通过下载 GKI 启动映像后解压缩来获取。关联的 Android 版本中的任何 GKI 启动映像都可以使用。

 
tools/mkbootimg/unpack_bootimg.py --boot_img=boot-5.4-gz.img
mv tools/mkbootimg/out/ramdisk gki-ramdisk.lz4

目标文件夹是内核树的顶级目录(当前的工作目录)。

如果您使用 AOSP master 进行开发,则可以从 ci.android.com 上的 aosp_arm64 build 中下载 ramdisk-recovery.img build 工件,并将其用作 ramdisk 二进制文件。

当您拥有 ramdisk 二进制文件并将其复制到内核 build 的根目录中的 gki-ramdisk.lz4 时,可以通过执行以下命令来生成启动映像:

 
BUILD_BOOT_IMG=1 SKIP_VENDOR_BOOT=1 KERNEL_BINARY=Image GKI_RAMDISK_PREBUILT_BINARY=gki-ramdisk.lz4 BUILD_CONFIG=common/build.config.gki.aarch64 build/build.sh

如果您使用的是基于 x86 的架构,请将 Image 替换为 bzImage,将 aarch64 替换为 x86_64

 
BUILD_BOOT_IMG=1 SKIP_VENDOR_BOOT=1 KERNEL_BINARY=bzImage GKI_RAMDISK_PREBUILT_BINARY=gki-ramdisk.lz4 BUILD_CONFIG=common/build.config.gki.x86_64 build/build.sh

该文件位于工件目录 $KERNEL_ROOT/out/$KERNEL_VERSION/dist 中。

启动映像位于 out/<kernel branch>/dist/boot.img

免责声明:文章转载自《安卓构建内核(转载待查)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Linux下Mycat安装配置和使用C# PDF文件转图片下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【PCIE-4】---PCIE中部分概念或问题总结(很基础很重要)

前面三小节,介绍了PCIE的基本知识和概念,以及扫描流程。在不求甚解的情况下,我想各位小伙伴应该对PCIE有了个宏观的认识,OK,那么本章我们在之前的基础上,再单独把一些概念和更深层次的问题摘出来具体讨论。 首先依旧是国际惯例,先列问题:   1. PCIE的各个模块中,经常提到Bridge/Host Bridge,Root Complex, Root p...

win10安装mysql5.7.29教程以及错误处理

重新配了一台电脑,装了win10系统,安装mysql是出现了一些问题以及解决的方法。记录于此,避免下次安装遇到重复问题。 首先下载mysql5.7.29安装包,本次使用的是zip。已保存在百度网盘 链接:https://pan.baidu.com/s/1y8aahxloQEJTGXqmd95xsg 提取码:e3c6 也可以自己去官网下载: 下载地址:  h...

Window命令行切换命令

Windows 命令行切换目录 特别注意:切换到其它盘符不需要 cd 命令 1. 切换到 C 盘根目录 打开终端 cmd 后,输入cd C:(一定要加上后面的反斜扛) 2.切换到 C 盘子目录 打开终端 cmd 后,输入cd C:dir1(切换到 C 盘下目录 dir1) 3.切换到其他盘根目录 打开终端 cmd 后,输入D:(不需要加 cd,一定不要加反...

目录扫描工具DirBuster

DirBuster是用来探测web服务器上的目录和隐藏文件的。因为DirBuster是采用java编写的,所以运行前要安装上java的环境。 来看一下基本的使用:  ①:TargetURL下输入要探测网站的地址,需要注意的是这个地址要加上协议,看网站是http还是https。  ②:WorkMethod是选择工作方式,一个是get请求,一个是自动选择。一般...

Android平台下OpenCV移植与使用---基于C/C++

  在《Android Studio增加NDK代码编译支持--Mac环境》和《Mac平台下Opencv开发环境搭建》两篇文章中,介绍了如何使用NDK环境和Opencv环境搭建与测试使用,现在,在PC端对图像处理算法测试没问题后,该在移动端进行功能移植了,ios平台的很简单,直接把类库拷进工程就行了,android的稍微麻烦点,这里就以android平台为例...

git远程版本回退

本文为博主原创,未经允许不得转载:   之前在git提交版本时,发现将新开发的代码提交到了另一个分支上,为了不影响提交分支代码的 功能,需要回退到之前的版本。   在使用命令回退的时候,一直没有回退成功,有个同事过来帮忙,成功回退到之前的版本,并记录 一下。   查找到git提交时的备注,时间,找到提交时的版本,并方便回退。 同事是在git 小乌龟上进行回...