【问题标题】:How to restrict an APK not to get installed in Android Emulator/Simulator but in real device?如何限制 APK 不安装在 Android Emulator/Simulator 中,而是安装在真实设备中?
【发布时间】:2021-03-10 11:44:25
【问题描述】:

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

有没有办法只允许在真机上安装而不是在模拟器上安装???

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

提前致谢

【问题讨论】:

    标签: android android-emulator apk


    【解决方案1】:

    使用此功能:

    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 的 this

    容易检测的安卓模拟器

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

    如何使用示例:

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        【解决方案3】:

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

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

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

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

        【讨论】:

        • 感谢 Leon... 这个作品 if (android.os.Build.MODEL.equals(“sdk”))
        【解决方案4】:

        @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
        }
        

        【讨论】:

          猜你喜欢
          • 2018-02-07
          • 1970-01-01
          • 1970-01-01
          • 2015-10-23
          • 2015-07-17
          • 2011-05-31
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多