运行Oprofile需要源码和内核支持

首先源码中的Oprofile需要开启编译。在android5.0以下,Oprofileuserdebug版本中是默认开启的,官方镜像中则没有,所以需要下载源码编译为userdebug版本。在android5.0以上,Oprofile不是默认开启的,所以也需要下载源码,将其在源码中开启后,再编译为userbug版本才能使用。

开启方法如下(android5.1源码为例):

1)oprofileandroid源码external/oprofile路径中

2)首先修改Android.mk文件,打开后发现最后一句被注释,将最后一句前边的#号删掉即可

3)在子文件夹中存在总共12Android.mk.bak文件,将其改为Android.mk,开启编译。

源码准备完成。

之后需要内核的支持

关于内核的选择比较麻烦,需要根据cpu的制造商进行选择。

各种内核下载在如下网址:https://android.googlesource.com/

模拟器

模拟器使用的内核版本代号是goldfish,下载地址是

https://android.googlesource.com/kernel/goldfish/

1)使用命令:gitclonehttps://android.googlesource.com/kernel/goldfish

即可下载该类型内核

2)之后使用命令gitbranch-a列出该类型内核的所有版本,如图所示

3)关于版本选择,

Android5.0以上使用的一般是3.4版本的内核,Andorid5.0以下使用的是2.6.29版本的内核。

所以,android5.1的话,

使用命令:

gitcheckoutremotes/origin/android-goldfish-3.4

即可切换到该版本的分支上

4)之后进行内核源码编译

/android5.1/external/qemu/docs/目录下有个ANDROID-KERNEL.TXT文件,其中有详细介绍。

首先在内核源码路径下打开终端,内核编译需要用到编译器,编译器在android源码路径下有,所有我直接先切换到android源码路径下,输入

sourcebuild/envssetup.sh

lunch1

完成环境变量配置

之后切换到内核源码路径下

输入:

exportCROSS_COMPILE=arm-eabi-

exportARCH=arm

exportSUBARCH=arm

设定一些参数

然后使用

makegoldfish_armv7_defconfig

获取模拟器内核的默认编译配置

2.6.29内核编译时,使用的默认配置是makegoldfish_defconfig

5)正常的话使用make-j2即可编译,但是我们需要开启内核中的oprofile,所以使用如下命令

makemenuconfig

修改内核配置

首先开启如下两项

Generalsetup->Profilingsupport

Generalsetup->OProfilesystemprofiling

之后确定CONFIG_HW_PERF_EVENTS是否开启

由于依赖(dependon)没有开启,所以该选项也没有开启,所以先去开启PERF_EVENTS

Generalsetup—》KernelPerformanceEventsAndCounters—》Kernelperformanceeventsandcounters将该项开启

然后可以看到CONFIG_HW_PERF_EVENTS对应的

Enablehardwareperformancecountersupportforperfevents

已经开启了

之后选Exit退出,根据提示保存

之后就可以make-j2进行编译了

然后在内核目录的/goldfish/arch/arm/boot目录下,有生成的zImage内核文件。

然后运行命令

emulator-kernelpath/to/your/new/zImage

即可用该内核启动模拟器

Nexus6

由于Nexus6使用的是高通的芯片,所以下载如下版本的内核库

gitclonehttps://android.googlesource.com/kernel/msm

之后依旧列出所有分支

gitbranch-a

我们选择使用的android5.1,所以

gitcheckoutremotes/origin/android-msm-shamu-3.10-lollipop-mr1

即可完成内核下载

然后首先在内核源码路径下打开终端,内核编译需要用到编译器,编译器在android源码路径下有,所有我直接先切换到android源码路径下,输入

sourcebuild/envssetup.sh

lunch1

完成环境变量配置

之后切换到内核源码路径下

输入:

exportCROSS_COMPILE=arm-eabi-

exportARCH=arm

exportSUBARCH=arm

然后运行makeshamu_defconfig获取对应设备的默认配置

Oprofile在内核中没有默认开启,需要

makemenuconfig

进行开启

Generalsetup->Profilingsupport

Generalsetup->OProfilesystemprofiling

两项即可

但是实际使用时,却发现oprofile不能正常使用,通过调试内核,发现,在使用该内核在nexus6上时,内核获取的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目录下

然后重新编译源码,生成新的镜像,将镜像刷入nexus6中即可。

转载请注明出处:http://blog.csdn.net/lqc1992/article/details/48948325

附录:

Oprofile在内核中的调试方法:

在内核源码中使用

printk(KERN_CRIT“oprofile”);

pr_err(“oprofile”);

即可输入日志

然后内核放到真机或模拟器上运行

通过adbshell连接上

运行dmesg可以查看内核输出的信息

需要注意的是,和logcat类似,printk也有日志输出等级,pr_errprintk经过封装的方法。

更多相关文章

  1. 2014.01.21 ——— android 关联android-support源码
  2. Android(安卓)version and Linux Kernel version
  3. Android(安卓)给 app默认权限(不弹窗申请权限)
  4. 细数Android(安卓)Studio中使用junit4测试框架中的坑
  5. 编译android的linux内核
  6. android 拨打紧急号码,通话时开启免提功能实现
  7. Android内容提供者源码
  8. android源码下载方式
  9. 【30篇突击 android】源码统计四

随机推荐

  1. android 上调试动态库方法
  2. Android一些好的资源
  3. Android音频架构解析
  4. Android开发环境搭建教程
  5. android之Progress
  6. Android启动过程深入解析
  7. Android数据存储
  8. android:layout_weight的真实含义
  9. Android(安卓)Context 详解
  10. android环境搭建