android - 隐藏设备是模拟器的事实?
问题描述
最近,我看到了这篇Stackoverflow 帖子,描述了如何检查运行应用程序的设备是否是模拟器。该解决方案描述了检查设备指纹、型号和品牌:
public static boolean isEmulator() {
return Build.FINGERPRINT.startsWith("generic")
|| Build.FINGERPRINT.startsWith("unknown")
|| Build.MODEL.contains("google_sdk")
|| Build.MODEL.contains("Emulator")
|| Build.MODEL.contains("Android SDK built for x86")
|| Build.MANUFACTURER.contains("Genymotion")
|| (Build.BRAND.startsWith("generic") && Build.DEVICE.startsWith("generic"))
|| "google_sdk".equals(Build.PRODUCT);
}
现在我想知道是否有办法解决这个问题。如果我有一个标准的 Genymotion 设备,我该如何屏蔽我的仿真指纹、型号和品牌?
现在,如果您想知道我为什么要这样做,那只是为了尝试在模拟器上实现真正的设备体验,尤其是在拒绝在模拟器上运行的应用程序上。
解决方案
一般来说,有三种方法可以绕过模拟器检查:
- 修改应用程序并删除模拟器检查。
- 修改模拟器,使其伪装成真实设备。
- 修改应用程序为检测它是否在模拟器上运行而执行的系统调用
没有一种方法那么简单。但是,第三种方法可能是最简单的,因为有一些工具可以帮助您。
回到选项 1 - 它需要大量的开发技能来反编译应用程序(例如使用 apktool 将其反编译为 Smali 代码),识别模拟器检查,然后绕过可能存在的应用程序完整性检查。
选项 2 更加困难,因为它需要您修补和重新编译 Android 模拟器(可作为源代码获得)。
因此,从我的角度来看,只有选项 3 对您来说是现实的。但是,它仍然可能需要一些 Java 开发。
您可以将 XPosed 框架安装到您的模拟器上。它允许修改应用程序用于识别它在模拟器上运行的系统调用。有一些现有的 XPosed 模块用于隐藏设备是否已植根或在模拟器上运行。如果你幸运的话,有一个现成的模块可以开箱即用,让你在模拟器上运行你的应用程序。
推荐阅读
- bash - bash ${variable[*]}:2 中的这个语法是什么意思?
- asp.net-mvc - Azure Web App - 连接字符串在本地工作,但在服务器上不起作用[EntityException:底层提供程序在打开时失败]
- mysql - 获取子数小于 2 的记录
- scala - 通过 jenkins 集成 SonarQube 和替罪羊
- linden-scripting-language - lsl Linden 脚本语言错误 llSetPrimitiveParams 错误运行规则 #1 (PRIM_POINT_LIGHT): 超时
- java - Tomcat jdbc 连接池未强制执行 testOnBorrow 和/或 validationQueryTimeout
- c# - (UInt16)i 与 Convert.ToUInt16(i)
- laravel - 如何在 Laravel 的选择选项中使用“枚举”值?
- c# - C#:如何用从 PostgreSQL 表中获取的数据填充 ListView?
- javascript - jQuery:获取 HTML 5 drop 的位置