Android 区别真机和模拟器的几种方法

作者:lqh 时间:2022-05-19 14:13:44 

现在的模拟器的功能太强大,从蓝牙,传感器等配件到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,真机,模拟器
0
投稿

猜你喜欢

  • Mybatis Plus使用XML编写动态sql的超简易方法

    2022-02-20 01:49:16
  • Android SQLite数据库连接实现登录功能

    2022-09-04 01:51:46
  • Android之获取手机内部及sdcard存储空间的方法

    2022-11-11 13:10:18
  • Java实现登录和注册案例

    2022-02-27 04:57:46
  • springboot使用AOP+反射实现Excel数据的读取

    2022-12-10 05:25:55
  • java图片识别文字的方法

    2021-11-11 02:43:03
  • android中SwipeRefresh实现各种上拉,下拉刷新示例

    2022-06-14 17:18:03
  • Java开发必备的三大修饰符

    2021-10-19 10:11:01
  • 浅谈Java中IO和NIO的本质和区别

    2023-11-01 01:44:08
  • 解决FeignClient重试机制造成的接口幂等性

    2022-01-25 11:10:35
  • Java%(取模运算)全面讲解

    2022-03-02 06:11:34
  • C#遍历List并删除某个元素的方法

    2023-03-22 10:22:08
  • C#委托与事件初探

    2021-06-07 00:09:42
  • MyBatis中映射文件的使用案例代码

    2021-09-02 23:55:41
  • Android开发使用URLConnection进行网络编程详解

    2022-01-07 22:49:28
  • Android10 启动之SystemServer源码分析

    2021-08-15 05:38:13
  • java编程之基于SpringBoot框架实现扫码登录

    2023-02-14 02:39:28
  • C#净化版WebApi框架的实现

    2021-10-31 03:59:09
  • Java 爬虫工具Jsoup详解

    2022-04-11 03:46:16
  • c语言版本二叉树基本操作示例(先序 递归 非递归)

    2023-03-17 23:40:25
  • asp之家 软件编程 m.aspxhome.com