Android如何區別真機和模擬器

如今的模擬器的功能太強大,從藍牙,傳感器等配件到IMEI,Mac,以及手機硬件信息什麼均可以模擬android

爲了防止用戶利用模擬器模仿真機進行刷單,刷流量等惡意操做socket

須要獲取設備返回的一些信息來鑑別設備的真僞。ui

下面是整理的模擬器和真機的區別ip

雖然大部分均可以模仿,僞造,可是若是綜合全部維度來監控,應該不存在太大問題。get


一,native方式。pip

經過c代碼讀取設備中的配置和硬件相關信息。io


1,diskstats監控

獲取閃存的分區狀態信息。ioc

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

相關文章
相關標籤/搜索