构建Android AOSP内核




引言

  本文档将主要详细介绍为 Android 设备构建自定义内核的流程。在该文档中我们将学会选择正确的源代码,构建内核,以及将结果嵌入到根据Android开源项目(AOSP)构建的系统映像中。当然我们也可以使用 Repo获取更多最新的内核源代码,并通过在源代码检出的根目录下运行build/build.sh来构建这些内核源代码,而无需更多配置。

由于我们这里主要说明的是通用内核,所以通过根目录下的build/build.sh来构建内核是不行的,通过这种方式构建的内核必须是特定平台的内核。通用内核是通用的可自定义内核,因此不会定义默认配置。




一.构建repo环境

  对于最新的内核,可以使用 repo 下载源代码、工具链和构建脚本。这里我们先简单说明下如何构建repo环境。其主要步骤如下:

  • 新建一个存放下载脚本文件的目录:
mkdir ~/bin
PATH=~/bin:$PATH
  • 下载repo脚本文件
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
vi ~/bin/repo
REPO_URL = 'https://gerrit.googlesource.com/git-repo'
改为
REPO_URL = 'https://gerrit-google.tuna.tsinghua.edu.cn/git-repo'



二.下载内核

由于国内的环境通常不能从谷歌官网下载,所以这里我们将会使用清华源来进行下载!

我想对于有过使用repo下载相关代码仓库的开发者来说,使用repo进行相关的操作应该是手到擒来了。这里我们看下下载Android最新通用内核的流程可以分为如下:

  • 步骤一
mkdir android-kernel && cd android-kernel
  • 步骤二
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'
epo init -u https://aosp.tuna.tsinghua.edu.cn/kernel/manifest  -b BRANCH
  • 步骤三
repo sync

这里我们重点看看如何查找对应的BRANCH名称,如下:

设备

AOSP 树中的二进制文件路径

Repo 分支

Pixel 5 (redfin)

Pixel 4a (5G) (bramble)

device/google/redbull-kernel

android-msm-redbull-4.19-android11-qpr2

Pixel 4a (sunfish)

device/google/sunfish-kernel

android-msm-sunfish-4.14-android11-qpr2

Pixel 4 (flame)

Pixel 4 XL (coral)

device/google/coral-kernel

android-msm-coral-4.14-android11-qpr2

Pixel 3a (sargo)

Pixel 3a XL (bonito)

device/google/bonito-kernel

android-msm-bonito-4.9-android11-qpr2

Pixel 3 (blueline)

Pixel 3 XL (crosshatch)

device/google/crosshatch-kernel

android-msm-crosshatch-4.9-android11-qpr2

Pixel 2 (walleye)

Pixel 2 XL (taimen)

device/google/wahoo-kernel

android-msm-wahoo-4.4-android10-qpr3

Pixel (sailfish)

Pixel XL (marlin)

device/google/marlin-kernel

android-msm-marlin-3.18-pie-qpr2

Hikey960

device/linaro/hikey-kernel

hikey-linaro-android-4.14

hikey-linaro-android-4.19

common-android12-5.4

Beagle x15

device/ti/beagle_x15-kernel

omap-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。

并且这里我们需要注意的是,这里我们要下载的是Android通用的内核二不是特定分支的内核!特定分支的内核通常是和特定的平台绑定在一起的!




三.Android版本通用内核分支的选择

  通过上面我们知道了如何下载Android特定分支的内核和通用内核,那么这里开发者肯定会有一个疑问就是加入问我要下载的是通用Android通用内核版本,那么我怎么为我的Android版本选择合适的内核分支呢。这里也有一张具体的表可以对应,如下:

Android平台版本

适配通用内核版本

Android 9 (2018)

android-4.4-p

android-4.9-p

android-4.14-p

Android 10 (2019)

android-4.9-q

android-4.14-q

android-4.19-q

Android 11 (2020)

android-4.14-stable

android-4.19-stable

android11-5.4

Android 12 (2021)

android-4.19-stable

android11-5.4

android12-5.4

android12-5.10

注意:上述的版本匹配只是Android建议并且有做过相关适配的,如果开发者一定要强制不按照这个匹配,当然也不是不可以!只要能力够,时间充足总是可以搞定的。




四.Android内核的构建

  Android最新版本的内核的构建分为特定分支和通用分支的构建,我们分别来介绍。



4.1 Android特定分支内核的构建

Android特定分支内核的构建就比较简单了,直接在repo完成后的内核根目录下执行如下命令即可:

build/build.sh

编译完成后的内核二进制文件、模块和相应的映像位于 out/BRANCH/dist 目录下。这里我们以android-msm-crosshatch-4.9-android11为例说明:

~/code/kernel$ export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'
~/code/kernel$ repo init --depth 1 -u https://aosp.tuna.tsinghua.edu.cn/kernel/manifest -b android-msm-crosshatch-4.9-android11
~/code/kernel$ repo sync -j20
~/code/kernel$ ./build/build.sh
~/code/kernel$ ls out/android-msm-pixel-4.9/dist/
abi.prop  heatmap.ko             kernel-uapi-headers.tar.gz  sdm845-v2.1.dtb  snd-soc-cs35l36.ko          snd-soc-wcd934x.ko  System.map                videobuf2-vmalloc.ko  wcd-dsp-glink.ko
dtbo.img  Image.lz4              modules.load                sdm845-v2.dtb    snd-soc-sdm845.ko           snd-soc-wcd9xxx.ko  vendor_boot.modules.load  vmlinux               wlan.ko
ftm5.ko   kernel-headers.tar.gz  pinctrl-wcd.ko              sec_touch.ko     snd-soc-sdm845-max98927.ko  snd-soc-wcd-spi.ko  videobuf2-memops.ko       wcd-core.ko



4.2 Android通用内核分支的构建

Android通用分支的构建,需要根据实际的场景来进行相关的构建,但是通常遵循的规则如下:

ARCH=<arch> scripts/kconfig/merge_config.sh <...>/<platform>_defconfig <...>/android-base.config <...>/android-base-<arch>.config <...>/android-recommended.config
export PATH=$PATH:/xxx/aosp/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9/bin
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-android-
make -j16



写在最后

关于构建Android AOSP内核就到这里结束了,这个是一个偏向实战性质的东西。多动手就OK了。当然最好建议读者参见谷歌官方文档,如下:

手动构建内核构建内核Android 通用内核