安卓虚拟机blktrace的收集

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


  1. 下载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


  1. 编译内核代码并烧录到手机

    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
-退出安卓虚拟机终端



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值