Android 系统编译之内核编译

2023-10-29

本来想超频自己的手机的,于是发现需要编译内核才能实现
作为Android开发者的我 没有任何内核编译经验,只是想试一下, 于是折腾了两天终于把内核成功编译出来了 现在分享下学习经验
我的是小米手机,其实我看了一下github, 其他手机的内核开源的目录结构几乎是一样的,所以应该是同一种编译方式
编译内核的时候 各种error 真的是无奈+心累…
无数次想决定放弃了…但是还是坚持了下来…

不多说了 直接开始:

1.下载内核

在github 或 论坛上找到你的手机的内核源码开源地址 并下载下来
比如我的小米NotePro的 有5.0内核 和 7.0内核 ,我下载了7.0, 点右边的链接进去 该分支
小米内核开源地址:
https://github.com/MiCode/Xiaomi_Kernel_OpenSource

这里写图片描述

把该分支的源码下载下来, 到这里有的人是用 git命令下载, 我是vmware 运行的 ubuntu 比较方便 ,就不使用git了 直接在win下用迅雷下载 源码然后丢进去虚拟机里, 还能更快, 为啥要多折腾呢

2.下载交叉编译链

https://bitbucket.org/jonascardoso/toolchain_aarch64_travis/downloads/

3.搭建linux环境

搭建环境就不废话了,如果已经有 可以尝试跳过, 参考我另一个帖子,装我帖子里的那个 ubuntu, 里面有下载地址
https://blog.csdn.net/u014418171/article/details/53302984
##4.编译
在ubuntu下
复制win下的刚才下载的那两个 内核源码zip 和 交叉编译链zip文件 到 ubuntu 桌面下 (直接鼠标拖进去)
检查文件字节大小和win下的是否一致 是否损坏

先设置ubuntu默认文件权限
执行
umask 002
可选, 只是为了确保等会编译创建文件的可读可写的权限

然后解压zip:

cd 桌面/
unzip 你的内核源码文件名.zip
unzip 交叉编译链文件名.zip

解压完成后 文件夹名称有点长我分别改成了 Kernel 和 Toolchain

打开终端, 输入 sudo gedit /etc/profile 在末尾添加环境变量

export ANDROID_AARCH64=/home/ubuntu/桌面/Toolchain/google_gcc/aarch64-linux-android-4.9/bin/
export ARCH=arm64
export SUBARCH=arm64
export PATH=$PATH:$ANDROID_AARCH64
export CROSS_COMPILE=aarch64-linux-android-

保存,关闭文本编辑器
终端, 输入

source /etc/profile && . /etc/profile

以使其生效

网上文章都是直接开始编译了, 反正我直接make 是不行的 需要重新指定 O=输出目录 才正常 否则编译过程中会报错 无法生成image.gz.dtb 文件 之类的错误

指定make 目录终端输入如下命令进行生成 .config 文件

cd Kernel
mkdir output
make O=output leo_user_defconfig
cd output
make O=output
  • 解释: make O=output leo_user_defconfig 输入后
    如图 输出了.config文件 在/Kernel/output/下, 如果看不见请设置文件夹管理器 选择 [显示隐藏文件], 或终端 ls -a
    这里写图片描述

  • 解释 leo_user_defconfig 是什么鬼 从哪里来?
    这个文件 在 桌面/Kernel/arch/arm64/configs/ 下, 里面可能有很多手机代号, 你可以查看你的手机的内核信息, 或者 手机的 system/build.prop里有你的代号
    leo_user_defconfig 其中的 leo 就是代表的 小米NotePro ,网上很多文章都是说 make msmxxx_defconfig
    …我不太清楚,具体可能要多编译几个 看看哪个正常 , 反正我认为 就是 “代号_user_defconfig” 这样的格式, 不过这只对于小米是这样,其他手机好像是不带 user 直接 代号_defconfig, 或者是什么都没有 就只有cpu型号 那么你只能选择 msmXXXX_defconfig 进行编译. (如果此处有什么误解 望指出)

  • 解释make O=output 代表重定向输出目录, 并且开始编译 , 也可以使用 make -j3 O=output, j3代表 系统的cpu数量+1, 双核则 -j3

