当前位置:操作系统 > 安卓/Android >>

Android 移植oprofil性能监测工具

关于oprofile的移植,在Ubuntu Server 10.04平台上交叉编译,移植到Android,经过实践,以下是交叉编译的正确步骤,不保证在其他环境中能正确运行,以下是编译环境:
 
build: Ubuntu Server 10.04
host: Android-2.2r2
cross compiler: mips-linux-gnu-gcc  version:4.3.2
cpu: mips
 
交叉编译oprofile,依赖(popt,binutils);
 
1.Download Open Source:
 
popt-1.14.tar.gz
binutils-2.21.tar.gz
oprofile-0.9.6.tar.gz
 
 
2.Building environment
 
重要:
touch env.sh
vi env.sh
内容如下:
export PATH=/home/gzshun/share/mips-4.3/bin:$PATH  ##修改为自己的工具链路径
export CC="mips-linux-gnu-gcc -EL"
export CXX="mips-linux-gnu-g++ -EL"
export CFLAGS=-static
export CXXFLAGS=-static
export CPPFLAGS=-static
 
source env.sh
 
3.Building popt-1.14.tar.gz
 
tar zxvf popt-1.14.tar.gz
cd popt-1.14
ac_cv_va_copy=yes ./configure --with-kernel-support --host=mips-linux-gnu --prefix=/home/gzshun/popt
make
make install
 
以下是静态编译:
4.Building binutils-2.21.tar.gz
 
tar zxvf binutils-2.21.tar.gz
cd binutils-2.21
./configure --with-kernel-support --host=mips-linux-gnu --prefix=/home/gzshun/binutils --enable-shared
make configure-host
make LDFLAGS="-all-static"
make install
 
 
5.Building oprofile-0.9.6.tar.gz
 
tar zxvf oprofile-0.9.6.tar.gz
cd oprofile-0.9.6
./configure --with-kernel-support --host=mips-linux-gnu --prefix=/home/gzshun/oprofile/ --with-extra-libs=/home/gzshun/popt/lib/ --with-extra-includes=/home/gzshun/popt/include/ --with-binutils=/home/gzshun/binutils
make LDFLAGS="-all-static -L/home/gzshun/binutils/lib -Xlinker -R -Xlinker /home/gzshun/binutils/lib  -L/home/gzshun/popt/lib/"
make install
 
 
6.添加内核oprofile模块
General setup  --->
[*] Profiling support (EXPERIMENTAL)
<*> OProfile system profiling (EXPERIMENTAL)
将oprofile模块编进内核,也可以编程模块
 
开发板性能测试篇:
 
1.注意
a.在ubuntu编译oprofile的生成路径是:/home/gzshun/oprofile,所以在开发板也需要建立相应的路径
mkdir -p /home/gzshun/
将生成的oprofile目录拷贝到开发板/home/gzshun/目录下
##原因:在ubuntu环境下编译,oprofile会按照原本在ubuntu的路径寻找需要的lib库。(生成目录自己定)
b.修改oprofile/bin/opcontrol第1968行,将/usr/bin修改为/bin
c.在Android系统中的/etc目录下新建mtab文件,并添加内容:nodev /dev/oprofile oprofilefs rw 0 0
d.在开发板设置oprofile的环境变量,必须放在PATH的前面,因为原Android系统也存在2个命令。
 
e.oprofile生成报告的默认地址是:/var/lib/oprofile
 
2.性能测试
##Android没有内核,所以需要从虚拟地址去引用vmlinux
grep "_stext" /proc/kallsyms  --> result: 84000400 T _stext  ##获取vmlinux虚拟的起始地址
grep "_etext" /proc/kallsyms  --> result: 84342a18 A _etext  ##获取vmlinux虚拟的结束地址
opcontrol --init  --> 提示错误,挂载oprofilefs即可
mount -t oprofilefs nodev /dev/oprofile  ##挂载oprofile需要的设备信息
opcontrol --init   ##初始化
opcontrol --reset  ##清空上次保留下来的信息
echo 0 > /data/vmlinux ##生成一个虚拟的vmlinux
opcontrol --callgraph=2 --vmlinux=/data/vmlinux --kernel-range=0x84000400,0x84342a18 ##起始地址,结束地址, 跟踪内核
或者 opcontrol --setup --callgraph=2 --no-vmlinux ##不跟踪 内核
opcontrol --setup --event=CYCLES:7500:0:0:1  ##事件采样
opcontrol --start  ##开始测试性能
opcontrol --status ##查看状态
.....等待时间,测试
opcontrol --dump  ##将测试性能信息写入磁盘。
opreport  ##打印报告
opcontrol --stop ##停止检测
opcontrol --shutdown  ##关闭检测守护进程
opcontrol --deinit  ##卸载oprofile内核模块
 
opreport出来的一个例子:
 
分析:
Samples 采样到的次数
% 占的百分比
Symbol name 函数名
 
Android@localhost:/# opreport
Overflow stats not available
CPU: MIPS 24K, speed 0 MHz (estimated)
Counted CYCLES events (Cycles) with a unit mask of 0x00 (No unit mask) count 7500
CYCLES:7500
samples|      %
------------------
132594 18.2787 opreport
103155 14.2204 libdvm.so
96514 13.3049 libc.so
88463 12.1950 libskia.so
79213 10.9199 app_process
CYCLES:7500
samples|      %
------------------
79213 100.000 [heap] (tgid:1444 range:0x83000-0x401000)
77023 10.6180 oprofiled
57865  7.9770 libcutils.so
19547  2.6946 busybox
17571  2.4222 libwebcore.so
13223  1.8229 libplayback.so
9490  1.3082 libdisplay.so
3906  0.5385 libbinder.so
3816  0.5261 libutils.so
3374  0.4651 ophelp
3373  0.4650 libandroid_runtime.so
2069  0.2852 libcore.so
1816  0.2503 libz.so
1648  0.2272 libsqlite.so
1342  0.1850 dalvik-jit-code-cache (deleted)
1141  0.1573 vmlinux
1110  0.1530 libui.so
975  0.1344 libsu易做图ceflinger.so
840  0.1158 libGLES_android.so
711  0.0980 libhw.so
604  0.0833 example_display
591  0.0815 libpixelflinger.so
528  0.0728 libsu易做图ceflinger_client.so
522  0.0720 linker
494  0.0681 libicuuc.so
467  0.0644 libdcchd_android.so
293  0.0404 libnativehelper.so
169  0.0233 libm.so
158  0.0218 uinput
132  0.0182 gralloc.smp86xx.so
117  0.0161 libicui18n.so
98  0.0135 copybit.smp86xx.so
75  0.0103 libstdc++.so
58  0.0080 libEGL.so
58  0.0080 libhardware.so
57  0.0079 libGLESv1_CM.so
46  0.0063 librmlibplay_default_plugin.so
35  0.0048 opjitconv
32  0.0044 libandroid_servers.so
22  0.0030 libhardware_legacy.so
15  0.0021 liblog.so
11  0.0015 servicemanager
10  0.0014 libmedia.so
9  0.0012 adbd
8  0.0011 logwrapper
5 6.9e-04 libmediaplayerservice.so
4 5.5e-04 libmedia_jni.so
3 4.1e-04 libsysutils.so
1 1.4e-04 init
1 1.4e-04 libemoji.so
 
补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,