参考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 内核编译烧录过程记录的更多相关文章

  1. Linux内核编译完整过程

    Linux内核编译完整过程 通过网上的资料我自己的实际内核编译,我把对Linux内核编译的过程写在这里,也许对其他的Linux爱好者的编译学习有些帮助,其中很大部分是网上的资料,另外就是我在实际编译过 ...

  2. [原创]Nexus5 源码下载、编译、真机烧录过程记录

    asop使用清华镜像源https://mirror.tuna.tsinghua.edu.cn/help/AOSP/ 一开始使用每月初始化包的方式因为无法搞定版本的问题,没能通过编译,无奈,老老实实一点 ...

  3. Mac上编译OpenJDK过程记录

    编译OpenJDK主要为了学习HotSpot,编译过程在很多相关书籍中都有所涉及,但由于机型.机子具体环境的不同,很难有资料能够一步到位.还是得碰到具体问题通过上网查来一个个解决. 下载OpenJDK ...

  4. 图解linux内核编译框架

    内核是如何编译成的 -知其然而不知其所以然 (第一篇) 转载:http://blog.chinaunix.net/uid-28236237-id-3840137.html Linux内核有分门别类的目 ...

  5. Linux内核, 编译一个自己的内核

      本文,我们将一步一步地介绍如何从源代码编译和安装一个Linux内核.需要注意的是本指导基于Ubuntu 20.04版本编译安装,其它发行版可能会有差异. 在前面文章中我们反复提到过Linux内核, ...

  6. 【转】android 最新 NDK r8 在window下开发环境搭建 安装配置与使用 详细图文讲解,完整实际配置过程记录(原创)

    原文网址:http://www.cnblogs.com/zdz8207/archive/2012/11/27/android-ndk-install.html android 最新 NDK r8 在w ...

  7. arm-linux内核编译过程小结

    记在前面的杂七杂八 内核的生成,实际上最终的目的是生成一个binary文件zImage,大小2-5MB的数量级. 用户可以从kernel.org得到的tar.gz格式的内核源代码,此代码解压后,就会生 ...

  8. android 最新 NDK r8 在window下开发环境搭建 安装配置与使用 详细图文讲解,完整实际配置过程记录(原创)

      android 最新 NDK r8 在window下开发环境搭建 安装配置与使用 详细图文讲解,完整实际配置过程记录(原创) 一直想搞NDK开发却一直给其他事情耽搁了,参考了些网上的资料今天终于把 ...

  9. 使用VS2010编译Qt 5.6.1过程记录

    由于Qt官方发布的Qt 5.6.1二进制安装包没有对应VS2010版本的,而我的电脑上只安装了VS2010,因此只能自己编译. 本文记录本人的编译安装过程,以及其中遇到的一些问题. 本文使用VS201 ...

随机推荐

  1. 手机自动化测试:appium源码分析之bootstrap一

    手机自动化测试:appium源码分析之bootstrap一   前言: poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.popte ...

  2. Maven项目搭建(三):Maven直接部署项目

    上一章给大家讲解了如何使用Maven搭建SSM框架项目.   这次给大家介绍一下怎么使用Maven直接部署项目.   Maven直接部署项目  1.新建系统变量CATALINA_HOME,值为:Tom ...

  3. rancher api key

    rancher将docker容器的界面化做的很好了,但是我们有时间需要在别的地方查看容器的一些信息,怎么办呢? rancher自己提供的有api 点击api查看 我们能够查看到该容器的一些信息,实际上 ...

  4. JAVA加密算法系列-DESCoder

    package ***; import java.security.Key; import java.security.SecureRandom; import javax.crypto.Cipher ...

  5. gcc编译参数之m32 m64

    m32指定编译为32位应用程序: make CFLAGS=-m32 m64指定编译为64位应用程序: make CFLAGS=-m64

  6. Win10专业版下图片拖到PS无法打开的解决技巧

    PS这个软件是用户最常用的软件之一,其强大的图形处理能力毋庸置疑.有用户表示在Win10专业版系统中使用PS发现图片不能直接拖动到PS中打开,这个问题本身不是特别大的问题,但这一小小的毛病会打破用户习 ...

  7. 基于WebForm和Bootstrap的权限框架解决方案 一.PQGRID的使用

    天天打游戏也不是个事,就写一套权限框架吧,我的要求是即漂亮美观大方上档次,又要实用易用接地气. 按理来说应该先设计数据库在来秀的,但是人生就是这么随意,先搭个框子吧, 这一篇的重点是pqgrid的介绍 ...

  8. hadoop、Storm该选哪一个

    如果hadoop.Storm还感觉混要,那么此篇文章将帮助你把他们完全区分 可以带着下面问题来阅读本文章: 1.hadoop.Storm各是什么运算 2.Storm为什么被称之为流式计算系统 3.ha ...

  9. 【Tomcat源码学习】-5.请求处理

    前四章节,主要对Tomcat启动过程中,容器加载.应用加载.连接器初始化进行了相关的原理和代码流程进行了学习.接下来开始进行接受网络请求后的相关处理学习.   一.整体流程      基于上一节图示进 ...

  10. Eclipse 中 Java 项目中 .settings 文件夹作用

    今天工作时,因对 .settings 文件夹误操作,耗时 6 个多小时,才了解到原因就出在 .settings 文件夹.经查阅资料,对 .settings 做如下整理: 就如setting这个名字,就 ...