文章目录

前言

对于android开发者来说,模拟器是开发工具,但是对用户来说,可能就是​​薅羊毛​​​、​​找漏洞​​的赚钱工具。

不管是​​活动风控​​​还是​​内容保护​​​等等其他的出发点,应要求可能会要识别​​Android模拟器​​,甚至禁止模拟器登录或后续操作。

今天做个简单的探讨。

原理

识别模拟器的原理,其实就是找出​​模拟器​​​和​​真机​​的差别,但是这些差别体现在哪呢,比如运营商、手机卡、蓝牙、各种传感器等等。

但是现在的模拟器也是越来越厉害了,可以模拟​​不同品牌​​​的​​不同型号​​​的​​不同版本​​的手机,而且有蓝牙、可以打电话。

是不是很头疼,一不小心就会误判了,所以现在市面上有一种方案也是根据模拟器和真机差别的次数来做一个​​容错机制​​,比如模拟器和真机超过3个差别,就判为模拟器。

但是实际上,有的老版本手机甚至还不如模拟器先进…所以容错机制中还可以加上对用户的区别对待,个别用户不检测等等。

禁止模拟器安装apk

模拟器一般的cpu架构都是​​x86​​​的,我们可以在​​build.gradle​​​中去掉对​​x86​​的支持。

ndk {
// 设置支持的SO库架构
abiFilters 'armeabi-v7a', 'arm64-v8a'
}

当然也有一些手机可能也是x86的,这就误判了,因为目前来说还没有比较完善的解决方案,所以前面所说的​​容错机制​​就比较重要了。

仅仅是去掉x86的支持还是不够的,因为有的模拟器也不是x86架构,所以还是要进一步找出模拟器和真机的区别。

当然也可以不禁止,识别出来就行。

代码识别

这里还是原理中提到的,判断有没有蓝牙、序列号、传感器、cpu架构等等多重判断。

这里推荐一个库:​​CacheEmulatorChecker​

调用也比较简单,一行代码即可:

val emulator = EmulatorDetectUtil.isEmulator(this)
if (emulator) {
ToastUtils.show(this, "检测到您的设备可能为模拟器", Toast.LENGTH_LONG)
}

验证

禁止加代码识别的方案,目前验证过的模拟器:

  • 逍遥模拟器
  • 蓝叠模拟器
  • 夜神模拟器
  • 天天模拟器
  • 腾讯手游助手
  • 雷电模拟器
  • MUMU模拟器
  • 鲁大师手机模拟大师

以及各种主流手机品牌的主流机型,测试ok

最后

目前来说,还是没有完善且公开的解决方案,所以为避免误判,还是要根据自己的业务做相关的容错机制,比如给user加个是否要判断的字段,要的情况下再判断,否则放过。

看到最后,如果你有更好的方法,欢迎讨论。