Android源码\内核下载及编译
- 建立编译环境
- 安装JDK1.6版本
- 下载jdk-6u27-linux-x64.bin文件
- 在/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
-退出安卓虚拟机终端