[Android]从零开始的内核编译

这篇具有很好参考价值的文章主要介绍了[Android]从零开始的内核编译。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

从零开始的内核编译

本教程将基于小米 10S 的内核源码进行实例,其他型号的手机请自行寻找内核源码。具体内容可以参考我的内核编译项目。

手机型号查询

1. 获取设备(手机)代号

在安卓设备终端(adb shell)上执行:

getprop | grep device

并寻找带有 ro.xx.device 这一行,里面的内容即为你的手机代号,例如:

# 手机代号为 thyme
[ro.product.device]: [thyme]

2. 获取设备架构

在安卓设备终端(adb shell)上执行:

uname -m

我的设备显示为 aarch64, 即可判断我的设备架构为 aarch64

3. 获取设备内核版本

在安卓设备终端(adb shell)上执行:

uname -r

输出内容的格式为:

  • [版本].[补丁版本].[子版本号]-[内核标识]-[提交记录]

例如我的设备显示为 4.19.157-Margatroid-gb1b98c3d4fd0

内核源码获取

内核源码的一般格式为 [android_]kernel_设备厂商_cpu/代号,例如,小米 10S(thyme)的代号为 thyme, CPU 型号为 sm8250,生产厂商为 xiaomi,则搜索格式应为下面几种:

kernel_xiaomi_thyme
kernel_xiaomi_sm8250
android_kernel_xiaomi_thyme
android_kernel_xiaomi_sm8250

以下是我收集的一些小米 10S(thyme)的源码仓库:

  • Lynnrin-Studio/android_kernel_xiaomi_thyme: 这是我目前编译内核所使用的内核源码。
  • UtsavBalar1231/kernel_xiaomi_sm8250: CLO 内核升级为 CAF 标签 LA.UM.9.12.r1-14700-SMxx50,AOSP 源码同步上游 android-4.19-stable
  • WeeAris/RK-KSU-mi-kernel-SM8250: 支持 KernelSU 的 Rohail33/RealKing-kernel-SM8250 分支。
  • Rohail33/RealKing-kernel-SM8250: 基于 LA.UM.9.12.r1-08000-SMxx50.0 标签的内核。

当然除此之外还有很多源码,但这些源码对于我来说是我前期学习的一个途径,因此在这里列出给大家。

途径 具体介绍
各厂商开源 小米内核开源
华为开源代码
去手机社区找源码 XDA 论坛

获取编译工具链

强烈推荐您学习[内核向] 交叉编译器的选择以及[白话文版] ClangBuiltLinux Clang 的使用来学习工具链的配置。

同时可以配合 Neutron-Clang 的说明文档来进行编译参数配置。

目前比较推荐的几个预编译工具链如下:

工具名称 简介
Neutron-Clang 这是为内核开发构建的 LLVM 和 Clang 编译器工具链。构建始终是从最新的 LLVM 源代码而不是稳定版本构建的,因此无法保证完全的稳定性
阿菌•未霜 Clang/LLVM Toolchain with Binutils 这是一个预构建的工具链,构建始终来自最新的 LLVM 和 Binutils 源而不是稳定版本,因此无法保证完全的稳定性。它是用 Full LTO、PGO 和 BOLT 构建的,以尽可能减少编译时间。
ClangBuiltLinux/tc-build 类似前两个工具,但是这个工具需要自己在本地从 LLVM 的源码进行构建,但编译时间较长。

