目标
- 编译Android4.4.3-r1源码及内核
0x00 环境
手机环境: nexus5 + Kernel3.4.0+Android4.4.3_r1
虚拟机编译环境: Vmware + Ubuntu 14.04
0x01 编译android系统
1. 先下源码
- 先下载 repo 工具:
repo init -u https://aosp.tuna.tsinghua.edu.cn/android/platform/manifest -b android-4.4.3_r1.1
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
因为无法翻墙所以修改下载 URL 没有vim的直接 sudo apt-get install vim就可以了
cd ~/bin/repo
vim repo
将里面的 https://android.googlesource.com/ 使用 https://aosp.tuna.tsinghua.edu.cn/ 代替即可。
修改完完成repo以后就可以下载配置源码选项了
创建源码目录 ps:最好是在根目录下
$ cd /
$ mkdir WORKING_DIRECTORY
$ cd WORKING_DIRECTORY
配置好git环境,没有git的直接 sudo apt-get install git 就可以了
$ git config --global user.name "Your Name"
$ git config --global user.email "you@example.com"
然后就再找你要下载的源码版本分支
我是Nexus5 所以选的 android-4.4.3_r1.1 其他自己手机的可以参考http://wiki.jikexueyuan.com/project/android-source/codenames-tags-build-numbers.html
- repo 初始化
$ repo init -u https://aosp.tuna.tsinghua.edu.cn/android/platform/manifest -b android-4.4.3_r1.1
最后用repo sync 下载即可
$ repo sync
中间如果中断了,直接repo sync 继续同步下载即可
我是中断个5.6次~
下载成功会显示DONE
2. 配置源码编译环境
- 配好编译的库
$ sudo apt-get install git-core gnupg flex bison gperf build-essential \
zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 \
lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache \
libgl1-mesa-dev libxml2-utils xsltproc unzip
Android 7.0 (Nougat) - Android 8.0 (O):Ubuntu - OpenJDK 8;
Android 5.x (Lollipop) - Android 6.0 (Marshmallow):Ubuntu - OpenJDK 7
Android 4.4.x (KitKat):Ubuntu - Java JDK 6;
Android 2.2.x (Froyo):Ubuntu - Java JDK 5
因为是android4.4,所以我用的jdk1.6.0_45 其他android版本找对应的jdk即可
- 配置环境变量
执行命令,打开文件:
# vi /etc/profile
export JAVA_HOME=/usr/java/jdk1.6.0_45
export JAVA_BIN=/usr/java/jdk1.6.0_45/bin
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME JAVA_BIN PATH CLASSPATH
执行生效
#. /etc/profile (ps:点和/之间有空格)
3. 编译系统
在官网下载手机对应的驱动:
https://developers.google.com/android/nexus/drivers#hammerhead
找到 Nexus 5 (GSM/LTE) binaries for Android 4.4.4 (KTU84P)
下面三个文件都要下载,解压后是三个.sh文件,放到安卓源码目录下,分别对三个文件chmod a+x 文件名 赋权限,然后分别执行三个文件,此时会生成 vendor文件夹。开始编译:
编译代码如果前面的步骤没出问题,那么用下面的指令就可以直接进行编译(aosp_arm-eng为模拟器,nexus5为aosp_hammerhead-userdebug)
source build/envsetup.sh #设置编译环境
lunch aosp_hammerhead-userdebug #设置编译选项
export USE_CCACHE=1 #使用缓存,可以加快以后的编译速度
prebuilts/misc/linux-x86/ccache/ccache -M 100G #使用 100GB 来作为缓存的空间
export CCACHE_DIR=/<path_of_yourt_choice>/.ccache #设置缓存地址,可以不要这个命令而使用默认缓存路径
make -j4
以上内容可用脚本初始化:
//init.sh
export JAVA_HOME=/usr/local/java/jdk1.6.0_45
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
. build/envsetup.sh
lunch aosp_hammerhead-userdebug
make -j4
编译完后操作系统路径为 out/target/product/hammerhead下,此时编译的操作系统自带默认的内核
- 刷机 (刷机前先解锁手机)
插上手机连接上电脑,确认正常连接上电脑后,进行刷机
cd到源码img生成路径
cd source/out/target/product/hammerhead/
Adb reboot bootloader
Fastboot -w flashall
大概一两分钟后,系统即刷成功。
知识点扩充:如何将编译后的源码制作成ROM
0x02 编译内核系统
我们知道此时编译的ROM是自带的内核,我们需要下载内核源码重新编译。在Android源码文件夹下创建kernel文件夹,并下载内核源码:(参考http://source.android.com/source/building-kernels.html)
1、下载内核源码
(由于实验手机设备为Nexus 5,因此我们选择内核代码为msm.git)
重要的是:当你下载完内核的时候,你发现文件夹里什么也没有,这时按如下步骤:
- 2、checkout所选内核版本
cd ~/source/kernel/msm
git branch -a 查看版本
git checkout remotes/origin/android-msm-hammerhead-3.4-kitkat-mr1
- 3、编译内核
exportPATH=$PATH:/WORKING_DIRECTORY/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin
export ARCH=arm
export SUBARCH=arm
export CROSS_COMPILE=arm-eabi-
make hammerhead_defconfig
编辑配置文件开启KLM
gedit .config
在里面添加以下内容:
CONFIG_MODULES=y
CONFIG_MODULE_FORCE_LOAD=y
CONFIG_MODULE_UNLOAD=y
CONFIG_MODULE_FORCE_UNLOAD=y
并将CONFIG_STRICT_MEMORY_RWX修改为N
CONFIG_STRICT_MEMORY_RWX=n
- 最后 make -j4 编译
编译完内核后,内核生成的路径为:kernel/msm/arch/arm/boot目录下的zImage-dtb文件(nexus 5是这个文件,nexus 4是zImage文件,请注意别弄错了),把该文件复制到源码下的device/lge/hammerhead-kernel夹下(注意:nexus 4则为mako-kernel文件夹)
- 替换系统内核
所需文件
abootimg
boot.img
zImage-dtb
先要提取boot.img
输入命令:
ls -l /dev/block/platform/msm_sdcc.1(具体设备具体定)/by-name,
找到boot这一项,记下路径
将boot导出为boot.img
dd if=/dev/block/mmcblk0p19 of=/data/local/boot.img
adb pull /data/local/boot.img boot.img
使用abootimg工具解开boot.img
aboot.img -x boot.img
生成 bootimg.cfg zImage initrd.img 三个文件
将 zImage-dtb 重命名为zImage替换里面的zImage
执行 abootimg –create boot.img -f bootimg.cfg -k zImage -r initrd.img 得到boot.img
然后烧写
adb reboot bootloader
fastboot flash boot boot.img
完成刷机后,重新开机,就刷入自编译的内核了。
注意备份以还原砖头
刷内核,不免会有刷成砖头的情况。
使用步骤1中提取到的原版boot.img,在刷机模式下,执行fastboot flash boot boot.img就还原系统了。
总结
参考
https://bbs.pediy.com/thread-207538.htm abootimg的用法
从编译源码开始定制Android ROM
http://blog.csdn.net/qq1084283172/article/details/71037182 Hook android系统调用的实践
https://www.anquanke.com/post/id/85375 hook Android系统调用的乐趣和好处