Android(安卓)5.1 上运行Oprofile (虚拟机与nexus
运行Oprofile需要源码和内核支持
首先源码中的Oprofile需要开启编译。在android5.0以下,Oprofile在userdebug版本中是默认开启的,官方镜像中则没有,所以需要下载源码编译为userdebug版本。在android5.0以上,Oprofile不是默认开启的,所以也需要下载源码,将其在源码中开启后,再编译为userbug版本才能使用。
开启方法如下(android5.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)使用命令: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_err是printk经过封装的方法。
更多相关文章
- 2014.01.21 ——— android 关联android-support源码
- Android(安卓)version and Linux Kernel version
- Android(安卓)给 app默认权限(不弹窗申请权限)
- 细数Android(安卓)Studio中使用junit4测试框架中的坑
- 编译android的linux内核
- android 拨打紧急号码,通话时开启免提功能实现
- Android内容提供者源码
- android源码下载方式
- 【30篇突击 android】源码统计四