编译安装Nexus5 Android系统内核

按照CyanogenMod的官方教程,根据自己的机型,下载代码,下载内核代码。

比如我的机型是Nexus 5,教程在这里:

http://wiki.cyanogenmod.org/w/Build_for_hammerhead

刷新Recovery后,把编译出来的ROM刷入手机,就完成了刷机。这个过程请参见上面的这个官方文档,我就简单的说一下环境的配置:


内核的代码在这个位置,其中/home/xuyn/android/cm12.1 是我的CM代码的根目录:

xuyn@romteam:~/android/cm12.1/kernel/lge/hammerhead$ pwd

/home/xuyn/android/cm12.1/kernel/lge/hammerhead

xuyn@romteam:~/android/cm12.1/kernel/lge/hammerhead$ ls

android           arch   COPYING  crypto         drivers   fs       init  Kbuild   kernel  MAINTAINERS        Makefile  net     REPORTING-BUGS  scripts   sound  usr

AndroidKernel.mk  block  CREDITS  Documentation  firmware  include  ipc   Kconfig  lib     make_defconfig.sh  mm        README  samples         security  tools  virt

xuyn@romteam:~/android/cm12.1/kernel/lge/hammerhead$ 


在编译Android系统之前,要配置好 Java 的路径和 交叉编译工具的路径:

Android 5开始,Android的编译需要OpenJDK,要把PATH中默认的JAVA_HOME环境变量改成OpenJDK的。

交叉编译工具在 根目录 prebuilts 目录之下,把它也添加到 PATH中

xuyn@romteam:~/android/cm12.1/prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin$ pwd

/home/xuyn/android/cm12.1/prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin

xuyn@romteam:~/android/cm12.1/prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin$ ls

arm-eabi-addr2line  arm-eabi-c++      arm-eabi-elfedit  arm-eabi-gcc-4.8  arm-eabi-gcc-ranlib  arm-eabi-gprof   arm-eabi-nm       arm-eabi-ranlib   arm-eabi-strings

arm-eabi-ar         arm-eabi-c++filt  arm-eabi-g++      arm-eabi-gcc-ar   arm-eabi-gcov        arm-eabi-ld      arm-eabi-objcopy  arm-eabi-readelf  arm-eabi-strip

arm-eabi-as         arm-eabi-cpp      arm-eabi-gcc      arm-eabi-gcc-nm   arm-eabi-gdb         arm-eabi-ld.bfd  arm-eabi-objdump  arm-eabi-size

所以,/etc/profile 文件的一部分是这样的:

# Openjdk是为了方便编译Android 源代码的JDK,请不要删除,如不需要请换成下面的那个,谢谢!

export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-amd64

#export JAVA_HOME=/home/osrom/lvxiaobo/java/jdk1.7.0_71

export JRE_HOME=$JAVA_HOME/jre

export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOME/bin

#这个是cm12.1 gcc4.8 linux-x86 -> arm 的交叉编译工具,请不要删除,如不需要请注释掉,谢谢!

export PATH=$PATH:/home/xuyn/android/cm12.1/prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin


用一个配置环境变量的脚本:

xuyn@romteam:~/android/kernel/nexus5$ cat nexus5env.sh 

export ARCH=arm

export SUBARCH=arm

export CROSS_COMPILE=arm-eabi-


xuyn@romteam:~/android/kernel/nexus5$ source nexus5env.sh


具体的编译ROM的细节请参见:http://wiki.cyanogenmod.org/w/Build_for_hammerhead


下载Nexus5 kernel代码,地址请参见 : https://source.android.com/source/building-kernels.html


git clone 下来之后 ,git branch -a 查看有哪些分支,git checkout 一个分支。我就用 hammerhead 3.4 lollipop这个分支

xuyn@romteam:~/android/kernel/nexus5/msm$ git branch -a

