Android 系统编译之内核编译

本来想超频自己的手机的,于是发现需要编译内核才能实现
作为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
    Android 系统编译之内核编译_第1张图片

  • 解释 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

编译通过如下
Android 系统编译之内核编译_第2张图片

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

Android 系统编译之内核编译_第3张图片

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系统编译开发)