文档章节

Android如何区别真机和模拟器

yizhihaohut
 yizhihaohut
发布于 2015/06/03 11:50
字数 565
阅读 10524
收藏 27

现在的模拟器的功能太强大,从蓝牙,传感器等配件到IMEI,Mac,以及手机硬件信息什么都可以模拟

为了防止用户利用模拟器模仿真机进行刷单,刷流量等恶意操作

需要获取设备返回的一些信息来鉴别设备的真伪。

下面是整理的模拟器和真机的区别

虽然大部分都可以模仿,伪造,但是如果综合所有维度来监控,应该不存在太大问题。


一,native方式。

通过c代码读取设备中的配置和硬件相关信息。


1,diskstats

获取闪存的分区状态信息。

int fd = open(“/proc/diskstats”, O_RDONLY);

bytes = read(fd, buf, bytes);

区别:真机下都有mmcblk0分区,但是模拟器没有分区信息。


2,mac地址。

通过socket和ioctl读取mac地址。

sockfd = socket(AF_INET, SOCK_DGRAM, 0);

ioctl(sockfd, SIOCGIFCONF, (char*)&ifc);

ioctl(sockfd, SIOCGIFADDR, &ifr[i])

ioctl(sockfd, SIOCGIFHWADDR, (char*)&ifr[i])


区别:真机可以获取wlan0的ip和mac地址,模拟器只能获取eth0的ip和mac地址;


3,有用的prop信息。

__system_property_get(key, buf);

区别: 模拟器没有ro.boot.serialno和ro.serialno属性,真机中为机器序列号。

模拟器 ro.hardware属性为goldfish,真机为各自的型号。


4,cpu信息。

int fd = open(“/proc/cpuinfo”, O_RDONLY);

bytes = read(fd, buf, bytes);

区别:模拟器中cpuinfo的硬件为Goldfish。


5,drivers

int fd = open(“/proc/tty/drivers”, O_RDONLY);

区别:模拟器中包含goldfish的驱动

 

6,模拟器特有文件。

int fd = open(“/dev/socket/qemud”, O_RDONLY);

int fd = open(“/dev/qemu_pipe”, O_RDONLY);

区别:模拟器专有的文件,真机中没有。


二,传统的方式:

通过Java层的代码获取,可以有以下方式:


1,IMEI和IMSI

IMEI  移动设备国际身份码。

IMSI  IMSI国际移动用户识别码,储存在SIM卡中

final TelephonyManager tm = (TelephonyManager) getBaseContext().getSystemService(Context.TELEPHONY_SERVICE);

String imei = tm.getDeviceId();

String imsi = tm.getSubscriberId();


设备1:354273055927169 / null(无卡)

设备2:862966024243759 / 460011040618938

模拟器:000000000000000 / 310260000000000


2,Serial序列号

String serial = android.os.Build.SERIAL;


设备1:4df78680771b117b

设备2:OBAI5HDQZPDIRCQG

模拟器:unknown


3,android_id

String android_id = Secure.getString(getContentResolver(), Secure.ANDROID_ID);

设备和模拟器都有,16位。


4,Mac地址

WifiManager wifimanage=(WifiManager)getSystemService(Context.WIFI_SERVICE);  WifiInfo wifiinfo= wifimanage.getConnectionInfo();

设备1:88:32:9b:1e:49:20

设备2:f8:a4:5f:fd:56:17

模拟器:null


© 著作权归作者所有

yizhihaohut
粉丝 7
博文 21
码字总数 19843
作品 0
松江
程序员
私信 提问
加载中

评论(2)

yizhihaohut
yizhihaohut 博主

引用来自“光索与诺”的评论

请问楼主是反作弊部门的么?
不是的 我们部门是做登陆的,需求比较少,所以会接一些很杂的需求来做。
光索与诺
光索与诺
请问楼主是反作弊部门的么?
Android 和 iOS 实体机和模拟器的差异

真机和模拟器 § 多点触摸 § 网络通话 § 摄像 § WiFi § 各种网络制式 § 蓝牙 模拟器只是实现了真机的大部分功能,任何应用在上线前都应该在实体机上进行验收测试。 另外客户端的性能测试...

12332111ss
2016/01/12
739
2
android adb命令行工具使用

启动和关闭ADB服务(adb start-server和adb kill-server) 经作者测试,模拟器在运行一段时间后,adb服务有可能(在Windows进程中可找到这个服务,该服务用来为模拟器或通过USB数据线连接的真...

ruigal
2012/07/31
350
0
真机测试相比模拟器测试好在哪?

对于开发者来说,机型的适配总是让人纠结。开发时,购买真机需要钱,市面上也有像Genymotion这样的模拟器,方便开发者使用的安卓模拟器。诚然模拟器是在缺乏真机的情况下比较靠谱的开发工具,...

12332111ss
2015/12/31
297
0
通过Linux Shell实现Android横竖屏切换

平时在开发过程中如何切换Android横屏或竖屏显示方式呢? Android123今天分别给出两种方法分别为快捷键兼容模拟器和Linux Shell在真机成功处理。 方法一、 在模拟器调试中通过Ctrl+F11可以切换...

鉴客
2011/11/23
1K
0
Flutter Android Studio开发环境的搭建

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 https://blog.csdn.net/jay100500/article/details/95040948 Flutter开发工具很多,有很多支...

范特西_jay
07/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Groovy单元测试框架spock数据驱动Demo

spock是一款全能型的单元测试框架。 上次文章分享了spock框架的基础功能的使用,在此基础上,我根据自己写的Groovy的封装方法、数据驱动以及一些Groovy的高级语法做了一些尝试。发现还是有一...

八音弦
23分钟前
3
0
linux 安装nvm,通过nvm安装node

1,nvm git地址点击打开链接,安装命令 curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash or Wget: wget -qO- https://raw.githubusercontent.com/cr......

JamesView
31分钟前
4
0
Spring Boot快速入门

简介 官方文档 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程。使用Spring boot以后,搭建一个spring应用和开发变得很简单。 Springboot...

快乐搬砖
45分钟前
5
0
关于看书看剧看电影

多看一些书,思想改变行为 改变一些观念。 一些好的电视剧和电影也要看一看,除了娱乐以外 还有的可以让人不那么单纯,人是很复杂的。 以后可以把自己看的一些剧 书的观后看啥的可以写写博客...

T型人才追梦者
45分钟前
4
0
数据流中的中位数

参考:https://sunweiguo.github.io/2019/03/18/%E5%89%91%E6%8C%87offer/%E3%80%90%E9%9D%A2%E8%AF%95%E9%A2%9863-%E6%95%B0%E6%8D%AE%E6%B5%81%E4%B8%AD%E7%9A%84%E4%B8%AD%E4%BD%8D%E6%95......

Garphy
46分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部