Android源码\内核下载及编译

  1. 建立编译环境
  1. 安装JDK1.6版本
  1. 下载jdk-6u27-linux-x64.bin文件
  2. 在/usr/lib/目录下新建java文件夹
mkdir/usr/lib/java
1. 将jdk文件拷贝到java文件夹中,并执行该文件
./jdk-6u27-linux-x64.bin
1. 配置环境变量
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
1. 使修改的环境变量立刻生效
source/etc/environment (重新启动亦可)
1. 查看当前javajdk版本是否为1.6版本
在终端输入java –version 
若显示为javaversion “1.6.0_27”则说明jdk1.6版本安装成功

1. 安装ubuntu下特定的工具包
使用apt-get命令来安装特定的工具包
apt-getinstall git-core gnupg flex bison gperf build-essential \
zipcurl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs \
x11proto-core-devlibx11-dev lib32readline5-dev lib32z-dev \
libgl1-mesa-devg++-multilib mingw32 tofrodos python-markdown \
libxml2-utilsxsltproc
除了用apt-get命令安装特定的工具包之外,可在ubuntu的系统-系统管理-新立得软件包管理器进行查找对应软件包并选择安装或升级(笔者采取新立得安装方式)。

在完成工具包下载后,我们还需要对git版本进行升级
apt-add-repositoryppa:git-core/ppa
apt-getupdate
apt-getdist-upgrade

2. 下载Android源码 
1. 下载Repo
cd ~
mkdirbin
PATH=~/bin:$PATH
curlhttps://storage.googleapis.com/git-repo-downloads/repo >~/bin/repo
chmoda+x ~/bin/repo
1. 下载Android源码
1. 在当前用户的根目录下创建Android平台文件夹
cd ~
mkdirAndroid_platform
cdAndroid_platform
1. 利用repoinit下载源码
repoinit -u https://android.googlesource.com/platform/manifest -bandroid-4.4.4_r2
在下载过程中会中断要求输入用户的邮箱和用户名
gitconfig –global user.email “email@example”
gitconfig --global user.name “your name”
输入认证用户名和邮箱后,输入以下命令重新下载
repoinit -u https://android.googlesource.com/platform/manifest -bandroid-4.4.4_r2
repo sync
(若在下载过程中意外中断,可重新输入reposync从中断点开始重新下载)
1. 执行envsetup脚本
在Android目录下执行以下语句
cd ~/Android_platform
source./build/envsetup.sh

输入lunch语句,选择Android产品类型(笔者默认选择full-eng版本)
lunchfull-eng
1. 编译源码
make
或者可选择make–jN语句编译,其中N取决于开发机器的CPU数,每个CPU的核数以及每个核心的线程数(例make –j4)
注意:若出现段错误,继续make命令即可

make完成后输入emulator开启模拟器
emulator

***以后每次启动模拟器需要按照上述所说配置
cd ~/Android_platform
source./build/envsetup.sh
lunchfull-eng
emulator

3. 编译内核代码并烧录到手机
1. 下载Android内核源码
在Android项目文件夹下创建kernel文件夹,并下载内核源码
cd~/Android_platform/
mkdirkernel
cdkernel
gitclone https://android.googlesource.com/kernel/msm.git
注意:由于实验手机设备为Nexus5,因此我们选择内核代码为msm.git
1. checkout所选内核版本
cd~/Android_platform/kernel/msm
gitbranch –a
gitcheckout remotes/origin/android-msm-hammerhead-3.4-kitkat-mr2
1. 修改Makefile文件支持交叉编译器
cd~/Android_platform/kernel/msm/
geditMakefile
修改Makefile文件下述内容:
exportKBUILD_BUILDHOST := $ (SUBARCH)
ARCH?= $ (SUBARCH)
CROSS_COMPLETE?= $ (CONFIG_CROSS_COMPILE : “%” = %)
将后面两行修改为:
ARCH?= arm
CROSS_COMPLETE?= arm-eabi-
修改环境变量识别arm-eabi-
exportPATH=$PATH:~/Android_platform/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7/bin
1. 打开内核中支持IOtracer选项
makehammerhead_defconfig
makemenuconfig
在此之后,选择弹出的界面框中的kernelhacking->Tracers->Support for tracing block IO actions
返回主界面后选择Savean Alternate Configuration File.
1. 编译内核
make–j4
编译成功后可以看到下面的输出:
OBJCOPY arch/arm/boot/zImage
Kernel:arch/arm/boot/zImage is ready
CATarch/arm/boot/zImage-dtb
Kernel:arch/arm/boot/zImage-dtb is ready
-当编译好安卓的源码和linux的内核后执行如下操作:
 gedit ~/Android_platform/build/target/product/core.mk
 -在PRODUCT—PACKAGES下面添加
 blkparse \
 blktrace \
 verify_blkparse \
 blkrawverify
 注:只有最后一行没有\,其余每行后面都需要\
 gedit ~/Android_platform/external/blktrace/Android.mk
 -BUILD_BLKTRACE := true
 -LOCAL_MODULE_TAGS := optional

 -修改好了core.mk和Android.mk两个脚本文件以后执行下面的命令:
 cd ~/Android_patform
 -编译完成以后:
 -打开一个新的终端开启模拟器:
 cd  ~/Android_platform
 source ./build/envsetup.sh
 lunch full-eng
 emulator
 -此时启动安卓虚拟机,然后可以在安卓虚拟机上作任意的操作
 -在原来的终端使用如下命令:
 adb shell 
 -进入安卓虚拟机的终端
 mount
 -查看设备(此例中我的设备为:/dev/block/mtdblock0)
 blktrace -d /dev/block/mtdblock0 -o -| blkparse -i -
 -其中blktrace命令的使用详见blktrace User Guide
 -执行相应的blktrace命令可以对安卓虚拟机的进行trace的收集
 注:
 将收集到的blktrace-io进行解析,并将解析的结果输出,并以-f "%D %2c %8s %5T.%9t %5p %2a %3d"的格式解析
 其中每个字母代表意思如下,数字代表占几个字符,和printf里的数字输出一样的
 如 8,0   16     3042    94.435079691   891  Q   W 72411584 + 8 [flush-8:0]
 由于默认格式为先输出–f "%D %2c %8s %5T.%9t %5p %2a %3d "
 (1)8,0 按默认输出对应%D,主从设备号
 (2)16 按默认输出对应%2c,表示cpu id
 (3)3042 按默认输出对应%8s,表示序列号(序列号是blkparse自己产生的一个序号,实际IO里没有这个号)
 (4)94.435079691 按默认对应%5T.%9t,表示”秒.纳秒”
 (5)891对应%5p,表示,进程id
 (6)Q对应%2a,表示Action,Action表格如下(如Q表示IO handled by request queue code),更详细的含义见附录action表
 The following table shows the various actions which may be output.              
 Act Description
 A IO was remapped to a different device
 B IO bounced
 C IO completion
 D IO issued to driver
 F IO front merged with request on queue
 G Get request
 I IO inserted onto request queue
 M IO back merged with request on queue
 P Plug request
 Q IO handled by request queue code
 S Sleep request
 T Unplug due to timeout
 U Unplug request
 X Split
 (7)W 对应%3d,表示RWBS域(W表示写操作),各字母含义如下
          至少包含“RWD“( R 读,W写,D块被忽略)中的1个字符
          还可以附加“BS“(B barrier,S同步)
 ps
 -可以查看安卓虚拟机内部进程号
 exit
 -退出安卓虚拟机终端