Сергей Asked:2020-09-07 19:34:08 +0000 UTC2020-09-07 19:34:08 +0000 UTC 2020-09-07 19:34:08 +0000 UTC 区分模拟器和物理设备 772 Xamarin我为Android和测试移动应用程序iOS,测试在真实设备和模拟器上进行。 然而,最近有必要区分在仿真器上运行的测试和在物理设备上运行的测试。 问题:有没有办法在测试过程中.apk或.ipa了解应用程序在哪里运行 - 在模拟器或真实设备上? 模拟器上是否有任何系统参数总是与真实设备不同? c# 1 个回答 Voted Best Answer Максим 2020-09-07T19:42:07Z2020-09-07T19:42:07Z 在模拟器上,这些行将返回 true: Build.PRODUCT.equals( "google_sdk" ); Build.MODEL.equals( "google_sdk" ); Build.HARDWARE.equals( "goldfish" ); Build.MANUFACTURER.equals( "unknown" ); 在 C# 中,这些将是行: global::Android.OS.Build.Product global::Android.OS.Build.Model global::Android.OS.Build.HardWare global::Android.OS.Build.Manufacturer 但这并不总是发生。 您可以试试这个(Java 中的示例): if(Build.PRODUCT.matches(".*_?sdk_?.*")){ //-- emulator -- }else{ //-- other device -- } 另一种方式(Java): TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE); String networkOperator = tm.getNetworkOperatorName(); if("Android".equals(networkOperator)) { // Emulator } else { // Device } 也就是说,如果您需要 100% 确定这是一个模拟器,则必须组合方法。例如 @AndroidCrop (Java) 函数: public static final boolean isEmulator() { int rating = 0; if ((Build.PRODUCT.equals("sdk")) || (Build.PRODUCT.equals("google_sdk")) || (Build.PRODUCT.equals("sdk_x86")) || (Build.PRODUCT.equals("vbox86p"))) { rating++; } if ((Build.MANUFACTURER.equals("unknown")) || (Build.MANUFACTURER.equals("Genymotion"))) { rating++; } if ((Build.BRAND.equals("generic")) || (Build.BRAND.equals("generic_x86"))) { rating++; } if ((Build.DEVICE.equals("generic")) || (Build.DEVICE.equals("generic_x86")) || (Build.DEVICE.equals("vbox86p"))) { rating++; } if ((Build.MODEL.equals("sdk")) || (Build.MODEL.equals("google_sdk")) || (Build.MODEL.equals("Android SDK built for x86"))) { rating++; } if ((Build.HARDWARE.equals("goldfish")) || (Build.HARDWARE.equals("vbox86"))) { rating++; } if ((Build.FINGERPRINT.contains("generic/sdk/generic")) || (Build.FINGERPRINT.contains("generic_x86/sdk_x86/generic_x86")) || (Build.FINGERPRINT.contains("generic/google_sdk/generic")) || (Build.FINGERPRINT.contains("generic/vbox86p/vbox86p"))) { rating++; } return rating > 4; }
在模拟器上,这些行将返回 true:
在 C# 中,这些将是行:
但这并不总是发生。
您可以试试这个(Java 中的示例):
另一种方式(Java):
也就是说,如果您需要 100% 确定这是一个模拟器,则必须组合方法。例如 @AndroidCrop (Java) 函数: