Android 5.1 上运行Oprofile (虚拟机与nexus

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

 

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

 

开启方法如下(android 5.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) 使用命令: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

即可用该内核启动模拟器

 

Nexus 6

由于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

附录:

Oprofile在内核中的调试方法:

在内核源码中使用

printk(KERN_CRIT “oprofile”);

pr_err(“oprofile”);

即可输入日志

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

通过adb shell连接上

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

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

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值