如今的模擬器的功能太強大,從藍牙,傳感器等配件到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