现在的模拟器的功能太强大,从蓝牙,传感器等配件到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
以上就是对Android 区别真机和模拟器 方法的整理和对比,有需要的朋友可以参考一下.
本文向大家介绍VMware虚拟机三种网络模式区别,包括了VMware虚拟机三种网络模式区别的使用技巧和注意事项,需要的朋友参考一下 我们知道VMware也分几种版本,普通用户最常用的就是Workstation,但是不管使用哪种版本,我们都能发现在安装过程中让我们选择 网络模式。在默认情况下会选中桥接模式,但有用户会问其他模式是干什么用的?有时候选择了其他模式之后就不能上网了。今天小编就和大家一起探
本文向大家介绍Java线程池的几种实现方法和区别介绍,包括了Java线程池的几种实现方法和区别介绍的使用技巧和注意事项,需要的朋友参考一下 Java线程池的几种实现方法和区别介绍 使用:LinkedBlockingQueue实现线程池讲解 关于:RejectedExecutionHandler几种默认实现讲解 以上这篇Java线程池的几种实现方法和区别介绍就是小编分享给大家的全部内容了,希望能给大
有没有可以模拟各种机型的安卓模拟器推荐? 或者如何模拟刘海屏手机,
本文向大家介绍Android手机获取Mac地址的几种方法,包括了Android手机获取Mac地址的几种方法的使用技巧和注意事项,需要的朋友参考一下 最常用的方法,通过WiFiManager获取: 这个方法Android 7.0是获取不到的,返回的是null,其实是返回“02:00:00:00:00:00” 根据本地IP获取: 这个方法Android 7.0及其以下版本都可以获取到。 根据网络接口获
我试图为一个类编写一个单元测试,这个类使用带有库中的的Google vision API。问题是,由于某种原因,我的模拟仍然调用真正的方法,然后抛出一个NPE,这破坏了我的测试。我以前从未在模拟上见过这种行为,我想知道我是不是做错了什么,是不是Spock/Groovy中有bug,还是与Google lib有关?
在Azure中,有2个选项可用于创建虚拟机。A、 普通VM B.经典VM 有人知道这两种选择有什么区别吗?我们什么时候使用一个而不是另一个?