[原创]nexus5内核编译烧录过程记录

疾风剑 疾风剑     2022-09-01     358

关键词:

        参考Android系统源代码情况分析第二章进行实践,为了提高效率,也为了增加实践机会,使用Nexus5进行内核编译。需要说明的是,Android源代码工程默认是不包含它所使用的Linux内核源码,如果需要运行定制的Linux内核,就要单独下载内核源码,并且对它进行编译。Nexus Android源码的编译参考

1、下载nexus5 对应的内核源码

     Android系统使用的是Linux内核,但与主线分枝的Linux内核又有一些差异,各个不同的厂商又有自己的修改。内核源码位于谷歌境外服务器,不FQ无法访问,这给同步源码造成很大的不便。幸好清华大学的开源服务器上也同步了AOSP内核的源码,使得我们无须FQ就可以同步源码。

   映射关系如下:

名称     Google GIT地址     清华服务器地址
common     https://android.googlesource.com/kernel/common.git     https://aosp.tuna.tsinghua.edu.cn/kernel/common.git
exynos     https://android.googlesource.com/kernel/exynos.git     https://aosp.tuna.tsinghua.edu.cn/kernel/exynos.git
goldfish     https://android.googlesource.com/kernel/goldfish.git     https://aosp.tuna.tsinghua.edu.cn/kernel/goldfish.git
hikey-linaro     https://android.googlesource.com/kernel/hikey-linaro     https://aosp.tuna.tsinghua.edu.cn/kernel/hikey-linaro.git
lk         https://aosp.tuna.tsinghua.edu.cn/kernel/lk.git
msm     https://android.googlesource.com/kernel/msm.git     https://aosp.tuna.tsinghua.edu.cn/kernel/msm.git
omap     https://android.googlesource.com/kernel/omap.git     https://aosp.tuna.tsinghua.edu.cn/kernel/omap.git
samsung     https://android.googlesource.com/kernel/samsung.git     https://aosp.tuna.tsinghua.edu.cn/kernel/samsung.git
tegra     https://android.googlesource.com/kernel/tegra.git     https://aosp.tuna.tsinghua.edu.cn/kernel/tegra.git
x86_64     https://android.googlesource.com/kernel/x86_64.git     https://aosp.tuna.tsinghua.edu.cn/kernel/x86_64.git

由于nexus5使用的是高通处理器,所以直接同步msm的链接

ninjame@ubuntu1604:~/aosp$ mkdir kernel
ninjame@ubuntu1604:~/aosp$ cd kernel
ninjame@ubuntu1604:~/aosp/kernel$ git clone https://aosp.tuna.tsinghua.edu.cn/kernel/msm.git

git branch 查看Android内核源码的代码版本分支

 

ninjame@ubuntu1604:~/aosp/kernel/msm$ git branch -a
* (头指针分离于 7717f76)
  master
  remotes/origin/HEAD -> origin/master
  remotes/origin/android-4.4
  remotes/origin/android-4.4.y
……
  remotes/origin/android-msm-hammerhead-3.4-kitkat-mr1
  remotes/origin/android-msm-hammerhead-3.4-kitkat-mr2
  remotes/origin/android-msm-hammerhead-3.4-kk-fr1
  remotes/origin/android-msm-hammerhead-3.4-kk-fr2
  remotes/origin/android-msm-hammerhead-3.4-kk-r1
  remotes/origin/android-msm-hammerhead-3.4-l-preview
  remotes/origin/android-msm-hammerhead-3.4-lollipop-mr1
  remotes/origin/android-msm-hammerhead-3.4-lollipop-mr1.1
  remotes/origin/android-msm-hammerhead-3.4-lollipop-release
  remotes/origin/android-msm-hammerhead-3.4-m-preview
  remotes/origin/android-msm-hammerhead-3.4-marshmallow
  remotes/origin/android-msm-hammerhead-3.4-marshmallow-mr1
  remotes/origin/android-msm-hammerhead-3.4-marshmallow-mr2
  remotes/origin/android-msm-hammerhead-3.4-marshmallow-mr3
……

 

和nexus5 相关的且是adnoid6.0 版本的内核分支共有4个,到底checkout哪个分支呢?对于Android的源码与Android内核源码版本的对应关系,很难说得清楚。经过摸索,找到一种比较讨巧的方法,直接进入手机设置,查看关于手机

 