编译通过如下
这里写图片描述

最后 Image.gz-dtb 等文件生成在
Kernel/output/arch/arm64/boot/ 下

这里写图片描述

4.使用

在win下, 使用 Android Image Kitchen (软件请百度,注意分6.x 7.x 8.x 可用版本)
先取出你的手机ROM中的 boot.img 拖到unpackimg.bat去解包, 然后把image.gz-dtb 该文件替换掉原本的内核文件 split_img/boot.img-zImage
然后执行repackimg.bat 得到 image-new.img
执行如下命令 刷入

adb reboot bootloader && fastboot flash boot C:\你的路径\image-new.img  && fastboot reboot

前提是 你刷入的rom正好是 刚才取出boot.img的那个. 否则可能无法正常开机
或者直接把原本的rom中的boot.img替换成编译好的boot.img 再 从recovery双清刷入

如有其他问题 请指出,共同学习… 至此 编译内核教程已完成

注意事项:

虽然编译操作 不难,但是最浪费时间的就是编译时的各种错误 ,而且网上还找不到? 而且还谷歌不到… 尽管还找到和你一样的问题却没人回答… 绝望, 现在我来说一下需要注意的地方

  • 注意文件权限 最好每解压一次zip 之后 都需要批量修改文件夹权限
    如: sudo chmod -R 777 文件夹

  • 如果编译报错提示出现找不到头文件 < xxx.h > 请改成引号 “xxx.h”

  • 如果编译报错提示 错失 或 无法生成 image.gz.dtb , 那就要注意了 需要指定O=output ,并且 找到根目录 Kernel.下的 .config文件 删掉 , 找到 include/下的 config文件夹 删掉 (包括文件夹) 这玩意浪费了我很多时间 差点放弃

  • 注意环境变量配置 ,如果按我做的还是出现错误,请 把对应的内核文件夹和编译链文件夹 移动到 /桌面/的上一级 , 意思就是 这些文件放不在桌面进行编译, 而是放在别的 地方, 可能中文的 '桌面’二字会 影响编译, 还有我曾经一度怀疑 小米开源的内核是不完整的, 最后发现不是. 所以请先相信小米.

  • 请在每次出现错误之后 修改完错误后 想要重新编译时 请先执行 make clean 一下, 删除上次的文件 以免影响本次编译
    ,甚至 多次无果时 你可尝试 删掉按本教程重来. 多试几次

  • 注意手机代号对应的 xxx_user_defconfig, 没有才选 cpu代号_defconfig, 或者看看你的手机有没有人发贴 看别人怎么弄

其他

学习时看过的文章或问题帖:
https://blog.csdn.net/u014418171/article/details/53303652

