返回顶部
首页 > 资讯 > 精选 >[Android]从零开始的内核编译
  • 955
分享到

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

androidgit 2023-08-17 20:08:58 955人浏览 薄情痞子
摘要

从零开始的内核编译 本教程将基于小米 10S 的内核源码进行实例,其他型号的手机请自行寻找内核源码。具体内容可以参考我的内核编译项目。 手机型号查询 1. 获取设备(手机)代号 在安卓设备终端(adb shell)上执行: getpr

从零开始的内核编译

教程将基于小米 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_thymekernel_xiaomi_sm8250android_kernel_xiaomi_thymeandroid_kernel_xiaomi_sm8250

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

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

途径具体介绍
各厂商开源小米内核开源
华为开源代码
去手机社区找源码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=
检查更新./antman -U
检查更新和同步更新./antman -Uy
同步特定更新./antman -S=
删除同步构建./antman -D
显示有关同步构建的信息./antman -I
同步特定的工具链版本./antman -S=

如果需要更多细节介绍,请运行 ./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
  2. 开始编译内核 make

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

1. 设置编译链环境

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

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

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

2. 简易配置脚本

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

#!/bin/bashargs="-j$(nproc --all) \O=out \ARCH=arm64 \CROSS_COMPILE=aarch64-linux-gnu- \CC=clang \CROSS_COMPILE_COMPAT=arm-linux-gnueabi- "make ${args} 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_ARM32arm-linux-gnueabi-

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

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

3. 部分参考脚本

制作刷机包镜像

内核编译完成后的打包请参考文章[内核向] 论如何优雅的刷入内核,目前最流行的方法是使用 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://blog.csdn.net/qq_19577209/article/details/129637223

--结束END--

本文标题: [Android]从零开始的内核编译

