Android手机系统的性能测试工具
Android应用的性能如何测试?JAVA层面可以用TraceView,可是用NDK开发出来的是so,TraceView跟踪不了怎么办?问了Google大神,答案是OProfile!
Oprofile 是Linux系统下一个低开销的系统全局的性能监视工具,利用处理器上所包含的专用的性能监视硬件(若没有性能监视硬件则使用一个基于计时器的代用品)来收集与性能相关的数据样品。它获得关于内核以及系统上的可执行文件的信息,例如内存是何时被引用的;L2缓存请求的数量;收到的硬件中断数量等。
Oprofile的特点如下:
l 无需重新编译源代码,如果不进行源代码及分析,连调试信息(-g option to gclearcase/" target="_blank" >cc)也不是必须的。
l 只在内核中插入一个模块。
l 可以分析运行于系统之上的所有代码(禁用中断的代码除外)
l 系统的额外开销小,Oprofile会增加1%-8%的系统开销(取决于采样频率)
l 兼容所有2.2,2.4,2.6内核,可以运行在SMP系统之上
l 支持主流CPU架构,包括X86、arm、AVR32、mips、powerpc等
Oprofile要想跑在Andorid上,要满足下面的条件:
1.内核要支持
2.要将Oprofile移植到Arm平台上
下面是移植的全过程:
一、Oprofile移植
用到的交叉编译工具如下:
arm-2010.09-50-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
用到的库如下:
popt-1.14.tar.gz
binutils-2.21.tar.gz
oprofile-0.9.6.tar.gz
$ tar xvfz arm-2010.09-50-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 -C ~/
修改~/.bashrc,添加
export PATH=${PATH}:/home/louieli/arm-2010.09/bin
$ tar zxvf popt-1.14.tar.gz
$ cd popt-1.14
$ ac_cv_va_copy=yes ./configure --with-kernel-support --host=arm-none-linux-gnueabi --prefix=/home/louieli/work/popt
$ make
$ make install
$ tar zxvf binutils-2.21.tar.gz
$ cd binutils-2.21/
$ ./configure --with-kernel-support --host=arm-none-linux-gnueabi --prefix=/home/louieli/work/binutils --enable-shared
$ make LDFLAGS="-all-static"
可能会出现 cc1: warnings being treated as errors,找到出错文件的Makefile文件,将-Werror去掉
$ make install
$ tar zxvf oprofile-0.9.6.tar.gz
$ cd oprofile-0.9.6/
$ ./configure --with-kernel-support --host=arm-none-linux-gnueabi --prefix=/home/louieli/work/oprofile/ --with-extra-libs=/home/louieli/work/popt/lib/ --with-extra-includes=/home/louieli/work/popt/include/ --with-binutils=/home/louieli/work/binutils
$ make LDFLAGS="-all-static -L/home/louieli/work/binutils/lib -Xlinker -R -Xlinker /home/louieli/work/binutils/lib -L/home/louieli/work/popt/lib/"
$ make install
用file 命令查看,我们需要的oprofile文件都已经变成可以在android上跑的静态链接文件了
install.sh: Bourne-Again shell script text executable
opannotate: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, for GNU/Linux 2.6.16, not stripped
oparchive: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, for GNU/Linux 2.6.16, not stripped
opcontrol: a /system/bin/sh script text executable
opgprof: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, for GNU/Linux 2.6.16, not stripped
ophelp: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, for GNU/Linux 2.6.16, not stripped
opimport: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, for GNU/Linux 2.6.16, not stripped
opjitconv: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, for GNU/Linux 2.6.16, not stripped
opreport: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, for GNU/Linux 2.6.16, not stripped
oprofiled: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, for GNU/Linux 2.6.16, not stripped