[原创]Nexus5 内核编译烧录过程记录
参考Android系统源代码情况分析第二章进行实践,为了提高效率,也为了增加实践机会,使用Nexus5进行内核编译。需要说明的是,Android源代码工程默认是不包含它所使用的Linux内核源码,如果需要运行定制的Linux内核,就要单独下载内核源码,并且对它进行编译。Nexus Android源码的编译参考
1、下载nexus5 对应的内核源码
Android系统使用的是Linux内核,但与主线分枝的Linux内核又有一些差异,各个不同的厂商又有自己的修改。内核源码位于谷歌境外服务器,不翻墙无法访问,这给同步源码造成很大的不便。幸好清华大学的开源服务器上也同步了AOSP内核的源码,使得我们无须翻墙就可以同步源码。
映射关系如下:
名称 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.
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.-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
print "error, forbidden warning:", m.group() 解决:由于本人把机器上的python给改成3.5了,不支持这种print语法
sudo rm /usr/bin/python,删除
sudo ln -s /usr/bin/python2. /usr/bin/python,默认设置成python2. 这样在终端中输入python默认就是 .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-- ninjame ninjame 5月 : 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= blocksize= total= reserve= #### make completed successfully (: (mm:ss)) ####
重启手机进入bootloader模式
adb reboot bootloader
刷入内核
fastboot flash boot boot.img
重启手机
fastboot reboot
~晒图,换上自己的签名了,哈哈~ ,不过g4ad03fa 打脸了。。。

参考博客:
http://ju.outofmemory.cn/entry/253033
[原创]Nexus5 内核编译烧录过程记录的更多相关文章
- Linux内核编译完整过程
Linux内核编译完整过程 通过网上的资料我自己的实际内核编译,我把对Linux内核编译的过程写在这里,也许对其他的Linux爱好者的编译学习有些帮助,其中很大部分是网上的资料,另外就是我在实际编译过 ...
- [原创]Nexus5 源码下载、编译、真机烧录过程记录
asop使用清华镜像源https://mirror.tuna.tsinghua.edu.cn/help/AOSP/ 一开始使用每月初始化包的方式因为无法搞定版本的问题,没能通过编译,无奈,老老实实一点 ...
- Mac上编译OpenJDK过程记录
编译OpenJDK主要为了学习HotSpot,编译过程在很多相关书籍中都有所涉及,但由于机型.机子具体环境的不同,很难有资料能够一步到位.还是得碰到具体问题通过上网查来一个个解决. 下载OpenJDK ...
- 图解linux内核编译框架
内核是如何编译成的 -知其然而不知其所以然 (第一篇) 转载:http://blog.chinaunix.net/uid-28236237-id-3840137.html Linux内核有分门别类的目 ...
- Linux内核, 编译一个自己的内核
本文,我们将一步一步地介绍如何从源代码编译和安装一个Linux内核.需要注意的是本指导基于Ubuntu 20.04版本编译安装,其它发行版可能会有差异. 在前面文章中我们反复提到过Linux内核, ...
- 【转】android 最新 NDK r8 在window下开发环境搭建 安装配置与使用 详细图文讲解,完整实际配置过程记录(原创)
原文网址:http://www.cnblogs.com/zdz8207/archive/2012/11/27/android-ndk-install.html android 最新 NDK r8 在w ...
- arm-linux内核编译过程小结
记在前面的杂七杂八 内核的生成,实际上最终的目的是生成一个binary文件zImage,大小2-5MB的数量级. 用户可以从kernel.org得到的tar.gz格式的内核源代码,此代码解压后,就会生 ...
- android 最新 NDK r8 在window下开发环境搭建 安装配置与使用 详细图文讲解,完整实际配置过程记录(原创)
android 最新 NDK r8 在window下开发环境搭建 安装配置与使用 详细图文讲解,完整实际配置过程记录(原创) 一直想搞NDK开发却一直给其他事情耽搁了,参考了些网上的资料今天终于把 ...
- 使用VS2010编译Qt 5.6.1过程记录
由于Qt官方发布的Qt 5.6.1二进制安装包没有对应VS2010版本的,而我的电脑上只安装了VS2010,因此只能自己编译. 本文记录本人的编译安装过程,以及其中遇到的一些问题. 本文使用VS201 ...
随机推荐
- 使用VB6写一个自定义的进度信息框窗口
一.起因说明 之前有些项目是用Access完成的,当时为了给用户显示一些进度信息,自制了一个进度信息窗体,类似下图所示: 随着项目不断变迁,需要将进度信息按阶段及子进度进行显示,并且出于代码封装的需求 ...
- SQL Server数据库的存储过程中定义的临时表,真的有必要显式删除临时表(drop table #tableName)吗?
本文出处:http://www.cnblogs.com/wy123/p/6704619.html 问题背景 在写SQL Server存储过程中,如果存储过程中定义了临时表,有些人习惯在存储过程结束的时 ...
- 自动生成数学题型二(框架struts2)题型如((a+b)*c=d)
1. 生成题目 1.1 生成单个题目 public static String[] twoOperatorAndOperator(int num1, int num2) { double first ...
- 在eclipse中使用Maven建web工程项目
在eclipse中使用Maven建web工程项目: 第一种方式: 右键新建maven工程,勾选创建一个简单工程 填入信息,注意打包方式要改为war 点击完成,创建完的工程目录如下: 项目中没有WEB- ...
- nginx视频直播/点播服务干货分享
一.ubuntu14.04安装nginx及nginx_rtmp_module扩展 nginx根据是否已安装和安装的方式不同,有一下三种方式安装及扩展安装. 1.全新安装nginx和nginx_rtmp ...
- Java Comparator的范型类型推导问题
问题 在项目中,有一处地方需要对日期区间进行排序 我需要以日期区间的开始日为第一优先级,结束日为第二优先级进行排序 代码 我当时写的代码如下: List<Pair<LocalDate, L ...
- Linux防火墙配置—允许转发
一.实验目标 在上一次"Linux基础网络搭建实验"中,内.外网虚拟机之所以能Ping通,是因为暂时关闭了防火墙,然而现实中这样操作显然存在很大的安全隐患,所以本次实验在上次实验的 ...
- Google Earth影像数据破解之旅
"Zed, you are so excellent." 为什么要写这句英文?容我卖个关子稍后再解释. 相信大多数人都体验过Google Earth(简称GE),我对GE最初的印象 ...
- 根据GPS经纬度判断当前所属的市区
这个事情分两步走 1. 拿到行政区划的地理围栏数据 2. 根据GPS定位判断一个点是否落在地理围栏的多边形区域里. 1. 获取行政区划的地理围栏数据可以利用百度API.打开以前我的一个例子在chrom ...
- 第二章、元组和列表(python基础教程第二版 )
最基本的数据结构是序列,序列中每个元素被分配一个序号-元素的位置,也称索引.第一个索引为0,最后一个元素索引为-1. python中包含6种内建的序列:元组.列表.字符串.unicode字符串.buf ...