内核版本是3.4.0-g7717f76

ninjame@ubuntu1604:~/aosp/kernel/msm$ git checkout 3.4.0-g7717f76

当发现真的把相应分支源码的源码给同步过来,竟然有种意外的惊喜,这是怎么回事呢?

ninjame@ubuntu1604:~/aosp/kernel/msm$ git branch -r --contains 7717f769b2d0bf26db19598d8826a01b82ab6540
  origin/android-msm-hammerhead-3.4-marshmallow-mr1
  origin/android-msm-hammerhead-3.4-marshmallow-mr2
  origin/android-msm-hammerhead-3.4-marshmallow-mr3

7717f76对应着源码中的一个commit节点,可以看做是git库上最小的分支(分支都是从commit节点拉出来的,那么每一个节点都可以看做一个分支,当然某些分支中只包含它自己)

3.4.0-g7717f76  就可以解读为该内核版本大的分支为linux3.4.0,具体的源码对应于commit节点为7717f76 那一次提交代码对应的快照。

下载部分参考博客:

http://blog.csdn.net/sunao2002002/article/details/53057374

http://blog.csdn.net/qq1084283172/article/details/54880488

 

2、配置编译环境

由于是在 Linux / Mac OS X 上进行编译,所以交叉编译的环境变量是必须要设置的,一共涉及到三个。

首先设定 ARCH,–注意,由于 Nexus 5 是32位架构,所以取值为 arm,如果是64位,则要取值为 arm64

export ARCH=arm

然后设定 CROSS_COMPILE,同上,64位要取值 aach64-linux-android-

export CROSS_COMPILE=arm-eabi-

对应地,告诉编译系统到哪里寻找编译器

export PATH=$PATH:/home/ninjame/aosp/prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin

 3、编译

开始编译之前,不要着急开始,先使用 help 看有哪些预定义好的配置

make help

从上面可以找到 hammerhead_defconfig,这正是 Nexus 5 的默认配置

make hammerhead_defconfig

上述就是生成配置,如果需要调整,则可以继续执行

make menuconfig

最后执行编译吧

make

成功编译后,可以看到类似如下的输出:
OBJCOPY arch/arm/boot/zImage
  Kernel: arch/arm/boot/zImage is ready
  DTC     arch/arm/boot/msm8974-hammerhead-rev-11.dtb
  DTC     arch/arm/boot/msm8974-hammerhead-rev-11j.dtb
  DTC     arch/arm/boot/msm8974-hammerhead-rev-10.dtb
  DTC     arch/arm/boot/msm8974-hammerhead-rev-c.dtb
  DTC     arch/arm/boot/msm8974-hammerhead-rev-b.dtb
  DTC     arch/arm/boot/msm8974-hammerhead-rev-bn.dtb
  DTC     arch/arm/boot/msm8974-hammerhead-rev-a.dtb
  DTC     arch/arm/boot/msm8974-hammerhead-rev-f.dtb
  CAT     arch/arm/boot/zImage-dtb
  Kernel: arch/arm/boot/zImage-dtb is ready
make[1]: Nothing to be done for 'arch/arm/boot/dtbs'.
编译碰到的问题;

 

问题1:
File "/home/ninjame/aosp/kernel/msm/scripts/gcc-wrapper.py", line 55
    print "error, forbidden warning:", m.group(2)

解决:由于本人把机器上的python给改成3.5了,不支持这种print语法
sudo rm /usr/bin/python,删除
sudo ln -s /usr/bin/python2.7 /usr/bin/python,默认设置成python2.7

这样在终端中输入python默认就是 2.7版本了
指定ubuntu下的Python的运行版本 
问题2:  
CHK     include/linux/version.h
  CHK     include/generated/utsrelease.h
make[1]: 'include/generated/mach-types.h' is up to date.
  CC      kernel/bounds.s
arm-eabi-gcc: No such file or directory
Is your PATH set correctly?
/home/ninjame/aosp/kernel/msm/./Kbuild:35: recipe for target 'kernel/bounds.s' failed
make[1]: *** [kernel/bounds.s] Error 2
Makefile:993: recipe for target 'prepare0' failed
make: *** [prepare0] Error 2
解决:环境变量没设置好,最开始设置成了
export PATH=$PATH:/home/ninjame/aosp/prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/arm-eabi/bin
提示再明显不过了
ninjame@ubuntu1604:~/aosp/prebuilts$ find -name "arm-eabi-gcc"
./gcc/darwin-x86/arm/arm-eabi-4.8/bin/arm-eabi-gcc
./gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi-gcc