https://source.android.com/setup/build/building-kernels
http://www.myzte.cn/thread-269414-1-1.html
https://bbs.nubia.cn/thread-562929-1-1.html
https://github.com/LineageOS/android_kernel_sony_msm8994/blob/cm-14.1/README_Xperia
https://www.cnblogs.com/zifeiniu/p/9233123.html
https://blog.csdn.net/u013541140/article/details/52717536?locationNum=14&fps=1
https://blog.csdn.net/Qidi_Huang/article/details/53031488
https://www.v2ex.com/t/355256
https://source.android.com/source/building-kernels
https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9
https://forum.smartron.com/t/missing-file-in-kernel-source/2822/15
https://forum.xda-developers.com/redmi-note-3/help/compiling-kernel-t3420362
https://github.com/OnePlusOSS/android_kernel_oneplus_msm8998/issues/6
https://forum.xda-developers.com/redmi-note-3/help/compiling-kernel-t3420362
https://forum.xda-developers.com/nexus-9/development/dev-aosp-based-rom-development-thread-t2995510/page5
https://github.com/MiCode/Xiaomi_Kernel_OpenSource/issues/70
http://itspace.iteye.com/blog/2350847
https://github.com/OnePlusOSS/android_kernel_oneplus_sdm845/issues/1

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 系统编译之内核编译 的相关文章

  • 多核处理器下的快速包处理软件架构FastGate

    FastGate主要的目标是帮助用户缩短研发周期 保护已有的代码 快速开发和灵活部署自己的业务 用户无需关注多核处理器的硬件细节 无需关注性能和扩展性 只需专注于自身功能模块的开发 然后通过和FastGate框架的无缝集成便可以快速形成自己
  • Kconfig内容(详细)总结附示例快速掌握

    目录 一 简介 二 内容解析 2 1 menuconfig 2 2 choice endchoice 2 3 comment 2 4 menu endmunu 2 5 if endif 2 6 source 2 7 mainmenu 2 8
  • 联想小新Pro14安装Ubuntu后无法进入系统、亮度无法调节、蓝牙无法打开、输入卡顿延迟等问题的解决办法

    联想小新Pro14安装Ubuntu后无法进入系统 亮度无法调节 蓝牙无法打开等问题的解决办法 前言 月初买了台联想小新Pro14 AMD锐龙5800H版本 在安装Ubuntu 20 04 2 LTS 系统时遇到了一些问题 所幸在众多网友前辈
  • 操作系统课程设计3_系统调用

    一 实验目的 1 学习怎样重新编译 Linux 内核 2 理解 掌握 Linux 标准内核和发行版本内核的区别 二 实验内容 1 通过重新编译Linux来实现系统调用 2 通过增加模块来实现系统调用 三 实验步骤和结果 一 通过重新编译内核
  • 【Linux】imx6ull Kernel 源码下载和编译环境配置

    文章目录 1 获取 ARM 官方交叉编译工具链 2 在IMX官网下载IMX6ULL相关资料 3 下载源码和编译kernel 4 编译验证kernel 5 相关文章 1 获取 ARM 官方交叉编译工具链 在ubuntu linux环境下编译i
  • Linux用户空间和内核空间的内存互访

    Linux用户空间和内核空间的内存互访 标签 虚拟内存 安全性 Linux 用户 2012 11 13 15 55 Linux 内存 在 Linux 中 用户内存和内核内存是独立的 在各自的地址空间实现 地址空间是虚拟的 就是说地址是从物理
  • 还不会部署高可用的kubernetes集群?企业DevOps实践之使用kubeadm方式安装高可用k8s集群v1.23.7...

    关注 WeiyiGeek 公众号 设为 特别关注 每天带你玩转网络安全运维 应用开发 物联网IOT学习 原文地址 还不会部署高可用的kubernetes集群 企业DevOps实践之使用kubeadm方式安装高可用k8s集群v1 23 7 本
  • 进程管理(十三)---进程调度基本原理

    1 为什么需要调度 进程调度的概念比较简单 我们假设在一个单核处理器的系统中 同一时刻只有一个进程可以拥有处理器资源 那么其他的进程只能在就绪队列中等待 等到处理器空闲之后才有计划获得处理器资源来运行 在这种场景下 操作系统就需要从众多的就
  • 片内外设、片上外设和片外外设的区别

    片内外设就是片上外设 同一种意思不同说法而已 片内外设和片外外设的区别 片内 外设是两个概念 片内指做成芯片的集成电路内部 简称片内 片外同理显而易见 外设是外部设备的简称 是指集成电路芯片外部的设备 集成电路芯片与外部设备的连接一般需要专
  • Source Insight给Linux内核创建工程

    所有文档请关注公众号 一口Linux 后台回复 ubuntu linux驱动视频同步更新到 https live bilibili com 22719960 一 Source Insight安装 1 预先准备好 Source Insight
  • Linux的IO端口和IO内存

    Linux的IO端口和IO内存 分类 linux编程 2011 01 14 13 22 866人阅读 评论 1 收藏 举报 io linux linux内核 struct 平台 x86 CPU对外设端口物理地址的编址方式有两种 一种是IO映
  • Linux-DM9000C网卡移植(详解)

    上一节 我们学习了 网卡驱动介绍以及制作虚拟网卡驱动 http www cnblogs com lifexy p 7763352 html 接下来本节 学习网卡芯片DM9000C 如何编写移植DM9000C网卡驱动程序 1 首先来看DM90
  • Kbuild系统源码分析(五)—模块的编译流程

    版权声明 本文为CSDN博主 ashimida 的原创文章 遵循CC 4 0 BY SA版权协议 转载请附上原文出处链接及本声明 原文链接 https blog csdn net lidan113lidan article details
  • uboot以tag方式给内核传参

    1 tag方式传参 1 struct tag tag是一个数据结构 在uboot和linux kernel中都有定义tag数据机构 而且定义是一样的 2 tag header和tag xxx tag header中有这个tag的size和类
  • Unix网络编程5种IO模型

    IO模型 用一幅图表示所支持的I O模型 纵向维度是 阻塞 Blocking 非阻塞 Non blocking 横向维度是 同步 异步 总结起来是四种模型 同步阻塞 同步非阻塞 异步阻塞 异步非阻塞 Unix网络编程 中划分出了 第五种 模
  • F2FS – A New Flash File System for Mobile Devices – ELCE 2012

    本文转载至 http www cnx software com 2013 01 15 f2fs a new flash file system for mobile devices elce 2012 Joo Young Hwang pri
  • printk函数的用法

    printk在内核源码中用来记录日志信息的函数 只能在内核源码范围内使用 用法和printf非常相似 printk函数主要做两件事情 第一件就是将信息记录到log中 而第二件事就是调用控制台驱动来将信息输出 1 日志级别 printk相比p
  • Linux驱动开发入门(二)VS code驱动开发配置

    开发环境配置 安装 配置 安装 VS code是一款功能强大的开源编辑器 能够在各个平台安装使用 如Linux Widows Mac 而我们Linux驱动直接运行在Linux上 所以下载安装在Linux平台 示例机系统为Ubuntu 20
  • 字符设备驱动相关函数

    Linux内核中 a 使用cdev结构体来描述字符设备 b 通过其成员dev t来定义设备号 分为主 次设备号 以确定字符设备的唯一性 c 通过其成员file operations来定义字符设备驱动提供给VFS的接口函数 如常见的open
  • Linux源码编译开启cgroup blk限制io性能

    编译选项 内核5 9 General Setup gt Control Group support gt io controller Enable the block layer gt Block layer bio throttling