除此之外,一个比较保险的方法是从预编译内核机器的 /proc/config.gz 提取`,需要对应版本的交叉编译器以及 Clang,自行选择合适版本下载即可,通过这种方式编译出来的内核一般是不会存在错误的。

1. Neutron-Clang 使用介绍

这是为内核开发构建的 LLVM 和 Clang 编译器工具链。构建始终是从最新的 LLVM 源代码而不是稳定版本构建的,因此不能保证完全的稳定性。目前该编译链工具使用 AntMan 来同步工具,具体使用方法如下:

mkdir -p "$HOME/toolchains/neutron-clang"
cd "$HOME/toolchains/neutron-clang"
bash <(curl -s "https://raw.githubusercontent.com/Neutron-Toolchains/antman/main/antman") -S

一些更多的 AntMan 命令:

功能 对应命令
同步最新的工具链构建 ./antman -S./antman -S=latest
同步特定的工具链版本 ./antman -S=<release tag>
检查更新 ./antman -U
检查更新和同步更新 ./antman -Uy
同步特定更新 ./antman -S=<release tag>
删除同步构建 ./antman -D
显示有关同步构建的信息 ./antman -I
同步特定的工具链版本 ./antman -S=<release tag>

如果需要更多细节介绍,请运行 ./antman --help 获取。

2. ClangBuiltLinux

如果您想要使用这个工具链的话,那么其中的编译工具则需要你自行编译,对应的编译脚本为 ClangBuiltLinux/tc-build。

诚然,自行编译确实是一件造轮子且费时费力的方法,但是通过这种方式编译出来的工具是最适合您的系统的,不会发生其他的编译中的关于 glibc 等方面的错误。

3. 阿菌•未霜 Clang/LLVM Toolchain with Binutils

这是一个预构建的工具链,构建始终来自最新的 LLVM 和 Binutils 源而不是稳定版本,因此无法保证完全的稳定性。它是用 Full LTO、PGO 和 BOLT 构建的,以尽可能减少编译时间。

其编译链工具存储在:

  • GitHub:仅用于发布预构建的压缩文件(*.7z)
  • Gitea:仅用于存储预构建的二进制文件(Current AR Archive、ELF 64-bit LSB shared object 存储在 LFS)

编译脚本编写

内核编译流程其实只有两步:

  1. 生成对应设备的配置文件 make <theDefConfig>
  2. 开始编译内核 make

您可以直接执行这些指令进行编译(参数设置一定要正确),或参考我下面的编译流程:

1. 设置编译链环境

最简单的设置环境办法就是将编译链工具的路径添加到系统路径中,例如:

export PATH="<absolute/path/to/ur/toolchains>/bin:$PATH"
# 例如,您正在使用 neutron-clang
# export PATH="home/user/toolchains/neutron-clang/bin:$PATH"
# 其中的路径必须为绝对路径

如果您在使用 gcc,可能还需要将 gcc 工具链的路径加入到环境变量中。

2. 简易配置脚本

首先给出一个最基础的配置脚本:

#!/bin/bash
args="-j$(nproc --all) \
O=out \
ARCH=arm64 \
CROSS_COMPILE=aarch64-linux-gnu- \
CC=clang \
CROSS_COMPILE_COMPAT=arm-linux-gnueabi- "
make ${args} <config name>
make ${args}

该脚本是在使用上一节的三个工具时才可以正常使用的,如果您使用其他工具可以需要进行其他配置。

下面是一些参数对应的说明:

参数 说明 一般参数
CC 指定使用的编译器,因为 make 默认使用 gcc,因此实际上只有你在使用 clang 进行编译的时候才会使用该参数 clang
CROSS_COMPILE 您的主要交叉编译链工具,如果你在使用谷歌的 gcc 4.9,请指定参数为 aarch64-linux-android-,32 位同理 aarch64-linux-gnu-
CLANG_TRIPLE 只在使用 clang 进行编译的时候才需要使用,用于指定当 clang 不生效时候使用的工具链,但在使用上一节我们提到的工具中基本不用设置该参数 aarch64-linux-gnu-
CROSS_COMPILE_ARM32 只在编译 32 位内核或者带 vdso 补丁的内核时需要指定该参数 arm-linux-gnueabi-
CROSS_COMPILE_COMPAT 类似于参数 CROSS_COMPILE_ARM32 ,但内核版本为 4.19 及更新版本应使用本参数而非 CROSS_COMPILE_ARM32 arm-linux-gnueabi-

更多参数介绍可以参考一下 Neutron-Clang 的编译说明,里面对于一些参数的说明比较详细。

正常情况下,clang 是无法独立完成内核编译的,需要 gcc 的辅助。但使用上一节介绍的几种工具并不需要并不需要单独指定 gcc 来辅助编译。

3. 部分参考脚本

  • DogDayAndroid/KSU_Thyme_BuildBot:我自己编译的内核使用的本地编译脚本。
  • UtsavBalar1231/Drone-scripts:一个很多人使用的编译脚本,我的部分代码也是参考自这里。
  • EndCredits/kernel_xiaomi_sm7250:同样的一个编译脚本,但并未提供编译链,但是其中的脚本流程我也有参考。
  • xiaoleGun/KernelSU_Action:KernelSU 的编译脚本,同样有参考。

制作刷机包镜像

内核编译完成后的打包请参考文章[内核向] 论如何优雅的刷入内核,目前最流行的方法是使用 osm0sis/AnyKernel3 来完成整个内核的打包刷入工作。

如果您更喜欢自己动手,那么请参考文章内的其他方法。

值得注意的是,不同版本的内核编译出来的内容并不相同,因此需要区分他们之间的打包,详情请参考文章:关于 Image.xx-dtb 和 Image.xx + dtb 的区别。

来自文章的评论区:_对应芯片组的。比如 865 只需要 kona-v2.1.dtb。如果弄不清楚,可以使用 cat 命令将多个 dtb 连接在一起,bootloader 会自动识别。

编译常见问题

本教程将基于小米 10S 的内核源码进行实例,其他型号的手机请自行寻找内核源码。具体内容可以参考我的内核编译项目。

1. -Werror=implicit-int

/arch/arm64/kernel/smp.c:834:8: error: type defaults to ‘int’ in declaration of ‘in_long_press’ [-Werror=implicit-int]

您可以修改 extern in_long_pressextern int in_long_press;或者去除MakeFile 中对应错误限制。文章来源地址https://www.toymoban.com/news/detail-447194.html

参考

  • 自己编译定制一个牛逼的安卓内核
  • 让 Android 手机更省电流畅,你可以试试「刷内核」
  • [内核向] 交叉编译器的选择
  • [白话文版] ClangBuiltLinux Clang 的使用
  • Neutron-clang 的编译说明
  • [内核向] 论如何优雅的刷入内核

到了这里,关于[Android]从零开始的内核编译的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ESP32 官方AT固件编译(从零开始环境搭建到编译完成全过程)

    https://download3.vmware.com/software/WKST-PLAYER-1702/VMware-player-full-17.0.2-21581411.exe https://releases.ubuntu.com/jammy/ubuntu-22.04.2-desktop-amd64.iso 可能需要进电脑的BIOS打开一个选项才能安装成功虚拟机 5.1 GIT 克隆 git clone --recursive https://github.com/espressif/esp-at.git 如果没有安装git,按照控制台的提示安

    2024年02月15日
    浏览(50)
  • 内核编译-Pixel 6设备Android 13系统编译gki内核并整合KernelSU

    为Pixel6编译内核,需要增加一些配置,和集成 KernelSU 。 vm Ubuntu 22.04 500g-24g内存 默认状态: 编译成功刷入真机后: 下载内核 以下操作前提:具备全球通上网 以下操作前提:具备全球通上网 以下操作前提:具备全球通上网 参考官方文档通用内核映像 (GKI) 发布 build | Android 开

    2024年02月16日
    浏览(46)
  • Android开发入门——从零开始构建第一个Android App

    作者:禅与计算机程序设计艺术 首先,让我们回顾一下Android系统的特性。Android是一个开源、免费的移动操作系统,最初起源于Google,后被开源。它提供统一的API,使得手机厂商可以针对不同版本的Android系统定制不同的应用。同时,Android也支持对设备硬件进行二次开发,可

    2024年02月07日
    浏览(57)
  • Android驱动开发之如何编译和更换内核

    编译内核可以使用图形化的界面配置,也可以直接使用脚本。在X86_64模拟器环境下,不用交叉编译,而交叉编译工具很容易出现兼容问题,一般也只能使用芯片厂商提供的工具,而不是GNU提供的工具。 android内核开发流程以及架构变化了很多,详情请看 内核官网 内核版本选择

    2024年04月26日
    浏览(30)
  • 从零开始的PICO教程(0) -- 教程大纲

    1、写这个教程的原因 第一个原因是,相关教程较少。搜了搜B站和各个搜索引擎,感觉PICO开发这类的教程还比较少,遂记录一下我的学习的过程,为VR生态建设提供一份自己的绵薄之力。 第二个原因就是比较私心咯,宣传宣传 深圳技术大学的元宇宙开发者协会 ,协会成立于

    2024年02月09日
    浏览(42)
  • 学习笔记 -- 从零开始学习Android Camera2 -- (1)

    学习一个框架,第一步学习肯定是照着代码看文档。 既然要看代码,就要看最权威的,这里我是代码是参照https://github.com/android/camera-samples android给的官方示例,结合官方文档https://developer.android.com/reference/android/hardware/camera2/package-summary来看,所以首先要先看一遍文档,然后重

    2024年02月03日
    浏览(48)
  • android10.0(Q)编译安卓内核(pixel 2)

    下载内核源码 1.查看内核版本 首先需要看一下内核的版本,可以在手机中看到内核版本 2.下载该内核版本对应的源码 执行结果如下: 这里的分支\\\"4fecde07e68d\\\"就是上面的手机截图中内核版本里g后面的数字 编译 3.安装libssl(不装编译的时候会报错) 执行结果如下: 4.去掉内核

    2024年02月08日
    浏览(37)
  • 编译安卓内核教程(2023,6,13)

    编译安卓内核前需要准备的东西。 一台支持解锁bootloader的手机 官方开源地址,或者第三方整合好的也行 一个linux环境,虚拟机、wsl、termux等都可以 看得懂中文 开始操作! 一、 从你的手机里面提取config.gz文件,在/proc/config.gz路径,这个文件是构建你手机内核的配置文件,这

    2024年02月14日
    浏览(33)
  • 从 0 开始编译 Android 系统源码

    在开始学习 Android Framework 的知识前,准备好相关的源码环境是非常有必要的。可以选择直接在 https://cs.android.com/ 网站在线看,但是跳转这些还是不如在 IDE 下来的方便。或者也可以下载好指定版本的源码,并通过 IDE 来查看,但是这样无法编译源码,所以也就无法修改源码后

    2024年02月06日
    浏览(48)
  • 小程序制作教程:从零开始搭建企业小程序

    在如今的数字化时代,企业介绍小程序成为了企业展示与推广的重要工具。通过企业介绍小程序,企业可以向用户展示自己的品牌形象、产品服务以及企业文化等内容,进而提高用户对企业的认知度和信任度。本文将介绍如何从零开始搭建一个企业介绍小程序。 首先,进入乔

    2024年02月12日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包