android真机和模拟器(emulator)的判断

最近收到领导需求要判断真机和模拟器。先前项目里是有的。可能当时能用,但现在都不能用了。然后,baidu上能够找到的其实都不能用了。包括说使用cache来区分cpu架构是哈佛结构还是冯诺伊曼结构来判断的——这个其实是最不靠谱的,因为硬件结构是会优化的,并且也不会是一成不变的。各位可以自行去查看一下arm架构cpu内核所采用的结构,包括pc的cpu所采用的结构就会明白我为什么这么说了。但还是要肯定一下最初提出这个思路并给出代码的同学,是真的很厉害,可惜思路偏了。但copy机器码到内存中再去执行的思路可以学习一下。

判断真机还是模拟器,通过cpu信息是个好的思路,因为至少目前来讲,intel和amd公司基本上是以pc的cpu为主,绝大部分手机的cpu使用的是arm架构的cpu。那个读取 /proc/cpuinfo的就算了,因为这个是个虚拟文件,下载linux的内核源码看一下就知道,修改它是很容易的。android系统就是基于linux的。x86架构的cpu提供了一个cpuid的汇编指令,但这个不适用于arm架构的。arm架构的cpu厂商信息是通过cp15协处理器来存放的,但这个我看不懂linux里面操作它获取信息的源码,放弃。

linux有提供很多有用的命令和信息。但有些命令到了android7.0之后去执行是需要root权限的,不过这个不要紧,android模拟器本身就不会不root,原因大家想一下也会明白。鉴于我们项目才使用上cpu这个判断方式,为了防止模拟器厂商马上就把这个判断给堵住了,我不太方便把判断代码直接贴出来,希望看到这文章的同学们能够理解。下面是几种方式的具体思路,任意一种都可以区分开来:

1,通过查看cpu信息,简单粗暴的认为当前环境为intel和amd公司的cpu时,就是在模拟器上跑。

2,通过查看是否有键盘

3,通过查看usb信息

4,通过查看硬盘容量

另,请在c++代码中使用 popen 命令来执行,具体命令里再配合 grep 命令。相信各位同学一定知道怎么做了。

下面是两行关键的伪代码。祝大家顺利。

FILE *fp = popen(YOUR_CMD, "r");

fgets(buf, buf_size, fp)

如果用尽全力折腾一段时间而又的确需要这个判断又实在不知道怎么写代码的话,可以邮件我: [email protected]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章