我希望我的代码在模拟器上运行时与在设备上运行时略有不同。(,例如,使用10.0.2.2而不是公共URL自动针对开发服务器运行。)检测Android应用程序何时在模拟器中运行的最佳方法是什么?
发布于 2014-02-02 07:45:08
这个解决方案怎么样(here提供了SystemProperties
的类实现):
private var sIsProbablyRunningOnEmulator: Boolean? = null
fun isProbablyRunningOnEmulator(): Boolean {
var result = sIsProbablyRunningOnEmulator
if (result != null)
return result
// Android SDK emulator
result = (Build.FINGERPRINT.startsWith("google/sdk_gphone_")
&& Build.FINGERPRINT.endsWith(":user/release-keys")
&& Build.MANUFACTURER == "Google" && Build.PRODUCT.startsWith("sdk_gphone_") && Build.BRAND == "google"
&& Build.MODEL.startsWith("sdk_gphone_"))
//
|| 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")
//bluestacks
|| "QC_Reference_Phone" == Build.BOARD && !"Xiaomi".equals(Build.MANUFACTURER, ignoreCase = true) //bluestacks
|| Build.MANUFACTURER.contains("Genymotion")
|| Build.HOST=="Build2" //MSI App Player
|| Build.BRAND.startsWith("generic") && Build.DEVICE.startsWith("generic")
|| Build.PRODUCT == "google_sdk"
// another Android SDK emulator check
|| SystemProperties.getProp("ro.kernel.qemu") == "1"
sIsProbablyRunningOnEmulator = result
return result
}
请注意,一些模拟器伪造真实设备的确切规格,因此可能无法检测到它。我已经添加了我能添加的东西,但我不认为有100%的方法来检测它是否真的是一个仿真器。
下面是您可以在APK中创建的一小段代码,用于显示有关它的各种内容,因此您可以添加自己的规则:
textView.text = "FINGERPRINT:${Build.FINGERPRINT}\n" +
"MODEL:${Build.MODEL}\n" +
"MANUFACTURER:${Build.MANUFACTURER}\n" +
"BRAND:${Build.BRAND}\n" +
"DEVICE:${Build.DEVICE}\n" +
"BOARD:${Build.BOARD}\n" +
"HOST:${Build.HOST}\n" +
"PRODUCT:${Build.PRODUCT}\n"
发布于 2011-05-03 12:01:25
一个常见的sems是Build.FINGERPRINT.contains("generic")
发布于 2010-05-15 21:06:42
Android id对我不起作用,我现在使用的是:
"google_sdk".equals( Build.PRODUCT );
https://stackoverflow.com/questions/2799097
复制相似问题