仅在物理设备而非模拟器上运行 Android 应用程序

Posted

技术标签:

【中文标题】仅在物理设备而非模拟器上运行 Android 应用程序【英文标题】:Run Android app Only on Physical Device not Emulator 【发布时间】:2017-07-29 21:56:50 【问题描述】:

如何让我的应用仅在物理 android 设备上运行,而不是在模拟器上运行。

当应用启动时,我想检查设备是物理设备还是模拟器。如果是模拟器,我希望我的应用停止。

我该怎么做?

【问题讨论】:

关闭模拟器 您是在问如何让应用在启动时无法在模拟器中运行,或者如何让其他人无法在模拟器中运行您的应用? ya.. 我想阻止其他人在模拟器上运行应用程序 【参考方案1】:

在您的启动活动的onCreate() 方法中,您可以检查设备是否在模拟器上运行,如果是,只需调用finish()。要检查您是否在模拟器上运行,您可以使用类似以下代码(取自this answer):

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);

您可以在网上找到许多其他用于检测模拟器环境的建议。我不知道有什么绝对万无一失的,但上面的内容非常强大。

【讨论】:

【参考方案2】:

你可以试试下面的方法

boolean isEmulator() 
        return (Build.BRAND.startsWith("generic") && Build.DEVICE.startsWith("generic"))
                || Build.FINGERPRINT.startsWith("generic")
                || Build.FINGERPRINT.startsWith("unknown")
                || Build.HARDWARE.contains("goldfish")
                || Build.HARDWARE.contains("ranchu")
                || Build.HARDWARE.equals("vbox86")
                || Build.HARDWARE.toLowerCase().contains("nox")
                || Build.MODEL.contains("google_sdk")
                || Build.MODEL.contains("Emulator")
                || Build.MODEL.contains("Android SDK built for x86")
                || Build.MODEL.toLowerCase().contains("droid4x")
                || Build.MANUFACTURER.contains("Genymotion")
                || Build.PRODUCT.contains("sdk_google")
                || Build.PRODUCT.contains("google_sdk")
                || Build.PRODUCT.contains("sdk")
                || Build.PRODUCT.contains("sdk_x86")
                || Build.PRODUCT.contains("vbox86p")
                || Build.PRODUCT.contains("emulator")
                || Build.PRODUCT.contains("simulator")
                || Build.PRODUCT.toLowerCase().contains("nox")
                || Build.BOARD.toLowerCase().contains("nox")
                || Build.BOOTLOADER.toLowerCase().contains("nox")
                || Build.SERIAL.toLowerCase().contains("nox");
    

它是 Flutter 项目(设备信息插件)中使用的代码的更新。检查它here

【讨论】:

以上是关于仅在物理设备而非模拟器上运行 Android 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 应用程序在 Android 模拟器上运行,但不在物理设备上(OnePlus 7T)

应用程序可以在模拟器上完美运行,但不能在物理设备上[在iOS 13.3.1上]

Flutter 应用程序在 android studio 模拟器上完美运行,但不会超过物理设备上的加载屏幕

模拟器或物理设备上的“未安装应用程序”android? [复制]

Xamarin Android Admob 测试广告仅在设备上显示一次

IOS模拟器问题应用程序仅在第二次启动时运行..