随机推荐

  • spring 和springboot 整合rabbitmq

    文章目录 spring springboot整合 rabbitmq 4 1 spring 整合rabbitmq 4 2 springboot 整合rabbitmq spring springboot整合 rabbitmq rabbitmq
  • Java文档注释

    Java文档注释 Doc umentation Comments 注意不要将注解 Annotation 与注释 Comments 混淆 Java的有三种注释 1 单行注释 注释内容 2 多行注释 注释内容 3 文档注释 注释内容 Java文
  • vue z-index层级显示问题

    一个单页面 顶部有fixed的nav 当向上滑动页面时 发现nav里有的组件被下放的组件遮盖 第一时间明白这时需要修改层级设置 将下方的组件z index设为 1 nav的组件z index调高 发现还是有各种遮盖的问题 然后花了点时间找资
  • linux查看某个应用占用多少线程

    以tomcat为例 获取tomcat进程pid ps ef grep tomcat 10090 统计该tomcat进程内的线程个数 ps Lf 10090 wc l 数量就是该tomcat启动了多少线程
  • java异常(机制和捕捉(常见异常类))详解 +练习题

    Java 中的异常处理机制 1 什么是异常 异常 程序在运行过程中产生的不正常情况 程序在运行的时候 发生了一些不被预期的事件 从而没有按照我们编写的代码执行 这就是异常 异常是Java中的错误 但是并不是所有的错误都是异常 比如说 你在定
  • zookeeper的动态扩容

    附属意义的扩容 扩容的新增节点为观察者observer 1 观察者概念 a 在zookeeper引入此新的zookeeper节点类型为observer 是为了帮助处理投票成本随着追随者增加而增加的问题并且进一步完善了zookeeper的可扩
  • 研一寒假C++复习笔记--运算符重载实例

    目录 1 运算符重载 2 加号运算符重载 3 左移运算符重载 lt lt 4 递增运算符重载 5 赋值运算符重载 6 关系运算符重载 7 函数调用运算符重载 1 运算符重载 对已有运算符重新进行定义 赋予其另一种功能 以适应不同的数据类型
  • 数组扁平化flat方法的多种实现

    let arr 1 2 3 4 5 6 7 8 9 10 11 12 1 flat console log arr flat Infinity 2 toString console log arr toString split map it
  • puppet配置

    作为重量级批量自动化运维利器 puppet可以方便大批量停止或启动服务 比如我们经常需在一下停止几十台 mysql服务器 使用puppet配置分分钟搞定 而不需要一台台去手动停止 非常方便 确认服务器端和客户端正常工作 开始编写module
  • LaTeX出现图片错误代码:Paragraph ended before \Gin@iii was complete.

    问题 LaTeX出现图片错误代码 Paragraph ended before Gin iii was complete 答案 将导言区的 usepackage graphics 替换为 usepackage graphicx
  • node.js中res.writeHead的用法总结

    向请求的客户端发送响应头 该函数在一个请求内最多只能调用一次 如果不调用 则会自动生成一个响应头 因为实际开发中 我们需要返回对应的中文以及对应的的文本格式 所以我们需要设置对应的响应头 响应头决定了对应的返回数据的格式以及编码格式 使用方
  • 机器学习实战第十章 k均值聚类

    k均值聚类 文章目录 k均值聚类 什么是k均值聚类 具体实现 二分k均值聚类 实验 小结 什么是k均值聚类 试想一下 如果给一张图如下 要求对这张图中的点分类 你会怎么进行呢 我们当然可以认为所有的点都只有一个种类 毕竟他们本身只有坐标不同
  • 2023华为OD机试真题【数组合并】

    题目内容 现在有多组整数数组 需要将他们合并成一个新的数组 合并规则 从每个数组里按顺序取出固定长度的内容合并到新的数组中 取完的内容会删除掉 如果该行不足固定长度或者已经为空 则直接取出剩余部分的内容放到新的数组中 继续下一行 如样例1
  • 数据挖掘中常用的数据清洗方法

    在数据挖掘过程中 数据清洗主要根据探索性分析后得到的一些结论入手 然后主要对四类异常数据进行处理 分别是缺失值 missing value 异常值 离群点 去重处理 Duplicate Data 以及噪音数据的处理 1 探索性分析 探索性分
  • windows 设置exe文件开机自启动

    设置本地exe服务文件开机自启动 编辑up bat 内容如下 注意 binPath 后面必须有一个空格 echo off sc create Test binPath C Users test exe start auto start C
  • SUSAN边缘检测

    核同值区 USAN 相对于模板的核 模板中总有一定的区域与它有相同的灰度 这部分区域称为USAN区域 当核像素处在图像中的灰度一致区域 USAN的面积最大 当核处在直边缘处面积约为最大值的一半 当核处在角点处时则为最大值的1 4 因此 使用
  • 洛谷 P1009 [NOIP1998 普及组] 阶乘之和

    题目链接 https www luogu com cn problem P1009 思路 计算阶乘相当于大整数 1 1 1 依次乘以 1 n 1 sim n
  • unity日记4(鼠标键盘交互、实例)

    目录 鼠标事件 鼠标点击 抬起 长按事件 键盘事件 键盘点击 抬起 长按事件 键盘键位替换 实例 鼠标 音乐播放 暂停 实例 调用其他对象的组件 双方法 实例 调整其他对象的公有参数 鼠标事件 鼠标点击 抬起 长按事件 左键0 右键1 中键
  • pytorch学习笔记 —— torch.nn.LSTM

    使用 torch nn LSTM 可以方便的构建 LSTM 不熟悉 LSTM 的可以先看这两篇文章 RNN https blog csdn net yizhishuixiong article details 105588233 LSTM
  • Android 系统编译之内核编译

    本来想超频自己的手机的 于是发现需要编译内核才能实现 作为Android开发者的我 没有任何内核编译经验 只是想试一下 于是折腾了两天终于把内核成功编译出来了 现在分享下学习经验 我的是小米手机 其实我看了一下github 其他手机的内核开