部分在编译过程中需要的工具可在资源下载页下载
配置
操作系统:ubuntu10.04 64位;安卓手机:Nexus5;手机Android版本:4.4.4
注意:笔者在完成以下操作时在root权限下进行,建议进入root权限后开始以下操作
Android源码\内核下载及编译
1、 建立编译环境
a) 安装JDK 1.6版本
i. 下载jdk-6u27-linux-x64.bin文件
ii. 在/usr/lib/目录下新建java文件夹
mkdir /usr/lib/java
iii. 将jdk文件拷贝到java文件夹中,并执行该文件
./jdk-6u27-linux-x64.bin
iv. 配置环境变量
gedit /etc/environment
在打开文件中加入下列语句
PATH=”/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/lib/java/jdk1.6.0_27”
JAVA_HOME=/usr/lib/java/jdk1.6.0_27/
CLASSPATH=.:$JAVA_HOME\lib\tools.jar:$JAVA_HOME\lib\dt.jar
v. 使修改的环境变量立刻生效
source /etc/environment (重新启动亦可)
vi. 查看当前java jdk版本是否为1.6 版本
在终端输入 java –version
若显示为java version “1.6.0_27”则说明jdk 1.6版本安装成功
b) 安装ubuntu下特定的工具包
使用apt-get命令来安装特定的工具包
apt-get install git-coregnupg flex bison gperf build-essential \
zip curl zlib1g-devlibc6-dev lib32ncurses5-dev ia32-libs \
x11proto-core-devlibx11-dev lib32readline5-dev lib32z-dev \
libgl1-mesa-devg++-multilib mingw32 tofrodos python-markdown \
libxml2-utils xsltproc
除了用apt-get命令安装特定的工具包之外,可在ubuntu的系统-系统管理-新立得软件包管理器进行查找对应软件包并选择安装或升级 (笔者采取新立得安装方式)。
在完成工具包下载后,我们还需要对git版本进行升级
apt-add-repositoryppa:git-core/ppa
apt-get update
apt-get dist-upgrade
2、 下载Android源码(编译源码用到了其中的NDK,ADB,交叉编译器,整个编译过程较长时间,编译完成后可开启模拟器)
a) 下载Repo
cd ~
mkdir bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo> ~/bin/repo
chmod a+x ~/bin/repo
b) 下载Android源码
i. 在当前用户的根目录下创建Android平台文件夹
cd ~
mkdir Android_platform
cd Android_platform
ii. 利用repo init下载源码
repo init -uhttps://android.googlesource.com/platform/manifest -b android-4.4.4_r2
在下载过程中会中断要求输入用户的邮箱和用户名
git config –globaluser.email “email@example”
git config --global user.name“your name”
输入认证用户名和邮箱后,输入以下命令重新下载
repo init -uhttps://android.googlesource.com/platform/manifest -b android-4.4.4_r2
repo sync
(若在下载过程中意外中断,可重新输入repo sync从中断点开始重新下载)
iii. 执行envsetup脚本
在Android目录下执行以下语句
cd ~/Android_platform
source./build/envsetup.sh
输入lunch语句,选择Android产品类型(笔者默认选择full-eng版本)
lunch full-eng
iv. 编译源码
make
或者可选择make –jN语句编译,其中N取决于开发机器的CPU数,每个CPU的核数以及每个核心的线程数(例 make –j4)
注意:若出现段错误,继续make命令即可
3、 编译内核代码并烧录到手机
a) 下载Android内核源码
在Android项目文件夹下创建kernel文件夹,并下载内核源码
cd ~/Android_platform/
mkdir kernel
cd kernel
git clone https://android.googlesource.com/kernel/msm.git
注意:由于实验手机设备为Nexus 5,因此我们选择内核代码为msm.git
b) checkout所选内核版本
cd ~/Android_platform/kernel/msn
git branch –a
git checkoutremotes/origin/android-msm-hammerhead-3.4-kitkat-rm2
c) 修改Makefile文件支持交叉编译器
cd~/Android_platform/kernel/msm/
gedit Makefile
修改Makefile文件下述内容:
export KBUILD_BUILDHOST:= $ (SUBARCH)
ARCH ?= $(SUBARCH)
CROSS_COMPLETE ?= $ (CONFIG_CROSS_COMPILE : “%” =%)
将后面两行修改为:
ARCH ?= arm
CROSS_COMPLETE ?= arm-eabi-
修改环境变量识别arm-eabi-
exportPATH=$PATH:~/Android_platform/prebuilts/gcc/linux-86/arm/arm-eabi-4.7/bin
d) 打开内核中支持IO tracer选项
make hammerhead_defconfig
make menuconfig
在此之后,选择弹出的界面框中的kernel hacking->Tracers->Supportfor tracing block IO actions
返回主界面后选择Save an Alternate ConfigurationFile.
e) 编译内核
make –j4
编译成功后可以看到下面的输出:
OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready
CAT arch/arm/boot/zImage-dtb
Kernel: arch/arm/boot/zImage-dtb is ready
4、 制作boot.img文件
a) 下载bootimg-tools工具
mkdir ~/Android_platform/boot-img
cd ~/Android_platform/boot-img
git clone https://github.com/pbatard/bootimg-tools.git
下载完成后,执行下列语句
cd bootimg-tools/
make
cd cpio/
gcc mkbootfs.c –o mkbootfs –I../include
cd ../..
mkdir android_boot_tools_bin
cd android_boot_tools_bin/
cp../bootimg-tools/mkbootimg/mkbootimg ./
cp../bootimg-tools/mkbootimg/unmkbootimg ./
cp ../bootimg-tools/cpio/mkbootfs ./
cd ../
b) 配置环境变量
gedit /etc/environment
将PATH修改为以下内容:
PATH=”/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/lib/java/jdk1.6.0_27:/root/Android_platform/boot-img/android_boot_tools_bin”
立即执行
source /etc/environment
c) 下载boot.img
下载地址:
https://dl.google.com/dl/android/aosp/hammerhead-ktu84q-factory-ae475293.tgz
在~/Android_platform/boot-img/下新建文件夹original-boot-img
mkdir~/Android_platform/boot-img/original-boot-img
解压该压缩包中的boot.img至~/Android_platform/boot-img/original-boot-img
执行下述命令语句:
cp~/Android_platform/kernel/msm/arch/arm/boot/zImage-dtb~/Android_platform/boot-img/
在~/Android_platform/boot-img/android_boot_tools_bin目录下执行:
./unmkbootimg –i boot-img/original-boot-img/boot.img
执行完unmkbootimg后会出现下述语句
kernel written to 'kernel' (8331496bytes)
ramdisk written to 'ramdisk.cpio.gz' (498796 bytes)
To rebuild this boot image, youcan use the command:
mkbootimg --base 0 --pagesize 2048--kernel_offset 0x00008000 --ramdisk_offset 0x02900000 --second_offset0x00f00000 --tags_offset 0x02700000 --cmdline 'console=ttyHSL0,115200,n8androidboot.hardware=hammerhead user_debug=31 maxcpus=2 msm_watchdog_v2.enable=1' --kernel kernel --ramdiskramdisk.cpio.gz -o original-boot-img/boot.img
执行上述中的”mkbootimg –base 0 –pagesize……………”语句修改为下述语句,并执行
mkbootimg --base 0 --pagesize 2048--kernel_offset 0x00008000 --ramdisk_offset 0x02900000 --second_offset0x00f00000 --tags_offset 0x02700000 --cmdline 'console=ttyHSL0,115200,n8androidboot.hardware=hammerhead user_debug=31 maxcpus=2 msm_watchdog_v2.enable=1' --kernel ~/Android_platform/ boot-img/zImage-dtb --ramdisk ~/Android_platform/boot-img/android_boot_tools_bin/ramdisk.cpio.gz-o ~/Android_platform/boot-img/original-boot-img/boot.img
d) 烧录boot.img
adb start-server
adb reboot bootloader
fastboot flash boot~/Android_platform/boot-img/boot.img
fastboot reboot