Android 判断App运行在模拟器还是真机上的最终解决方案

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_39731011/article/details/87865778

     Android 判断App运行在模拟器还是真机上的最终解决方案

最近公司搞了一波送福利的活动,被人用模拟器恶意刷注册量了.

后来我经过研究和实测,得出以下方法,目前还没有发现有模拟器能突破这个检测,方法如下:

方法使用:


 
 
  1. if(Android_ID_Utils.notHasBlueTooth()
  2. ||Android_ID_Utils.notHasLightSensorManager( this)
  3. ||Android_ID_Utils.isFeatures()
  4. ||Android_ID_Utils.checkIsNotRealPhone()
  5. ||Android_ID_Utils.checkPipes()){
  6. ToastUtils.ToastLong( this, "检查到您的设备违规,将限制您的所有功能使用!");
  7. return;
  8. }

方法实体:


 
 
  1. /*
  2. *作者:赵星海
  3. *时间:2019/2/21 17:50
  4. *用途:判断蓝牙是否有效来判断是否为模拟器
  5. *返回:true 为模拟器
  6. */
  7. public static boolean notHasBlueTooth() {
  8. BluetoothAdapter ba = BluetoothAdapter.getDefaultAdapter();
  9. if (ba == null) {
  10. return true;
  11. } else {
  12. // 如果有蓝牙不一定是有效的。获取蓝牙名称,若为null 则默认为模拟器
  13. String name = ba.getName();
  14. if (TextUtils.isEmpty(name)) {
  15. return true;
  16. } else {
  17. return false;
  18. }
  19. }
  20. }
  21. /*
  22. *作者:赵星海
  23. *时间:2019/2/21 17:55
  24. *用途:依据是否存在光传感器来判断是否为模拟器
  25. *返回:true 为模拟器
  26. */
  27. public static Boolean notHasLightSensorManager(Context context) {
  28. SensorManager sensorManager = (SensorManager) context.getSystemService(context.SENSOR_SERVICE);
  29. Sensor sensor8 = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); //光
  30. if ( null == sensor8) {
  31. return true;
  32. } else {
  33. return false;
  34. }
  35. }
  36. /*
  37. *作者:赵星海
  38. *时间:2019/2/21 17:56
  39. *用途:根据部分特征参数设备信息来判断是否为模拟器
  40. *返回:true 为模拟器
  41. */
  42. public static boolean isFeatures() {
  43. return Build.FINGERPRINT.startsWith( "generic")
  44. || Build.FINGERPRINT.toLowerCase().contains( "vbox")
  45. || Build.FINGERPRINT.toLowerCase().contains( "test-keys")
  46. || Build.MODEL.contains( "google_sdk")
  47. || Build.MODEL.contains( "Emulator")
  48. || Build.MODEL.contains( "Android SDK built for x86")
  49. || Build.MANUFACTURER.contains( "Genymotion")
  50. || (Build.BRAND.startsWith( "generic") && Build.DEVICE.startsWith( "generic"))
  51. || "google_sdk".equals(Build.PRODUCT);
  52. }
  53. /*
  54. *作者:赵星海
  55. *时间:2019/2/21 17:58
  56. *用途:根据CPU是否为电脑来判断是否为模拟器
  57. *返回:true 为模拟器
  58. */
  59. public static boolean checkIsNotRealPhone() {
  60. String cpuInfo = readCpuInfo();
  61. if ((cpuInfo.contains( "intel") || cpuInfo.contains( "amd"))) {
  62. return true;
  63. }
  64. return false;
  65. }
  66. /*
  67. *作者:赵星海
  68. *时间:2019/2/21 17:58
  69. *用途:根据CPU是否为电脑来判断是否为模拟器(子方法)
  70. *返回:String
  71. */
  72. public static String readCpuInfo() {
  73. String result = "";
  74. try {
  75. String[] args = { "/system/bin/cat", "/proc/cpuinfo"};
  76. ProcessBuilder cmd = new ProcessBuilder(args);
  77. Process process = cmd.start();
  78. StringBuffer sb = new StringBuffer();
  79. String readLine = "";
  80. BufferedReader responseReader = new BufferedReader( new InputStreamReader(process.getInputStream(), "utf-8"));
  81. while ((readLine = responseReader.readLine()) != null) {
  82. sb.append(readLine);
  83. }
  84. responseReader.close();
  85. result = sb.toString().toLowerCase();
  86. } catch (IOException ex) {
  87. }
  88. return result;
  89. }
  90. /*
  91. *作者:赵星海
  92. *时间:2019/2/21 17:50
  93. *用途:检测模拟器的特有文件
  94. *返回:true 为模拟器
  95. */
  96. private static String[] known_pipes = { "/dev/socket/qemud", "/dev/qemu_pipe"};
  97. public static boolean checkPipes() {
  98. for ( int i = 0; i < known_pipes.length; i++) {
  99. String pipes = known_pipes[i];
  100. File qemu_socket = new File(pipes);
  101. if (qemu_socket.exists()) {
  102. Log.v( "Result:", "Find pipes!");
  103. return true;
  104. }
  105. }
  106. Log.i( "Result:", "Not Find pipes!");
  107. return false;
  108. }

