OProfile作为一个Linux的工具,可以分析kernel和应用的性能。因此如何将OProfile应用于Android对于发现并解决Android的性能问题具有很重要的意义。本文以下将介绍如何在Android上应用OProfile。
一、设备准备
一个能运行Android系统的设备:作为运行Android的设备。
一个装有Linux系统(最好是Ubuntu)的PC机:与Android系统相连,作为Host。
二、软件准备
PC机准备:
1、安装编译OProfile所需的库
sudo apt-get install binutils-dev
sudo apt-get install libpopt-dev3
2、解压OProfile Helper。假设PC上Android code的目录为 android。
cd android/
tar xvfz oprofile.tar.gz
cd oprofile
3、下载OProfile
wget http://prdownloads.sourceforge.net/oprofile/oprofile-0.9.6.tar.gz
4、解压缩OProfile,并编译
tar xvfz oprofile-0.9.6.tar.gz
cd oprofile-0.9.6
./configure
make
5、建立OProfile所需的目录
export OPR_DIR=android/oprofile/oprofile-0.9.6/host
mkdir -p $OPR_DIR/bin
mkdir -p $OPR_DIR/abi
mkdir -p $OPR_DIR/arm
cp android/oprofile/arm_abi $OPR_DIR/abi
cp $OPR_DIR/../libabi/opimport $OPR_DIR/bin
cp $OPR_DIR/../pp/opreport $OPR_DIR/bin
cp -r $OPR_DIR/../events/arm/* $OPR_DIR/arm
6、将OProfile加入Android编译系统
copy -r $OPR_DIR/* /demodroid/prebuilt/linux-x86/oprofile
7、将编译好的Androd系统放到可以运行Android的设备上。
三、用OProfile测试
1、启动adb shell
adb remount
adb shell
2、配置OProfile
opcontrol --setup
oprofiled --session-dir=/data/oprofile --no-vmlinux -e CPU_CYCLES
opcontrol和oprofiled在/system/xbin目录下
如果正确执行,将输出:
Using 2.6+ OProfile kernel interface.
Reading module info.
Using log file /data/oprofile/samples/oprofiled.log
如果没有正确执行,则输出:
Cannot create directory /dev/oprofile: File exists
do_setup failed#
这说明,在设备上运行的Android系统不支持OProfile,这时需要重新flash一个支持OProfile的Android系统。
3、运行OProfile进行测试
opcontrol --start
…
Run your application
…
opcontrol --stop
4、OProfile的数据会被保存在/data/oprofile目录下面。可以通过下面的命令来或者其他的信息
opcontrol --status
opcontrol --help
oprofiled --help
5、由于OProfile会累积上次的数据,所以每次运行OProfile时,应该先清除累积的数据。
opcontrol --shutdown
opcontrol --reset
6、在主机解析数据
export OPR_DIR=android/oprofile/oprofile-0.9.6/host
cd android/oprofile
python -E opimport_pull -r /tmp/oprofile
注:为了能让Android系统支持OProfile,还需要对kernel做一些配置。在内核编译时,对OProfile相关配置如下:
CONFIG_PROFILING=y
CONFIG_OPROFILE=y
CONFIG_HAVE_OPROFILE=y
修改内核源码 ./arch/arm/oprofile/common.c
line 171:
case ARM_PERF_PMU_ID_CA9:
return "arm/armv7-ca9"; //此位置设置相应的硬件类型。
编译后,内核将支持OPRFILE