按照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 了~