本来想超频自己的手机的,于是发现需要编译内核才能实现
作为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

Android 系统编译之内核编译相关推荐

  1. 【Android 系统开发】下载 编译 Android源代码 和 Android kernel源代码

    下载Android源码简要流程 : a. 获取repo文件: curl http://commondatastorage.googleapis.com/git-repo-downloads/repo ...

  2. 编译android 一加,手机内核编译教程(一加6安卓9为例实战)

    前人栽树后人乘凉- 1.同步代码啦 git clone https://github.com/flar2/OnePlus6.git -b ElementalX-3.00 2.交叉编译工具链下载 解压到 ...

  3. 在Ubuntu上为Android系统编写Linux内核驱动程序

    在智能手机时代,每个品牌的手机都有自己的个性特点.正是依靠这种与众不同的个性来吸引用户,营造品牌凝聚力和用户忠城度,典型的代表非iphone莫属了. 据统计,截止2011年5月,AppStore的应用 ...

  4. 在Ubuntu上为Android系统编写Linux内核驱动程序(学习老罗的)

    首先提出2个问题 1. 驱动程序的作用是什么? 答:驱动程序的作用主要是向上层提供访问设备寄存器的一个接口,包括读和写. 2. 访问设备驱动程序的方法? 答:a. 通过proc文件系统来访问:b. 通 ...

  5. 在Ubuntu上为Android系统编写Linux内核驱动程序 2

    如下书本参考:嵌入式Linux应用开发和Linux设备驱动程序. 在智能手机时代,每个品牌的手机都有自己的个性特点.正是依靠这种与众不同的个性来吸引用户,营造品牌凝聚力和用户忠城度,典型的代表非iph ...

  6. android驱动之旅-在Ubuntu上为Android系统编写Linux内核驱动程序(3)

    Android的硬件抽象层,简单来说,就是对Linux内核驱动程序的封装,向上提供接口,屏蔽低层的实现细节.也就是说,把对硬件的支持分成了两层,一层放在用户空间(User Space),一层放在内核空 ...

  7. 【1】在Ubuntu上为Android系统编写Linux内核驱动程序

    在智能手机时代,每个品牌的手机都有自己的个性特点.正是依靠这种与众不同的个性来吸引用户,营造品牌凝聚力和用户忠城度,典型的代表非iphone莫属了.据统计,截止2011年5月,AppStore的应用软 ...

  8. 为Android系统编写Linux内核驱动程序

    在智能手机时代,每个品牌的手机都有自己的个性特点.正是依靠这种与众不同的个性来吸引用户,营造品牌凝聚力和用户忠城度,典型的代表非iphone莫属了.据统计,截止2011年5月,AppStore的应用软 ...

  9. linux 内核编译速度,内核编译之后的运行速度

    shenhao0129 于 2010-10-24 13:26:20发表: 引用: 12# shenhao0129 这倒也是,在选的时候,很多都是凭感觉差不多选或者不选,的确没有从整个系统的角度来看,但 ...

最新文章

  1. python使用imbalanced-learn的SVMSMOTE方法进行上采样处理数据不平衡问题
  2. 22 岁专访库克、B 站 3 天涨粉百万,他将毕设树莓派扫描仪升级,繁星散落在校空!...
  3. 用Debug函数实现API函数的跟踪
  4. vlc的应用之二:vlc的ActiveX及cab
  5. 公告牌为什么有些是纸质,有些是电子的
  6. CVPR 2022|从原理和代码详解FAIR的惊艳之作:全新的纯卷积模型ConvNeXt
  7. LibreOJ - 3083 与或和(单调栈+位运算)
  8. 10g数据库入门与实践 oracle_从实践中学习Oracle SQL笔记一
  9. 在控制台中输出 出现SIGBAT或者EXC_BAD_ACCESS的原因的方法
  10. 自己帮别人写的网站可以公开源码吗_专注爬虫:20个精心总结爬虫项目,爬虫技术这里强(附源码)...
  11. WebAPI Action的几种返回值类型
  12. 存储过程之游标笔记小结
  13. 使用sync-request和cheerio写爬虫
  14. 【Hbase】HBase 更改表名
  15. 测试基础-01-软件测试的定义与分类
  16. 分别使用多线程\多进程\协程+paramiko在华为交换机批量快速进行配置(eNSP模拟器)
  17. java基础之继承(一)
  18. 查询字符串中子字符串所有出现位置
  19. HCP数据的下载,以及头动文件和CSF文件的所在位置
  20. 计算机平面设计培训学费,个旧计算机平面设计学校学费多少

热门文章

  1. 阿雪的学习记录|手动快速判断出栈顺序是否合法的万能方法
  2. 【Windows】共享文件夹:你的系统需要 SMB2 或更高版本
  3. 祛掉了满脸的油美媚才是真的美! 真的皮肤
  4. 部分mp4格式视频无法在ios系统播放
  5. Pytorch+CUDA安装方法步骤
  6. Cocos Creator JSZip压缩
  7. sql查询之聚合函数
  8. Google官网,Google android的产品线(important)
  9. 各种版本的称呼--例如Lite指精减版
  10. IDEA——最全配置