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


猜你喜欢
- 写在前面:接下来很长一段时间的文章主要会记录一些项目中实际遇到的问题及对应的解决方案,在相应代码分析时会直指问题所在,不会将无关的流程代码贴
- java 中设计模式(值对象)的实例详解应用场景:在Java开发时,需要来回交换大量的数据,比如要为方法传入参数,也要获取方法的返回值,该如
- 大家好,我是狸小华,萌汉子一枚。今天给大家带来的是仿微信/支付宝的密码输入框。这个效果也出来有一段时间了,所以搜索一下还是有不少的网友实现,
- Style.xml的妙用Style.xml之于Android犹如css之于Jsp妙用<?xml version="1.0&q
- 健康检查是Spring Boot Actuator中重要端点之一,可以非常容易查看应用运行至状态。本文在前文的基础上介绍如何自定义健康检查。
- 1、声明一个测试对象import java.time.LocalDate;import java.util.List;import lomb
- 这篇文章主要介绍了Java如何利用return结束方法调用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要
- 在进行C#应用程序开发的过程中,经常需要多窗体之间进行数据通信,本文举几个例子,把几种常用的通信方式总结一下,窗体界面如下图所示: 
- 本文实例讲述了Android创建或升级数据库时执行的语句,如果是创建或升级数据库,请使用带List参数的构造方法,带SQL语句的构造方法将在
- 一般表单数据分为两类<form method="post" action="${pageContext.
- 前言DataGridView是开发Winform的一个列表展示,类似于表格。学会下面的基本特征用法,再辅以经验,基本功能开发没问题。基本的数
- C# 获取某个时间的0点0分和23点59分59秒,具体代码如下所示:C#获取当月第一天和最后一天当月第一天0时0分0秒:DateTime.N
- Java类加载基本过程详细介绍基本过程:根据类的全限定名称加载定义类的二进制字节流。将字节流代表的静态存储结构转化为方法区的运行时数据结构内
- 本文介绍了Maven+Tomcat8 实现自动化部署的方法,分享给大家,具体如下:1.配置tomcat-users.xml首先在Tomcat
- 闲暇之余,开发一个图片编辑小程序。程序主要特点就是可方便的对多个图像编辑,实现了一些基本的操作。本文主要介绍一下程序的功能、设计思路。执行程
- 通常浏览器都有将网页生成图片的功能,本文实例讲述了Winform实现将网页生成图片的方法。分享给大家供大家参考。具体方法如下:工具截图如下:
- 本文实例为大家分享了java实现录音播放的具体代码,供大家参考,具体内容如下需求:1.实现可以从麦克风进行录音2.可以停止录音3.实现播放录
- 注意:导包的时候API 11之前: android.text.ClipboardManagerAPI 11之后: android.conte
- 这里分享下我在日常开发中对 Gradle 的常用配置规则一、版本号配置当项目逐渐演进的过程中,主工程依赖的 Module 可能会越来越多,此
- 本文实例为大家分享了Android半圆环型进度效果的具体代码,供大家参考,具体内容如下package com.newair.ondrawte