(分离自 origin/android-msm-hammerhead-3.4-lollipop-release)

  master

  remotes/origin/HEAD -> origin/master

  remotes/origin/android-msm-2.6.35

  remotes/origin/android-msm-3.9-usb-and-mmc-hacks

  remotes/origin/android-msm-anthias-3.10-lollipop-wear-release

  remotes/origin/android-msm-bass-3.10-lollipop-mr1-wear-release

  remotes/origin/android-msm-dory-3.10-kitkat-wear

  remotes/origin/android-msm-dory-3.10-lollipop-wear-release

  remotes/origin/android-msm-flo-3.4-jb-mr2

  remotes/origin/android-msm-flo-3.4-kitkat-mr0

  remotes/origin/android-msm-flo-3.4-kitkat-mr1

  remotes/origin/android-msm-flo-3.4-kitkat-mr2

  remotes/origin/android-msm-flo-3.4-l-preview

  remotes/origin/android-msm-flo-3.4-lollipop-mr1

  remotes/origin/android-msm-flo-3.4-lollipop-mr1.1

  remotes/origin/android-msm-flo-3.4-lollipop-release

  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-release

  remotes/origin/android-msm-hammerhead-3.4-m-preview

  remotes/origin/android-msm-lenok-3.10-kitkat-wear

  remotes/origin/android-msm-lenok-3.10-lollipop-wear-release

  remotes/origin/android-msm-mako-3.4-jb-mr1

  remotes/origin/android-msm-mako-3.4-jb-mr1-fr

  remotes/origin/android-msm-mako-3.4-jb-mr1-kgsl

  remotes/origin/android-msm-mako-3.4-jb-mr1.1

  remotes/origin/android-msm-mako-3.4-jb-mr2

  remotes/origin/android-msm-mako-3.4-kitkat-mr0

  remotes/origin/android-msm-mako-3.4-kitkat-mr1

  remotes/origin/android-msm-mako-3.4-kitkat-mr2

  remotes/origin/android-msm-mako-3.4-lollipop-mr1

  remotes/origin/android-msm-mako-3.4-lollipop-release

  remotes/origin/android-msm-shamu-3.10-lollipop-mr1

  remotes/origin/android-msm-shamu-3.10-lollipop-release

  remotes/origin/android-msm-shamu-3.10-m-preview

  remotes/origin/android-msm-sony-cm-jb-3.0

  remotes/origin/android-msm-sprat-3.10-kitkat-wear

  remotes/origin/android-msm-sprat-3.10-lollipop-wear-release

  remotes/origin/master

xuyn@romteam:~/android/kernel/nexus5/msm$ 


在msm目录之下:

$ make hammerhead_defconfig

$ make


等待一段时间,编译完成:zImage 和 zImage-dtb 都 ready了~

  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


接下来,需要我们制作img文件,就像Linux 中需要 initrd 一样,我们下载这个开源工具:

xuyn@romteam:~/android/kernel/nexus5$ git clone https://github.com/pbatard/bootimg-tools.git

正克隆到 'bootimg-tools'...

remote: Counting objects: 76, done.

remote: Total 76 (delta 0), reused 0 (delta 0), pack-reused 76

Unpacking objects: 100% (76/76), done.

检查连接... 完成


make ,在mkbootimg目录下有两个可执行文件:

xuyn@romteam:~/android/kernel/nexus5/bootimg-tools/mkbootimg$ ls

bootimg.h  mkbootimg.c  unmkbootimg    unmkbootimg.o

mkbootimg  mkbootimg.o  unmkbootimg.c


我们接下来把这个目录添加到 PATH 环境变量中,使得别人可以调用他们

对于我们之前通过 CM12.1 源代码编译出来的 zip 文件,解压缩,拿到一个boot.img(我的那个是叫boot-o2.img),然后使用 unmkbootimg工具提取ramdisk文件

xuyn@romteam:~/android/kernel/nexus5$ unmkbootimg -i boot-o2.img

kernel written to 'kernel' (8078768 bytes)

ramdisk written to 'ramdisk.cpio.gz' (801023 bytes)


To rebuild this boot image, you can use the command:

  mkbootimg --base 0 --pagesize 2048 --kernel_offset 0x00008000 --ramdisk_offset 0x02900000 --second_offset 0x00f00000 --tags_offset 0x02700000 --cmdline 'console=ttyHSL0,115200,n8 androidboot.hardware=hammerhead user_debug=31 maxcpus=2 msm_watchdog_v2.enable=1 androidboot.bootdevice=msm_sdcc.1' --kernel kernel --ramdisk ramdisk.cpio.gz -o boot-o2.img

 

ramdisk.cpio.gz

把它cp 到 工作目录之下,再把刚刚 kernel的编译结果 cp 到当前的工作目录之下,命名为kernel,替换掉刚刚的kernel:

cp msm/arch/arm/boot/zImage-dtb kernel


在当前工作目录下:

xuyn@romteam:~/android/kernel/nexus5$ mkbootimg --base 0 --pagesize 2048 --kernel_offset 0x00008000 --ramdisk_offset 0x02900000 --second_offset 0x00f00000 --tags_offset 0x02700000 --cmdline 'console=ttyHSL0,115200,n8 androidboot.hardware=hammerhead  user_debug=31 maxcpus=2 msm_watchdog_v2.enable=1' --kernel kernel --ramdisk ramdisk.cpio.gz -o boot.img


生成了boot.img

我们再把boot.img 再 fastboot 模式下 fastboot boot boot.img 刷入手机就OK 了~


转载于:https://my.oschina.net/u/726338/blog/425990

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值