【转:】http://www.cnblogs.com/chaunqi/archive/2011/01/21/tt81.html
Android应用的性能如何测试?JAVA层面可以用TraceView,可是用NDK开发出来的是so,TraceView跟踪不了怎么办?问了Google大神,答案是OProfile!
Oprofile 是Linux系统下一个低开销的系统全局的性能监视工具,利用处理器上所包含的专用的性能监视硬件(若没有性能监视硬件则使用一个基于计时器的代用品)来收集与性能相关的数据样品。它获得关于内核以及系统上的可执行文件的信息,例如内存是何时被引用的;L2缓存请求的数量;收到的硬件中断数量等。
Oprofile的特点如下:
l 无需重新编译源代码,如果不进行源代码及分析,连调试信息(-g option to gcc)也不是必须的。
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
二、编译linux内核映像
a)准备交叉编译工具链
android代码树中有一个prebuilt项目,包含了我们编译内核所需的交叉编译工具。
b)设定环境变量
$ emacs ~/.bashrc
增加如下两行:
export PATH=$PATH:~/android/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin
export ARCH=arm
保存后,同步变化:
$ source ~/.bashrc
c)获得合适的内核源代码
$ cd ~/android
获得内核源代码仓库
$ git clone git://android.git.kernel.org/kernel/common.git kernel
$ cd kernel
$ git branch
显示
* android-2.6.27
说明你现在在android-2.6.27这个分支上,也是kernel/common.git的默认主分支。
显示所有head分支:
$ git branch -a
显示
* android-2.6.27
remotes/origin/HEAD -> origin/android-2.6.27
remotes/origin/android-2.6.25
remotes/origin/android-2.6.27
remotes/origin/android-2.6.29
remotes/origin/android-goldfish-2.6.27
remotes/origin/android-goldfish-2.6.29
我们选取最新的android-goldfish-2.6.29,其中goldfish是android的模拟器模拟的CPU。
$ git checkout -b android-goldfish-2.6.29 origin/android-goldfish-2.6.29
$ git branch
显示
android-2.6.27
* android-goldfish-2.6.29
我们已经工作在android-goldfish-2.6.29分支上了。
d)设定交叉编译参数
打开kernel目录下的Makefile文件,把CROSS_COMPILE指向刚才下载的prebuilt中的arm-eabi编译器
CROSS_COMPILE ?= arm-eabi-
把
LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,\
$(call ld-option, -Wl$(comma)–build-id,))
这一行注释掉,并且添加一个空的LDFLAGS_BUILD_ID定义,如下:
LDFLAGS_BUILD_ID =
e)编译内核映像
$ cd ~/android/kernel
$ make goldfish_defconfig
$ make menuconfig
修改内核配置如下
General setup --->
Profiling support (EXPERIMENTAL)
[ ] Activate markers
OProfile system profiling (EXPERIMENTAL)
这是把OProfile直接编进内核,也可以选择[M] OProfile system profiling (EXPERIMENTAL)会在arch/arm/oprofile文件夹下生成oprofile.ko,oprofile.ko需要用insmod载入。
$make
f)测试生成的内核映像
$ emulator -avd myavd -kernel ~/android/kernel/arch/arm/boot/zImage
三、Oprofile在android模拟器中的使用
1.先看一下opcontrol的参数
# opcontrol
opcontrol: usage:
-l/--list-events list event types and unit masks
-?/--help this message
-v/--version show version
--init loads the oprofile module and oprofilefs
--setup give setup arguments (may be omitted)
--status show configuration
--start-daemon start daemon without starting profiling
-s/--start start data collection
-d/--dump flush the collected profiling data
-t/--stop stop data collection
-h/--shutdown stop data collection and kill daemon
-V/--verbose[=all,sfile,arcs,samples,module,misc,ext]
be verbose in the daemon log
--reset clears out data from current session
--save=name save data from current session to session_name
--deinit unload the oprofile module and oprofilefs
-e/--event=eventspec
Choose an event. May be specified multiple times. Of the form
"default" or "name:count:unitmask:kernel:user", where :
name: event name, e.g. CPU_CLK_UNHALTED or RTC_INTERRUPTS
count: reset counter value e.g. 100000
unitmask: hardware unit mask e.g. 0x0f
kernel: whether to profile kernel: 0 or 1
user: whether to profile userspace: 0 or 1
-p/--separate=type,[types]
Separate profiles as follows :
none: no profile separation
library: separate shared library profiles per-application
kernel: same as library, plus kernel profiles
thread: per-thread/process profiles
cpu: per CPU profiles
all: all of the above
-c/--callgraph=#depth enable callgraph sample collection with a maximum depth.
Use 0 to disable callgraph profiling.
--session-dir=dir place sample database in dir instead of
default location (/var/lib/oprofile)
-i/--image=name[,names] list of binaries to profile (default is "all")
--vmlinux=file vmlinux kernel image
--no-vmlinux no kernel image (vmlinux) available
--kernel-range=start,end kernel range vma address in hexadecimal
--buffer-size=num kernel buffer size in sample units
--buffer-watershed kernel buffer watershed in sample units (2.6 only=
--cpu-buffer-size=num per-cpu buffer size in units (2.6 only)
--note-table-size kernel notes buffer size in notes units (2.4 only)
--xen Xen image (for Xen only)
--active-domains=<list> List of domains in profiling session (for Xen only)
(list contains domain ids separated by commas)
2.使用方法
将我们之前编译好的oprofile和busybox装入模拟器
执行oprofile目录中的install.sh 将oprofile装入模拟器
adb push busybox /data/busybox
$adb shell //进入模拟器shell
#chmod 777 /data/busybox
# /data/busybox --install /data/busybox
#export PATH=/data/busybox:$PATH:/data/oprofile
# mount -o remount rw /
# mount -o rw,remount -t yaffs2 /dev/mtdblock3 /system
# touch /etc/mtab
# echo nodev /dev/oprofile oprofilefs rw 0 0>/etc/mtab
# mkdir /dev/oprofile
# mount -t oprofilefs nodev /dev/oprofile //这一句很重要,没有这一句会出现下面的错误
# opcontrol --init
cat: can't open '/dev/oprofile/cpu_type': No such file or directory
Unable to open cpu_type file for reading
Make sure you have done opcontrol --init
cpu_type 'unset' is not valid
you should upgrade oprofile or force the use of timer mode
# opcontrol --init //初始化,只需运行一次
# opcontrol --setup --callgraph=2 --session-dir=/data/first --no-vmlinux
Using 2.6+ OProfile kernel interface.
Using log file /data/first/samples/oprofiled.log
Daemon started.
Profiler running.
# opcontrol --status
Daemon running: pid 637
Separate options: none
vmlinux file: none
Image filter: none
Call-graph depth: 2
# opcontrol --start //启动profiler
Using 2.6+ OProfile kernel interface.
Using log file /var/lib/oprofile/samples/oprofiled.log
Daemon started.
Profiler running.
# /data/test/test //运行我们的程序 ( 我的测试程序通过这条指令编译arm-none-linux-gnueabi-gcc -g -o test test.c -static -fno-omit-frame-pointer)
in c
in a
in b
in a
in c
in b
in a
in a
# opcontrol --dump //收集采样数据
# opcontrol --stop //停止profiler
Stopping profiling.
#opreport --session-dir=/data/first -l /data/test/test //查看报告
CPU: CPU with timer interrupt, speed 0 MHz (estimated)
Profiling through timer interrupt
samples % symbol name
11291 79.9589 a
1129 7.9952 b
853 6.0406 main
848 6.0052 c
现在我们就可以根据oprofile的输出对我们的程序进行优化了。
如果有哪位同学也想试一把的话,一定要用linux。这种移植环境很重要,我之前就在测试机(win7+cygwin)上浪费了很多时间。这里有打包好的工具,大家可以下载。其中kernel-qemu就是我们之前编译好的内核,替换掉Android SDK中的kernel-qemu就行了。祝各位好运!
分享到:
相关推荐
Android手机软件性能测试的工具
**Node.js-Android性能测试工具Emmagee** Emmagee是一款基于Node.js开发的高性能测试工具,专为Android应用程序设计,用于实时监控和分析应用程序在运行时对系统资源的消耗情况。通过使用Emmagee,开发者可以深入...
综上所述,Emmagee作为Android性能测试工具,其优化研究对于提升测试效率和准确性至关重要。通过自动化测试和精确控制执行时间,开发者可以更有效地找出和解决性能问题,优化移动应用的性能,以满足日益增长的用户...
总的来说,Emmagee作为Android性能测试工具,其优化研究对于提升应用的性能和用户体验具有显著价值。通过自动化测试和精确控制执行时间的优化,Emmagee能够更有效地帮助开发者诊断和解决性能问题,以适应快速发展的...
Android性能测试工具Emmagee.apk,博客地址:http://blog.csdn.net/abc6368765/article/details/56012222
android设备tp性能测试工具,能够测试tp的报点频率以及响应速度!
APT Android Performance Testing Tools 开源项目 适用于开发自测和定位性能瓶颈 帮助测试人员完成性能基准测试 竞品测试 APT提供了CPU利用率实时曲线图 多维度内存实时曲线图 方便竞品对比测试和定位内存泄露问题...
本文将详细介绍Android性能监控检测工具——FPSCPUPSSPrivateDirty,并探讨这些指标在Android系统中的作用。 首先,让我们了解这些术语的含义: 1. **FPS (Frames Per Second)**:帧率,衡量的是设备每秒渲染图像...
Emmagee是一款开源的Android性能监控工具,它专为Android应用设计,提供了全面的性能指标监控,包括CPU使用率、内存占用、网络流量、电池电量以及设备温度等关键数据。下面我们将深入探讨Emmagee的实现原理、功能...
【GT3.1.0 app性能测试工具】 GT(Game Tools)是由腾讯开发的一款专业级的手机应用程序性能测试工具,特别是在游戏性能优化方面表现出色。虽然GT已经不再更新,其功能已被更新后的perfdog所取代,但GT 3.1.0版本因...
《Android性能测试》这本书深入探讨了Android应用性能优化的关键技术和实践方法。在移动开发领域,尤其是在竞争激烈的Android市场,提供高性能、低资源消耗的应用是开发者必须面对的重要挑战。本篇文章将依据书中的...
3. Monkey 测试工具:Monkey 是一种性能测试工具,用于测试 Android 客户端的稳定性和性能。Monkey 的特征包括:测试对象仅为应用程序包,有一定的局限性;测试使用的事件流数据流是随机的,不能进行自定义。 4. ...
Emmagee是监控指定被测应用在使用过程中占用机器的CPU、内存、流量资源的性能测试小工具。
Android App 性能测试工具是指用于测试和分析 Android App 的性能和功能的工具,旨在帮助开发者检测和优化 App 的性能。 iTest 是一款功能强大且易于使用的性能测试工具,提供四大特色功能:功能强大、操作简单、...
在Android应用开发中,性能测试是一项至关重要的环节,它确保了应用在运行时的流畅性、效率和用户体验。APT(Android Performance Testing)测试工具就是专为Android开发者设计的一款强大工具,用于评估和优化应用...
腾讯GT,全称为“Gaming Toolkit”,是由腾讯公司推出的一款专业性能测试工具,主要应用于移动应用和游戏的性能分析与优化。GT旨在帮助开发者深入理解和改善他们的应用程序在真实设备上的运行效率,确保产品在各种...
标题中的“非常好用的性能测试工具”指的是一个用于安卓设备的高效性能测试工具,它能够帮助开发者和测试人员深入理解应用程序在实际运行环境下的性能表现。这个工具的主要特点是自动化,可以显著提高测试效率。 ...