Android内核编译入门

来自Uotan Wiki · 刷机百科
Luluzzy讨论 | 贡献2024年2月16日 (五) 18:28的版本 (补充简介部分内容)

Android 内核简介

安卓内核用的也是linux(LTS),google把LTS内核和Android的一些补丁、模块结合形成自己的Android通用内核(Android common kernel,ACK)。也就是GKI, Generic Kernel Image。

相当于现在变成了一个Image,镜像了。

GKI 内核会与包含系统芯片 (SoC) 和板级代码的硬件专用供应商模块进行交互。GKI 内核与供应商模块之间的交互通过内核模块接口 (KMI) 来实现,该接口由标识供应商模块所需的函数和全局数据的符号列表组成。

配置使用环境

Ubuntu 20.04 / 22.04

Arch Linux

(因为主播使用的就是这个喵)

考虑到编译环境的稳定性不是很推荐装一些其他的系统

你可以使用 VMware virtual machine 或者 WSL2 (Windows Subsystem on Linux)

目前我更推荐使用 WSL 因为其安装较为方便,并且可以与 Microsoft VScode 协同工作方便你对Git的使用以及对内核源码的修改

(当然 Vmware 也可以,只不过我印象不太好,这货 bug 稍微有点多)

关于这两者方案优劣对比详见百度,此处不赘述。

  • 安装一些必要的工具依赖

apt-get update

apt-get install -y build-essential bc bison python curl git zip ftp gcc-aarch64-linux-gnu gcc-arm-linux-gnueabi libssl-dev lftp wget libfl-dev gcc bc zip make


这些依赖可以通过百度查到对应的作用,此处不赘述。

如若你在编译时遇见提示缺依赖的情况,你也可以百度依赖的名字来查询解决方式。

  • 安装/下载交叉编译工具链

Clang

此处推荐两个

一个是Google官方提供的Clang编译器:Google Clang

一个是由知名大佬kdrag0n 提供的预编译Clang:Proton Clang

设置环境变量

你也可以将下列的指令写在脚本里面

export CC='放clang的路径/bin/clang'

export CLANG_TRIPLE=aarch64-linux-gnu-

export CROSS_COMPILE='aarch64-linux-gnu编译器的路径/bin/aarch64-linux-gnu-'

export CROSS_COMPILE_ARM32='arm-linux-gnueabi编译器的路径/bin/arm-linux-gnueabi-'

export ARCH=arm64

export SUBARCH=arm64

export KBUILD_BUILD_HOST=""

export KBUILD_BUILD_USER=""

make O=out device_defconfig

这里需要注意的是,最后的device

取决于你编译的设备的代号,查看你设备的代号请见:

defconfig则是你设备在内核中的配置文件,一套内核源码可能被多个设备共有。在编译的时候,make通过不同的配置文件来区分这些设备,这些配置文件在arch/[架构]/config下,在make的时候无需指定路径,直接输入配置文件名字即可。[1]

举个简单的例子,内核源码就是一个大超市,defconfig购物清单)则负责告诉 make你需要购买什么东西(对其进行编译),从而达成对设备驱动的区分

拉取内核源码

关于如何找到你的内核源码这件事,大部分内核源码在开源时都会参照以下命名规则命名

android_kernel_厂商_平台 例如 android_kernel_xiaomi_sm8250

在针对特定机型进行优化或者重构后的源码也会有开发者将其命名为

android_kernel_厂商_设备代号(或者机型名称)

我们一般可以在Github找到这些源码

如果您需要拉取ACK(Android Common Kernel)请前往Google OpenSource

  1. 此处引用了 grislux55 在gitbook上的内核编译教程中针对配置文件的介绍,文末贴上了引用资料链接