部分在编译过程中需要的工具可在资源下载页下载

配置

操作系统: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