Android kernel源码下载与编译
构建内核
本页详细介绍了为 Android 设备构建自定义内核的流程。以下说明会逐步指导您如何选择正确的源代码,编译内核,以及将结果嵌入到根据 Android 开源项目 (AOSP) 编译的系统映像中。
您可以使用 Repo 获取最新的内核源代码,并通过在源代码检出的根目录下运行 build/build.sh
来编译这些内核源代码,而无需更多配置。
注意:内核源代码检出的根目录包含 build/build.sh
。Android 树仅包含预编译的内核二进制文件。内核树包含内核源代码和用于编译内核的所有工具,包括此脚本。
对于较旧的内核或下文未列出的内核,请参阅有关如何编译旧版内核的说明。
下载源代码和编译工具
对于最新的内核,可以使用 repo
下载源代码、工具链和编译脚本。一些内核(例如 Pixel 3 内核)需要从多个 Git 代码库获取源代码,而其他内核(如通用内核)只需从一个 Git 代码库获取源代码。使用 repo
方法可确保源目录设置正确。
下载相应分支的源代码:
# repo init -u https://android.googlesource.com/kernel/manifest -b BRANCH
# repo sync
下表列出了可通过此方法获取的内核的 BRANCH 名称。
设备 | AOSP 树中的二进制文件路径 | Repo 分支 |
---|---|---|
Pixel 4 (flame) Pixel 4 XL (coral) |
device/google/coral-kernel | android-msm-coral-4.14-android10 |
Pixel 3a (sargo) Pixel 3a XL (bonito) |
device/google/bonito-kernel | android-msm-bonito-4.9-android10 |
Pixel 3 (blueline) Pixel 3 XL (crosshatch) |
device/google/crosshatch-kernel | android-msm-crosshatch-4.9-android10 |
Pixel 2 (walleye) Pixel 2 XL (taimen) |
device/google/wahoo-kernel | android-msm-wahoo-4.4-android10 |
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-android-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-5.4 common-android-mainline |
注意:您可以在一个 Repo 检出中切换不同的分支。通用内核清单(以及大多数其他清单)定义了要完全克隆(非浅克隆)的内核 git 代码库,这使您能够在这些分支之间快速切换。切换到不同的分支类似于初始化分支;-u
参数是可选的。例如,要从现有的 repo 检出切换到 common-android-mainline
,请运行以下命令:
$ repo init -b common-android-mainline && repo sync
。
构建内核
然后使用以下脚本构建内核:
# build/build.sh
注意:通用内核是通用的可自定义内核,因此不会定义默认配置。如需了解如何为通用内核指定编译配置,请参阅自定义内核编译。
内核二进制文件、模块和相应的映像位于 out/BRANCH/dist
目录下。
运行内核
您可以通过多种方式运行自定义编译的内核。下面介绍了几种适合各种开发场景的已知方法。
嵌入到 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
|
要从中初始化构建环境的构建配置文件。系统会相对于 Repo 根目录定义具体位置。默认为 build.config 。必须为通用内核指定此变量。 |
BUILD_CONFIG=common/build.config.cuttlefish.x86_64
|
OUT_DIR
|
内核 build 的基本输出目录。 |
OUT_DIR=/path/to/my/out
|
DIST_DIR
|
内核分发版本的基本输出目录。 |
OUT_DIR=/path/to/my/dist
|
CC
|
替换要使用的编译器。回退至 build.config 定义的默认编译器。
|
CC=clang
|
SKIP_MRPROPER
|
跳过 make mrproper
|
SKIP_MRPROPER=1
|
SKIP_DEFCONFIG
|
跳过 make defconfig
|
SKIP_DEFCONFIG=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 树包含预编译的内核版本。大多数情况下,git 日志会在提交消息中显示正确的版本:
# cd $AOSP/device/VENDOR/NAME
# git log --max-count=1
系统映像中的内核版本
如需确定系统映像中使用的内核版本,请对内核文件运行以下命令:
# file kernel
对于 Image.lz4-dtb
文件,请运行以下命令:
# grep -a 'Linux version' Image.lz4-dtb
Android kernel源码下载与编译相关推荐
- android 例子源码_AOSP系列文章(一)-Android系统源码下载和编译
前期准备 从这里开始,我们就去做android系统的修改,相信会有更多的同学有更多的玩法. android是开源的,在源代码里没有秘密. 同学们可以去修改系统,做成自己喜欢的样子.做汽车的车机,到家里 ...
- Android系统源码下载与编译、刷机--Nexus6实测
前言 此博文记录一下Android从系统源码下载到刷机的全过程. (https://source.android.com/source/build-numbers.html 页面中列表信息找到自己设备 ...
- android内核源码下载和编译
1.下载编译 新建kernel目录 ~/srcAndroid/src4.4.4_r1/kernel目录下,输入命令: seven@ThinkPad:~/srcAndroid/src4.4.4_r1/k ...
- Android12 源码下载、编译、刷机、单编调试Framework
文章目录 说明 1. 代码下载 1.1 下载Repo工具 1.2 安装和配置Git 1.3 创建工程目录 1.4 初始化Repo仓库 1.5 同步代码 2. 驱动下载 2.1 下载对应机型的驱动 2. ...
- 《深入理解Android内核设计思想(第2版)(上下册)》之Android源码下载及编译
本文摘自人民邮电出版社异步社区<深入理解Android内核设计思想(第2版)(上下册)> 购书地址:http://item.jd.com/12212640.html 试读地址:http:/ ...
- 《深入理解Android内核设计思想(第2版)(上下册)》之Android源码下载及编译...
本文摘自人民邮电出版社异步社区<深入理解Android内核设计思想(第2版)(上下册)> 购书地址:item.jd.com/12212640.ht- 试读地址:www.epubit.com ...
- Android 4.0.1 源码下载,编译和运行
[牛人分享]Android 4.0.1 源码下载,编译和运行 转自 http://blog.csdn.net/rambo2188/article/details/6943382 ----------- ...
- android源码下载以及编译自己的ROM
android源码下载以及编译自己的ROM 最近发现kernel.org被墙了,为什么这种网站也能被墙了? 要想下载源码的话,只能绕过去了.下面是我从网上搜索到的一些下载方法: =========== ...
- VLC for Android源码下载和编译
Project Hosting on 点击打开链接 最受欢迎的开源项目 点击打开链接 由Android的核心开发团队提供了15个优秀的示例项 目,包含了游戏.图像处理.时间显示.开始菜单快捷方式等. ...
最新文章
- 《iOS应用软件设计之道》—— 3.1 流向:从一个画面到另一个画面
- 详解-制作根文件系统,并使用yaffs,jffs,nfs挂载系统(2)
- [Leedcode][JAVA][第470题][Ran7()实现Rand10()]
- Dragonfly成为CNCF孵化项目,我们与基金会首位华人TOC聊了聊
- 操作系统——进程与线程
- idea没有错误提示的解决方法(一直处于错误分析中)
- linux如何判断网线插入_快速鉴定网线质量的常用方法
- 易观的大数据革命 分析师与机器人协同办公
- JavaScript中对于函数的形参实参个数匹配是如何做的?
- 获得select下拉框的值
- B站有哪些好的Java视频教程,看这篇就够了!
- 2006年考研数学一解析pdf
- 永远的Shawn,永远于我们同行
- 如何将excel转换成word文档图文教程
- 学生信息管理系统学籍信息管理
- Android6.0动态权限申请及RxPermissions权限库使用
- intel parallel studio xe 2020 Update 4
- pogo pin连接器与排针、排母的寿命区别
- 20暨南大学计算机考研经验知乎,暨大应统经验转自知乎
- 钉钉桌面版(dingtalk)介绍:支持Linux、Windows和macOS平台
热门文章
- python第三库安装方法记录
- You have not concluded your merge (MERGE_HEAD exists) git拉取失败
- 行存、列存,堆表、AO表性能对比 - 阿里云HDB for PostgreSQL最佳实践
- 阿里:车联网将成新网络入口
- 主键,唯一索引,唯一约束三者之间的联系与区别
- Android中实现非本地图片的点击态
- 2.GET与POST的区别
- Serverless 开发者平台
- html 图片旋转插件,jQuery插件expander实现图片翻转特效
- 关于java构造方法的描述_在JAVA语言中,下面关于构造函数描述正确的是()