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. 开机自启动脚本_Linux配置开机自启动执行脚本的两种方法
  2. zcmu1540(二分)
  3. Boost::context模块fiber的分段的测试程序
  4. (十三)算法设计思想之“动态规划”
  5. 机器学习——深度学习之卷积神经网络(CNN)——AlexNet卷积神经网络结构
  6. uni-app单个页面的生命周期函数
  7. 2022年轻人潮流爱好报告:被朋友圈高赞的神秘爱好,不烧钱还能脱单
  8. matlab grp2idx,求教:m-fold cross validation 在matlab下如何实现?
  9. 最全常见算法工程师面试题目整理
  10. [史]世界史上的6大古帝国
  11. python怎么算列表的平方_总算明了python如何求平方
  12. 谈Objective-C Block的实现(转载唐巧)
  13. aspose转pdf不显示中文_Word转PDF后有空白页是怎么回事?
  14. 判断一个数是否为质数的三种方法
  15. 从黄金时代到没落尽头,“寻求出售”的GoPro遭遇了什么?
  16. Spring Boot学习笔记(超详细)
  17. 【u-boot】u-boot-2016.09 make编译过程分析(二)
  18. 秒杀微服务实现抢购代金券功能
  19. mysql学习总结-初识+数据管理+增删改查+常用函数+事务理解+数据库设计+JDBC引入
  20. EasyUI datagrid列名包含特殊字符(如:%等),会导致表格错位

热门文章

  1. 如何测试nginx服务器性能测试,Nginx性能测试工具--httperf
  2. python延时函数 微秒_Python程序可显示当前时,分,秒和微秒
  3. 剑指offer第二版(leetcode)Java题解(不断更新)
  4. 8-14-粘包问题、(通过简单报头)解决粘包问题、定制复杂报头
  5. linux命令英文单词缩写,linux常用命令的英文单词缩写
  6. 天猫数据爬取解决找不到json文件的问题
  7. 三阶矩阵的lu分解详细步骤_计算方法(三)矩阵分解2-LU分解
  8. 计算机专业surface pro,surface pro4家庭版和专业版的不同
  9. linux系统rc路由配置_Linux下多播路由的实现
  10. surface pro4 java开发_写给那些想买Surface Pro4的童鞋们