11

希望您知道,可以借助 Astro 文件管理器等应用程序将安装在 Android 设备中的应用程序备份并存储为可安装文件(作为 APK 文件)。同样的 apk 也可以安装在 android 模拟器中。因此,其他人有机会轻松挖掘已安装应用程序的文件,如数据库、共享首选项等。

有没有办法只允许在真实设备中安装而不是在模拟器中安装???

我知道如果它是 ROOTED 设备,我们可以像在模拟器中一样访问应用程序的数据。即使我想知道我们是否可以限制在模拟器中安装 apk。

提前致谢

4

4 回答 4

8

使用这个功能:

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

为此:

if (isEmulator()) {
   // emulator
} else {
   //not emulator
}

我的建议:

从 github试试这个。

易于检测的android模拟器

  • 检查 Device Farm 中的真实设备 ( https://aws.amazon.com/device-farm/ )
  • 蓝叠
  • Genymotion
  • 安卓模拟器
  • 安迪 46.2.207.0
  • 逍遥游
  • Nox 应用播放器
  • 播放器
  • ......

如何使用示例:

EmulatorDetector.with(this)
                .setCheckTelephony(true)
                .addPackageName("com.bluestacks")
                .setDebug(true)
                .detect(new EmulatorDetector.OnEmulatorDetectorListener() {
                    @Override
                    public void onResult(boolean isEmulator) {

                    }
                });
于 2018-12-14T07:24:05.013 回答
5

没有通用的方法来做到这一点。毕竟,模拟器的工作是尽可能地表现得像真实设备一样,包括模拟来自摄像头、GPS 传感器等的输入。

如果您将清单设置为依赖于模拟器通常不支持的某些硬件,您可能会有所收获。例如:

<uses-feature android:name="android.hardware.sensor.accelerometer" 
              android:required="true" />

但实际上,如果您想防止人们在您的应用程序存储的数据中四处寻找,最好的解决方案是对其进行加密或混淆。

于 2013-04-25T11:25:56.367 回答
3

目前无法阻止 APK 安装在模拟器上。(过去可以通过向应用程序添加传感器要求来实现,但现在模拟器也可以模拟)

但是,在运行时,您应该能够使用以下检查来验证您的应用程序是否在模拟器上运行:

if (android.os.Build.MODEL.equals(“google_sdk”)) {
   // emulator
} else {
   //not emulator
}

您可以在创建数据库和 SharedPreference 文件等之前进行此检查。

于 2013-04-25T11:26:05.480 回答
1

@Saeed 的 Xamarin 版本

 public static bool 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);
        }

为此:

if (isEmulator()) {
   // emulator
} else {
   //not emulator
}
于 2020-08-25T08:07:28.190 回答