如果您有什么建议的话,欢迎留言评论.谢谢.

### 回答1: 如果 Android Studio 无法运行 app,可能是因为以下原因之一: 1. 没有正确配置模拟器机设备。 2. 没有选择正确的运行目标。 3. 编译错误或缺少依赖项。 4. ADB(Android Debug Bridge)服务未启动或无法连接到设备。 建议检查上述原因并在网上搜索相关解决方案,或者在官方文档寻找帮助。 ### 回答2: Android Studio无法运行app可能有多种原因导致。下面是一些常见的可能原因和解决方法: 1. 设备连接问题:首先,确保你的设备通过USB正确连接到计算机,并且已经启用了开发者选项和USB调试模式。可以尝试使用不同的USB端口或者尝试使用不同的USB线缆来解决连接问题。 2. 编译错误:编译错误可能会导致无法运行app。在Android Studio的底部“Build”选项卡检查是否有编译错误。如果有错误,点击错误提示来查看具体的错误信息,并尝试解决它们。 3. Gradle构建问题:Gradle是Android项目的构建工具,在构建过程可能会出现问题。你可以尝试点击Android Studio右侧的“Gradle”选项,然后点击“Refresh”按钮来重新构建你的项目。 4. 设备不兼容:如果你的设备不兼容当前的Android版本或者你的app的最低API要求,那么你的app可能无法在该设备上运行。你可以在“app/build.gradle”文件检查和修改最低API要求来解决该问题。 5. 资源文件错误:如果你在编写布局文件或者资源文件时出现错误,可能会导致app无法正常运行。可以尝试检查你的布局文件和资源文件是否有任何错误或者语法问题。 6. 缺少依赖库:如果你在项目使用了第三方库或者依赖项,但是没有正确的将其添加到项目,那么app可能无法运行。在“app/build.gradle”文件检查是否正确添加了所有需要的依赖库。 如果以上方法都无法解决问题,你可以尝试重启Android Studio或者重新导入你的项目。同时,确保Android Studio和所有相关组件都是最新版本。如果问题仍然存在,你可以在论坛或者官方支持渠道寻求进一步的帮助。 ### 回答3: Android Studio无法运行App可能是由于以下几个原因导致的。 首先,检查一下是否已正确配置和安装了Android Studio。确保已正确安装JDK(Java Development Kit)和Android SDK,并且已正确配置了环境变量。如果未正确配置这些,可能会导致无法运行App。 另外,检查一下是否已正确配置了设备(如模拟器机设备)。在Android Studio,可以通过AVD Manager创建和管理模拟器,或通过USB连接机设备。确保设备已正确连接和配置,并且已启动。 此外,还需要检查一下项目配置是否正确。在Android Studio,打开项目的build.gradle文件,查看是否已正确配置了目标SDK版本、使用的依赖库等信息。如果这些信息不正确,可能会导致无法运行App。 最后,还需要检查一下代码是否存在错误。在Android Studio,可以通过Build菜单的"Make Project"选项编译项目,查看是否存在编译错误。如果存在错误,需要根据错误信息对代码进行修复,然后重新编译项目。 总之,如果Android Studio无法运行App,需要检查并确保已正确配置和安装Android Studio、正确配置设备、正确配置项目信息,并修复代码存在的错误。如果问题仍然存在,可以尝试重启Android Studio或重新安装Android Studio来解决问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值