问题3:
Can't use 'defined(@array)' (Maybe you should just omit the defined()?) at kernel/timeconst.pl line 373.
/home/ninjame/aosp/kernel/msm/kernel/Makefile:129: recipe for target 'kernel/timeconst.h' failed
make[1]: *** [kernel/timeconst.h] Error 255
Makefile:953: recipe for target 'kernel' failed
make: *** [kernel] Error 2
解决:
其实,提示的错误信息已经明确告诉你了,你应该省略defined() 。打开 kernel/timeconst.pl
将if (defined(@val)) 改为if (@val),再次编译就可以通过
参考博客:
http://doc.okbase.net/JonnyLulu/archive/123308.html

4、刷新内核

进入到了 Android 源代码目录,设置环境变量,告知已编译好的新内核地址

ninjame@ubuntu1604:~/aosp/kernel/msm$ cd arch/arm/boot/
ninjame@ubuntu1604:~/aosp/kernel/msm/arch/arm/boot$ ls -l zImage-dtb
-rw-rw-r-- 1 ninjame ninjame 8441144 5月  23 00:27 zImage-dtb
ninjame@ubuntu1604:~/aosp/kernel/msm/arch/arm/boot$ pwd
/home/ninjame/aosp/kernel/msm/arch/arm/boot

export TARGET_PREBUILT_KERNEL=/home/ninjame/aosp/kernel/msm/arch/arm/boot/zImage-dtb

重新编译bootimage

make bootimage

成功后,若有类似如下的输出:

Copy: out/target/product/hammerhead/kernel
Target boot image: out/target/product/hammerhead/boot.img
out/target/product/hammerhead/boot.img maxsize=23519232 blocksize=135168 total=9369600 reserve=270336

#### make completed successfully (03:29 (mm:ss)) ####

重启手机进入bootloader模式

adb reboot bootloader

刷入内核

fastboot flash boot boot.img

重启手机

fastboot reboot

~晒图,换上自己的签名了,哈哈~   ,不过g4ad03fa 打脸了。。。

参考博客:

http://ju.outofmemory.cn/entry/253033

[原创]nexus5源码下载编译真机烧录过程记录

asop使用清华镜像源https://mirror.tuna.tsinghua.edu.cn/help/AOSP/一开始使用每月初始化包的方式因为无法搞定版本的问题,没能通过编译,无奈,老老实实一点点下载吧1、源码下载mkdiraospcdaosprepoinit-uhttps://aosp.tuna.tsinghua.edu.cn/platform/manifes... 查看详情

android内核编译过程记录(代码片段)

下载内核源码和交叉编译链交叉编译链我用的https://aosp.tuna.tsinghua.edu.cn/platform/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.9设置交叉编译链前缀exportCROSS_COMPILE=$(pwd)/bin/<toolchain_prefix>-例如:exportCROSS_COMP 查看详情

树莓派linux内核配置编译以及烧录详细步骤(代码片段)

目录一、内核配置第一种方式:(cp厂家.config.config)第二种方式(makemenuconfig一项项配置,通常是基于厂家的config来配置)二、内核编译三、烧录1、创建两个文件夹2、挂载u盘3、安装modules4、安装更新kernel... 查看详情

[原创]nexus5移植onestep

OneStep简介 https://github.com/SmartisanTech/android OneStep涉及的工程列表:frameworks_base(需要更改WindowManager) https://github.com/SmartisanTech/android_frameworks_baseframeworks_native(需要更改input, 查看详情

nexus5/6刷lineageos过程

如题,好久没刷机,体验下lineageos 由于之前Xposed官方一直没支持7.x,就没更新测试三方Xposed正常使用,记录下过程供参考注意,刷机有风险,刷机前备份,可以使用钛备份0x01:刷机环境/准备  1).lineageos支持设备,此处使用Ne... 查看详情

repo版本切换

...后,相当于下载了全部的分支,本想编译源码烧录到手机Nexus5,编译时才发现找不到aosp_hammerhead_userdebug,毕竟nexus5明确不支持android-7.0那么如何切换成自己 查看详情

重新记录licheezero开启ap模式

