运行Oprofile需要源码和内核支持
首先源码中的Oprofile需要开启编译。在android 5.0以下,Oprofile在userdebug版本中是默认开启的,官方镜像中则没有,所以需要下载源码编译为userdebug版本。在android5.0以上,Oprofile不是默认开启的,所以也需要下载源码,将其在源码中开启后,再编译为userbug版本才能使用。
开启方法如下(android 5.1 源码为例):
1) oprofile在android源码external/oprofile路径中
2) 首先修改Android.mk文件,打开后发现最后一句被注释,将最后一句前边的#号删掉即可
3) 在子文件夹中存在总共12个Android.mk.bak文件,将其改为Android.mk,开启编译。
源码准备完成。
之后需要内核的支持
关于内核的选择比较麻烦,需要根据cpu的制造商进行选择。
各种内核下载在如下网址:https://android.googlesource.com/
模拟器使用的内核版本代号是goldfish,下载地址是
https://android.googlesource.com/kernel/goldfish/
1) 使用命令:git clone https://android.googlesource.com/kernel/goldfish
即可下载该类型内核
2) 之后使用命令 git branch -a 列出该类型内核的所有版本,如图所示
3) 关于版本选择,
Android 5.0以上使用的一般是3.4版本的内核,Andorid5.0以下使用的是2.6.29版本的内核。
所以,android5.1的话,
使用命令:
git checkout remotes/origin/android-goldfish-3.4
即可切换到该版本的分支上
4) 之后进行内核源码编译
在/android5.1/external/qemu/docs/目录下有个ANDROID-KERNEL.TXT文件,其中有详细介绍。
首先在内核源码路径下打开终端,内核编译需要用到编译器,编译器在android源码路径下有,所有我直接先切换到android源码路径下,输入
source build/envssetup.sh
lunch 1
完成环境变量配置
之后切换到内核源码路径下
输入:
export CROSS_COMPILE=arm-eabi-
export ARCH=arm
export SUBARCH=arm
设定一些参数
然后使用
make goldfish_armv7_defconfig
获取模拟器内核的默认编译配置
(2.6.29内核编译时,使用的默认配置是make goldfish_defconfig)
5) 正常的话使用make -j2 即可编译,但是我们需要开启内核中的oprofile,所以使用如下命令
make menuconfig
修改内核配置
首先开启如下两项
General setup->Profiling support
General setup->OProfile system profiling
之后确定CONFIG_HW_PERF_EVENTS是否开启
由于依赖(depend on)没有开启,所以该选项也没有开启,所以先去开启PERF_EVENTS
在General setup—》Kernel Performance Events And Counters—》Kernel performance events and counters 将该项开启
然后可以看到CONFIG_HW_PERF_EVENTS对应的
Enable hardware performance counter support for perf events
已经开启了
之后选Exit退出,根据提示保存
之后就可以make -j2 进行编译了
然后在内核目录的/goldfish/arch/arm/boot目录下,有生成的zImage内核文件。
然后运行命令
emulator -kernel path/to/your/new/zImage
即可用该内核启动模拟器
由于Nexus6使用的是高通的芯片,所以下载如下版本的内核库
git clone https://android.googlesource.com/kernel/msm
之后依旧列出所有分支
git branch -a
我们选择使用的android5.1 ,所以
git checkout remotes/origin/android-msm-shamu-3.10-lollipop-mr1
即可完成内核下载
然后首先在内核源码路径下打开终端,内核编译需要用到编译器,编译器在android源码路径下有,所有我直接先切换到android源码路径下,输入
source build/envssetup.sh
lunch 1
完成环境变量配置
之后切换到内核源码路径下
输入:
export CROSS_COMPILE=arm-eabi-
export ARCH=arm
export SUBARCH=arm
然后运行make shamu_defconfig获取对应设备的默认配置
Oprofile在内核中没有默认开启,需要
make menuconfig
进行开启
General setup->Profiling support
General setup->OProfile system profiling
两项即可
但是实际使用时,却发现oprofile不能正常使用,通过调试内核,发现,在使用该内核在nexus 6上时,内核获取的CPU信息异常,导致Oprofile不能正常启动,只能以time模式运行,导致出错。
解决方法,
修改内核msm/drivers/oprofile/ 目录下 oprofile_perf.c 文件
将其中oprofile_perf_init函数中
ops->cpu_type = op_name_from_perf_id();
修改为
ops->cpu_type = “arm/armv7”;
即可
之后直接编译
make -j4
生成的镜像在arch/arm/boot 中,将其中的zImage,zImage-dtb(主要)复制到android源码的device/moto/shamu-kernel目录下
然后重新编译源码,生成新的镜像,将镜像刷入nexus 6中即可。
转载请注明出处: http://blog.csdn.net/lqc1992/article/details/48948325
附录:
在内核源码中使用
printk(KERN_CRIT “oprofile”);
或
pr_err(“oprofile”);
即可输入日志
然后内核放到真机或模拟器上运行
通过adb shell连接上
运行dmesg可以查看内核输出的信息
需要注意的是,和logcat类似,printk也有日志输出等级,pr_err是printk经过封装的方法。