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
投稿

猜你喜欢

  • JetBrains发布java代码质量检测工具Qodana早期预览版

    2022-11-22 20:49:57
  • Android 沉浸式状态栏及悬浮效果

    2023-07-29 23:03:15
  • springboot整合EHCache的实践方案

    2023-08-23 23:48:31
  • java.util.concurrent.ExecutionException 问题解决方法

    2022-12-09 21:15:04
  • datagridview实现手动添加行数据

    2022-03-29 16:31:09
  • Android Glide图片加载(加载监听、加载动画)

    2022-08-27 08:31:24
  • 迅速掌握Java容器中常用的ArrayList类与Vector类用法

    2022-12-16 16:18:47
  • Spring IOC:CreateBean环节中的流程转换

    2022-06-10 12:28:31
  • Spring Cloud Alibaba Nacos Config加载配置详解流程

    2022-03-24 23:06:01
  • 如何在Android studio 中使用单例模式

    2023-03-17 21:00:38
  • Java集合删除元素ArrayList实例详解

    2022-11-09 19:12:39
  • JavaWeb简单文件上传流程的实战记录

    2023-04-02 09:14:59
  • 再议C#中的装箱与拆箱的问题详解

    2022-09-30 03:45:40
  • Mybatis中连接查询和嵌套查询实例代码

    2021-08-23 13:24:31
  • Android开发实现读取Assets下文件及文件写入存储卡的方法

    2023-02-07 15:42:21
  • C#使用Monitor类实现线程同步

    2021-07-20 03:01:14
  • MyBatis学习教程(五)-实现关联表查询方法详解

    2021-06-23 21:04:04
  • C# TabControl控件中TabPage选项卡切换时的触发事件问题

    2022-10-30 08:11:13
  • C# ListBox中的Item拖拽代码分享

    2022-04-12 14:06:41
  • c# 判断是否为空然后赋值的4种实现方法

    2021-06-06 22:01:12
  • asp之家 软件编程 m.aspxhome.com