写在前面
- 本文研究了一下用 oprofile 在 Android 做 profile 之后,最终弃用
- 原因之一是编译内核比较麻烦(oprofile 需要内核的配合)
- 原因之二是从 Android N 开始,官方已经不再使用 oprofile
- 原因之三是找到了好的替代品:simpleperf
关于 oprofile
关于正常的 Oprofile(Linux 下的):
- 参考: http://www.cnblogs.com/bangerlee/archive/2012/08/30/2659435.html
使用方法就是在命令行运行一些命令,比如:
opcontrol --start opcontrol --reset 等等...
关于 Android 里的 oprofile:
- 最早的 Android 里是没有 oprofile 的,想用的话需要自己安装。
- 后来的 Android 里加入了 oprofile,在源码的 external 目录里有 oprofile 文件夹。并且在 5.0 之前,userdebug 版本中是默认开启的。
- 到了 Android 5.1,userdebug 版本默认不是开启的了
- 到了 Android 6.0,干脆又把 oprofile 从 Android 源码里拿掉了
关于 oprofile 和 kernel:
- oprofile 不光是一套软件,它的运行需要 kernel 的支持
- 无论是 Ubuntu 还是 Android,他们想使用 oprofile 都需要他们的内核开启了相关选项
- 如何开启?在编译内核时开启。
安装 oprofile
基于 Android-5.1.1-r2 源码(external 里自带 oprofile)
打开源码里的 oprofile:
- 修改Android.mk文件,打开后发现最后一句被注释,将最后一句前边的#号删掉即可
- 在子文件夹中存在总共12个Android.mk.bak文件,将其改为Android.mk。
- 重新编译 Android 源码,make -j16
遇到报错如下:
external/oprofile/opcontrol/opcontrol.cpp:141:21: error: 'MAX_EVENTS' was not declared in this scope int selected_events[MAX_EVENTS]; ^ external/oprofile/opcontrol/opcontrol.cpp:142:21: error: 'MAX_EVENTS' was not declared in this scope int selected_counts[MAX_EVENTS]; ^ external/oprofile/opcontrol/opcontrol.cpp: In function 'int setup_device()': external/oprofi