本文链接: https://lsjlt.com/news/373275.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • [Android]从零开始的内核编译
    从零开始的内核编译 本教程将基于小米 10S 的内核源码进行实例,其他型号的手机请自行寻找内核源码。具体内容可以参考我的内核编译项目。 手机型号查询 1. 获取设备(手机)代号 在安卓设备终端(adb shell)上执行: getpr...
    99+
    2023-08-17
    android git
  • Photon物联网编程从零开始
    Christopher RushProgramming the Photon:Getting Started with the Internet of ThingsEISBN:978-0-07-184706-3Copyright © 201...
    99+
    2023-06-03
  • Kotlin Android(从零开始一个项目)
    Day 2 day1总结:我们完成了整体页面的搭建,并且搭建好了应用的底部选项卡。 day2目标:在底部选项卡切换的同时,完成上方页面的切换 开...
    99+
    2022-06-06
    Kotlin Android
  • Kotlin Android (从零开始一个项目)
    LoveDairy 在跟着黑马程序员的kotlin开发教程的项目(黑马外卖)学习中,突然想着一边跟着他的代码抄写运行,一边通过学习到的方法,从零...
    99+
    2022-06-06
    Kotlin Android
  • Android编程开发从零开始编写一个轻量级浏览器
    目录返回栈FragmentNavHostBinding搜索页面暂时放一个EditViewMultiStackParentFragment在里面实现添加窗口效果图既然是浏览器,按照国际...
    99+
    2024-04-02
  • 内核编译-Pixel 6设备Android 13系统编译gki内核并整合KernelSU
    背景 为Pixel6编译内核,需要增加一些配置,和集成KernelSU。 vm Ubuntu 22.04 500g-24g内存 默认状态: 编译成功刷入真机后: 下载内核 以下操作前提:具备全球通上网 以下操作前提:具备全球通上网...
    99+
    2023-08-17
    android ubuntu linux
  • 从零开始学android小示例程序
    布局文件 代码如下:<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/andr...
    99+
    2022-06-06
    程序 示例 Android
  • Android开发入门——从零开始构建第一个Android App
    作者:禅与计算机程序设计艺术 1.简介 首先,让我们回顾一下Android系统的特性。Android是一个开源、免费的移动操作系统,最初起源于Google,后被开源。它提供统一的API,使得手机厂商...
    99+
    2023-10-06
    自然语言处理 人工智能 语言模型 编程实践 开发语言 架构设计
  • 从零开始学Golang的接口
    目录前言1.为什么需要接口?2.接口是什么?如何定义?3.接口实战初体验4.如何测试是否已实现该接口?5.空接口&类型断言6.接口零值7.一个类型实现多个接口8.指针与值类型...
    99+
    2024-04-02
  • 从零开始的Python学习Episode
    一、输入与输出 1.输入 input("number:") num = input("number:") 下面一段可以把输入的信息存在num中。 注意:输入的信息会被认为是字符串,如果要输入数字进行运算要先把输入的信息进行强制类型转换...
    99+
    2023-01-30
    从零开始 Python Episode
  • JavaScript编程入门:从零开始的进阶之旅
    1. 认识JavaScript JavaScript是一门跨平台的、面向对象的脚本语言,它可以运行在任何支持JavaScript的浏览器中,也可以在Node.js等环境中运行。它是一种动态语言,这意味着它可以根据需要在运行时改变其行为。...
    99+
    2024-02-09
    JavaScript 入门 编程 语言 基础教程 代码 示例
  • linux编译内核的方法
    1、下载需要的内核版本 2、上传到操作系统 3、解压到/usr/src目录下 比如:3.19内核 tar -xvf linux-3.19.tar.xz -C /usr/src 4、创建连接 cd /usr/sr...
    99+
    2022-06-03
    linux 编译内核
  • Linux编译内核的过程
    本篇内容主要讲解“Linux编译内核的过程”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux编译内核的过程”吧!Linux编译内核 准备工作 通常要运行的第一个命令是: #cd /usr/...
    99+
    2023-06-13
  • 怎么从零开始编写Python爬虫脚本
    本篇内容介绍了“怎么从零开始编写Python爬虫脚本”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!0.准备工作需要准备的东西: Python...
    99+
    2023-06-03
  • 从零开始学习Java文件编程算法
    Java是一种广泛使用的编程语言,它被用于开发各种应用程序和软件。Java文件编程算法是Java编程语言的一部分,它允许您在Java程序中读取和写入文件。在本篇文章中,我们将,包括如何读取和写入文件,以及如何处理文件中的数据。 Java...
    99+
    2023-11-04
    文件 编程算法 对象
  • 从零开始学习golang编码转换方法
    从零开始学习Go语言的编码转换方法 随着信息技术的发展和普及,程序设计已经成为一个炙手可热的职业领域。而在程序设计中,经常需要进行不同字符编码之间的转换,比如将UTF-8编码的字符串转...
    99+
    2024-02-23
    学习 golang 转换 go语言 标准库
  • Linux内核编译与开发的示例分析
    这篇文章将为大家详细讲解有关Linux内核编译与开发的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一.Linux内核简介linux kernel map:linux 系统体系结构:linux k...
    99+
    2023-06-16
  • 从零开始学习Java和Unix Shell编程的笔记
    Java和Unix Shell编程是当今计算机领域中非常重要的两个编程语言。Java是一种跨平台的编程语言,可以用于开发各种类型的应用程序,从桌面应用程序到移动应用程序和Web应用程序。Unix Shell编程则是一种用于编写脚本的语言,...
    99+
    2023-09-12
    shell unix 学习笔记
  • android从零开始搭建程序的方法是什么
    Android从零开始搭建程序的方法可以分为以下几个步骤:1. 安装开发环境:安装JDK、Android Studio等开发工具。2...
    99+
    2023-06-14
    android从零开始 android
  • 从零开始创建自己的blogger
    今天就跟大家聊聊有关从零开始创建自己的blogger,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。www.minminmsn.com是否受够了各博客...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作