本来想超频自己的手机的,于是发现需要编译内核才能实现
作为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. MITOS|线粒体在线注释网站
  2. 5.数字拆分成4段,怎样使得4段的乘积最小【dp】
  3. netcore读取json文件_.Net Core如何读取Json配置文件
  4. 图论中的基础概念总结
  5. windos dos命令
  6. u盾 签名pdf显示 “签名于修订版中删除”_Adobe Acrobat Reader DC for mac(免费pdf阅读)...
  7. qt-opensource-windows-x86-vs2010-4.8.6 + qt-creator-windows-opensource-2.8.0
  8. ARM、DSP、FPGA的区别
  9. visualcreators.com公司产品过滤漏洞!
  10. 解决XCode运行app在模拟器上,提示模拟器不存在
  11. 食住玩|怎么下载安装VRAY渲染器最新版?
  12. 【Arduino】步进电机驱动程序Stepper_Motor_TB6600
  13. js设计模式的讲解与应用 - 【单例模式】
  14. [3维影像]360度杯子环绕拍摄
  15. 没有捷径!没有捷径!没有捷径!
  16. jQuery入门(一)--jQuery中的选择器
  17. 6-2 有序顺序表的插入
  18. Gradle sync failed: Could not find xxxx.xx 之 强制刷新Gradle dependencies
  19. binutils工具集——ld的用法
  20. [置顶] java-在非安全网络上建立可信任安全的通道(1/3)

热门文章

  1. python调用excel宏_用Python如何开发Excel宏脚本?新手必学
  2. java中兴参与实参的区别,中兴axon30和30pro区别 参数配置对比谁性价比更高
  3. 如何使html中disabled禁用消除
  4. pointnet实现
  5. mybatis逆向工程mbg.xml配置模板( MyBatis Generator)
  6. 注意啦,面试通过后,别忘了教师资格证认定
  7. Intellij IDEA 设置JDK1.8版本
  8. Mysql中key 、primary key 、unique key 与index区别
  9. python中的异常
  10. 计算机网络试题0994,2015计算机1级《MSOffice》考前押密试题汇总.doc