1. 前言

模拟器大家都应该很熟悉的吧!现在市面上的模拟器多的数不清,例如:雷电模拟器、夜神模拟器等等。而因为模拟器所搭载的Android系统是阉割过的,一些安全相关的功能都没有了。这就造成了一个安全问题,在模拟器运行的APP,可被动态调试、抓取数据等,从而增大APP被破解、敏感数据遭泄露的风险。所以一些公司就会禁止用户在模拟器中使用他们的APP。

那怎么检测APP当前运行的环境是模拟器呢?接下来我就介绍一个方案给大家吧!

2. 解决方案

网上相关资料其实蛮多的,但是因为模拟器的技术也在逐步增长,所以有些资料其实并没有完全有用,还是会出现无法检测某些模拟器。

我在GitHub上发现了一个开源项目 anti-emulator 。经测试可以检测出市面上较常用的模拟器。我将关键代码提取了出来,封装成一个module,详见 lib_anti_emulator。

我封装了两个方法,如下所示:

/*** 检测是否是模拟器** @param context 上下文* @return true:是模拟器;false:不是模拟器*/
public static boolean check(Context context) {try {return isTaintTrackingDetected(context) || isMonkeyDetected() || isDebugged()|| isQEmuEnvDetected(context);} catch (Exception e) {e.printStackTrace();return false;}
}/*** 检测是否是模拟器,安全模式<br>* 机制较弱,可避免部分真机被识别为模拟器,但是这也造成了有些模拟器无法被识别** @param context 上下文* @return true:是模拟器;false:不是模拟器*/
public static boolean checkSafely(Context context) {try {return isTaintTrackingDetected(context) || isMonkeyDetected() || isDebugged()|| isQEmuEnvSafeDetected(context);} catch (Exception e) {e.printStackTrace();return false;}
}

这两个方法的区分,看注释大家也应该很清楚了。而这也是 anti-emulator 的最大缺点,可以说是检测机制太强,或者说某些真机系统被魔改了,造成真机会被错误识别为模拟器的bug。所以如果使用 check 方法,为了避免用户无法正常使用APP,就需要我们再做一些处理,例如当被检测为模拟器时,可以弹出窗口,引导用户上报相关真机信息,然后后台审核并记录这些信息,将此用户所使用的真机加入白名单,免检测模拟器。

当然如果APP不需要这么强的检测机制的话,那就用 checkSafely 方法就行了。

3. 演示

我在我的 BlogDemo 中已加入演示代码,感兴趣的可以去看看。下面是演示的相关内容,演示环境是雷电模拟器。

3.1 标准模式

能够正确检测模拟器,提示“是模拟器”。

3.2 安全模式

不能够正确检测模拟器,提示“不是模拟器”。PS:雷电模拟器的仿真程度真高,所以平时大家调试APP的时候,如果不想用真机,可以试试雷电模拟器哦!比起 Android Studio 自带的模拟器,不会那么吃 CPU 和内存。


如果想进一步交流和学习的同学,可以加一下QQ群哦!

Android检测模拟器相关推荐

  1. Android恶意软件模拟器检测技术

    前言 下面的报告来自SophosLabs实验室的Android安全专家陈宇,还有来自Android组的成员William Lee, Jagadeesh Chandraiah and Ferenc Lá ...

  2. Android Studio模拟器启动时显示Could not automotically detect an ADB binary

    Android Studio模拟器启动时,会显示Could not automotically detect an ADB binary.的提示信息如图1所示. 图1 提示信息 图1中的提示信息的意思 ...

  3. Android反模拟器的总结

    0x00背景: 很多病毒都很先检测检测运行环境.如果不是沙箱环境就释放恶意代码. 我们来总结他检测了哪些模拟器的特性 0x01检测特定文件 检测一些系统特定属性,如检测当前设备手机号,设备Device ...

  4. android SDK模拟器环境搭建

    android SDK模拟器环境搭建 一.下载安装android SDK 两种方式: (1)官网下载(需FQ):https://developer.android.com/studio/index.h ...

  5. Android Studio 模拟器卡慢、占内存解决方法

    Android Studio 模拟器卡慢.占内存解决方法 Android Studio 模拟器卡慢.占内存解决方法 在使用Android virtual device来进行调试运行时会比较慢,性能也不 ...

  6. 介绍一款比Android原生模拟器还要快的模拟器Genymotion(转)

    源:介绍一款比Android原生模拟器还要快的模拟器Genymotion

  7. 更改android AVD模拟器创建路径位置的方法

    2019独角兽企业重金招聘Python工程师标准>>> 使用eclipse创建的android AVD模拟器,默认位置一般在用户文件夹下的.android文件夹中,并且路径不可有中文 ...

  8. android 检测字符串是否为合法域名

    今天,简单讲讲android里如何检测输入的字符串为合法的域名. 这个昨天搜索了很多资料,基本没有找到符合要求的代码.后来,花了很多时间,才解决了问题.这里记录一下. 一.检查输入域名是否合法. 具体 ...

  9. 解决Android 启动模拟器是出现“Failed to allocate memory: 8”错误提示

    Android 启动模拟器是出现" Failed to allocate memory: 8"错误,模拟器无法启动,如下: [2012-11-26 13:40:12 - TestS ...

最新文章

  1. 4-剑指offer: 把数组排成最小的数
  2. Elasticsearch和Hive整合,将hive数据同步到ES中
  3. WildFly 8的Camel子系统集成了Java EE –入门
  4. LeetCode 513. 找树左下角的值 思考分析
  5. Linux_2.6字符设备驱动实例
  6. kindeditor图片批量上传失败问题
  7. 多线程 NSThread 的使用
  8. 分享一波大厂面试题,助力大家拿个好Offer
  9. 我的世界服务器显示fps,我的世界帧数优化攻略 低配、fps低玩家必看
  10. 2021年1月PMP考试改版
  11. 【工具】Movielens数据集详细介绍
  12. termux python turtle_如何在termux上安装Python的turtle库?
  13. android qq登录分析,Android第三方登录之QQ登录
  14. Web of Science 数据库导出记录中各个字段的含义
  15. 视频教程-《信息学竞赛-C语言》 DAY30-清华尹成老师-C/C++
  16. 【三维目标检测】PointRCNN(一)
  17. 生日蛋糕-python实现
  18. CSDN:0分下载的技术资料的地址列表(带链接)方便大家下载啦!第六期
  19. pkg-config到底是个啥
  20. C加加中的数组与指针-基础语法

热门文章

  1. 项目0单节点的虚拟机做大数据开发(四万字全)
  2. 【爬虫实战项目】Python爬虫批量下载音乐飙升榜并保存本地(附源码)
  3. C语言编程>第一周 ⑦ 利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示
  4. Java生鲜电商平台-安全设计与架构
  5. CMakeLists.txt 构建 Qt工程
  6. 使用DBLINK查询时报ORA-00600: internal error code, arguments: [kzdlk_zt2 err]
  7. 双相障碍快速循环发作的治疗:证据回顾 | 文献述评
  8. 100条超搞笑的“雷人”QQ/MSN 签名
  9. 数据分析团队正成为手游公司的标配,但我为什么说解散他
  10. pycharm贪吃蛇