...要用dock的dtb(或者自己改一下非dock版重新编译 linux内核和r8723bs.ko版本:4.14 (随便编译一个   固件:(因为比较小 包含apt  准备好了,就开始烧录固件,minmin_dd.dd替换linux内核,dtb,把r8723bs.ko文件... 查看详情

实验笔记之——单片机烧录的实验过程

...人学习记录用,不作任何商业用途。目录IDE安装STM32烧录步骤51烧录步骤IDE安装keil4和keil5的安装包和软件,51用keil4写程序,stm32用keil5写程序。keil4的处理方法   安装KeilC51V8.16版本&#x 查看详情

stm32mp157使用记录:openstlinux试用与开发体验(代码片段)

...统镜像烧录测试STM32CubeProgrammer安装系统镜像烧录应用与内核开发SDK安装应用开发内核编译内核修改测试前言STM32MP1是意法半导体推出的第一款MPU,它家的STM32系列MCU搞的不错,资料什么挺多,所以平时用的也蛮多,... 查看详情

wrk内核编译调试环境搭建

阅读WRK源码,可以更深入的理解Windows内核原理。现将它的编译调试过程记录下来。 (一)准备工具:WRK-v1.2-kernel源码WindowsServer2003SP1(32位)镜像,网址:https://msdn.itellyou.cn/VMWareWorkStation8最新的Windbg,网址:http://www.windbg.org... 查看详情

centos7编译4.7.2内核

由于想要编译kvm-kmod,编译的时候提示内核版本太低,所以就不得不升级下linux内核,目前最新版内核是4.7.2,编译内核并不是一件很难的事,但是这么久没编译过,还是有必要记录下这一过程。首先下载linux内核最新版4.7.2 ht... 查看详情

新唐nuc980使用记录:u-boot&linux编译与烧录(基于sd1位置sd卡)(代码片段)

文章目录目的SD卡分区U-Boot编译U-Boot环境变量Linux编译默认设置使用SD卡剩余分区使用SD卡分区存放rootfs总结目的这篇文章中将测试在NUC980中运行Linux系统(基于SD1位置SD卡)。本文相关的开发环境准备请查看下面这篇文章&#... 查看详情

问题排查低版本内核驱动移植到高版本内核中编译报错,部分编译异常记录及解决

摘要:将klsp移植到高版本内核中编译时,有可能会遇到一些编译报错。原因一部分是因为新版本的内核加入了更多的代码检测,或者是打开了更多的代码检测选项,将以前的warning视为了error,还有可能是因为... 查看详情

新唐nuc980使用记录:开发环境准备与编译配置基础说明(代码片段)

文章目录目的开发环境准备调试烧录环境开发编译环境编译工具链uboot和linuxbuildroot应用程序示例NUC980NuWriterLinuxcommandlinetool编译配置基础说明开发编译工作目录U-BootLinuxKernel总结目的微处理器开发使用前需要先准备相应的开发环... 查看详情

错误记录编译linux内核报错(unabletofindthencursespackage.)(代码片段)

文章目录一、报错信息二、解决方案一、报错信息编译Linux内核,执行makemenuconfig配置菜单命令,报如下错误:root@ubuntu:~/kernel/linux-5.6.14#makemenuconfigHOSTCCscripts/basic/fixdep**Unabletofindthencursespackage.*Installncurses(ncurses-devel 查看详情

rk3288以太网的mac地址调试笔记学习笔记原创

平台信息:内核:linux3.1.0系统:android/android6.0平台:RK3288作者:庄泽彬(欢迎转载,请注明作者)邮箱:[email protected]说明:提供以太网mac地址烧录以及读写的方式一、功能演示以及说明:1.1在安卓的文件系统生成如下的设备节点... 查看详情

问题排查低版本内核驱动移植到高版本内核中编译报错,部分编译异常记录及解决(代码片段)

摘要:将klsp移植到高版本内核中编译时,有可能会遇到一些编译报错。原因一部分是因为新版本的内核加入了更多的代码检测,或者是打开了更多的代码检测选项,将以前的warning视为了error,还有可能是因为... 查看详情

buildroot重新编译内核(代码片段)

...像,烧录到SD卡,系统跑起来后,我便开始了内核设备树的探索。先从点灯开始,进入到板子的/sys/class/leds/目录看到#cd/sys/class/leds/#lsbananapi:green:usr其中bananapi:green:usr正是对应板子上的绿色LED灯 查看详情