17

我想在 Android 应用程序的运行时确定它是否在BlueStacks Android 模拟器中运行。这样我就可以修改应用程序在 BlueStacks 中运行时的运行方式。

BlueStacks 不支持多点触控,所以我想实现一个替代我当前应用程序具有的标准捏到缩放功能的替代方案。

例如

If (appIsRunningInBlueStacks){
    mySurfaceView.enableMultiTouchAlternatives();
} else{
    mySurfaceView.enableMultiTouchFeatures();
}

确定 appIsRunningInBlueStacks 价值的可靠方法是什么?

编辑问题评论的答案摘要:

Ben,Taras,感谢您的建议。BlueStacks 的 Build.MODEL 等值为:

  • 型号:“GT-I9100”

  • 制造商:“三星”

  • 设备:“GT-I9100”

  • 产品:“GT-I9100”

这与三星 Galaxy SII 的型号相同,因此使用它并不理想,因为担心使用 SII 的所有用户都与 BlueStacks 上的用户相同。

CommonsWare,该应用程序继续在 BlueStacks 中运行,即使清单中的 <uses-feature> 用于多点触控。事实上(也回答了 iagreen 的问题)......

packageManager.hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN_MULTITOUCH_DISTINCT);

...返回真!我想这是可以预料的,因为模拟器确信它是三星 Galaxy SII!

因此,我们仍然无法可靠地检测应用程序是否在 BlueStacks 上运行,而不会将所有三星 Galaxy SII 用户放在同一个存储桶中。还有其他想法吗?

4

7 回答 7

4

您可以检查 Bluestacks 共享文件夹是否存在 /sdcard/windows/BstSharedFolder

    Boolean onBlueStacks()
        {
        File sharedFolder = new File(Environment
                .getExternalStorageDirectory().toString()
                + File.separatorChar
                + "windows"
                + File.separatorChar
                + "BstSharedFolder");

        if (sharedFolder.exists())
            {
            return true;
            }

        return false;
        }
于 2015-10-23T16:00:42.297 回答
2

我的 BlueStacks 版本将我的报告Build.ModelGT-N7100.

使用:android.opengl.GLES20.glGetString(android.opengl.GLES20.GL_RENDERER)我得到Bluestacks.

于 2015-01-23T20:00:53.500 回答
2

在尝试了所有在线可用的建议解决方案后,我们发现Google 的 SafetyNet Attestation API是检测 BlueStack(任何版本)和 NoxPlayer 等 VM 的唯一解决方案。

关心内容盗版(和其他安全问题)的应用程序可以过滤它们在 Google Play 上的可用性,就像Netflix 过滤器在 PlayStore 上的设备一样。

控制台的新“设备目录”部分包括一个名为“SafetyNet 排除”的选项,可用于防止“未通过完整性测试或未经 Google 认证的设备”下载特定应用程序:其中包括植根设备和运行自定义 ROM 的设备。

但是有一个问题,用户仍然会从交叉共享或其他分发系统中找到 APK,因此客户端必须SafetyNet Attestation API在应用级别实现。

它是如何工作的?

SafetyNet 会检查安装您的应用程序的设备上的软件和硬件信息,以创建该设备的配置文件。然后,该服务会尝试在已通过 Android 兼容性测试的设备型号列表中找到相同的配置文件。API 还使用这些软硬件信息来帮助您评估设备的基本完整性,以及调用应用程序的 APK 信息。此证明可帮助您确定特定设备是否已被篡改或以其他方式修改。

它是来自 Google 的(易于实施)付费 API,截至目前每天允许 10,000 次免费点击:\

如果有人对自己检测虚拟机感兴趣,这些是推荐启发式方法的好论文:

通过沙盒检测规避 Android 运行时分析

对虚拟机的愤怒:阻碍 Android 恶意软件的动态分析

于 2018-08-24T11:03:42.133 回答
1

可能为时已晚,但为了其他有同样问题的人:

public boolean isRunningOnEmulator() {
    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)
        || Build.PRODUCT.contains("vbox86p")
        || Build.DEVICE.contains("vbox86p")
        || Build.HARDWARE.contains("vbox86");
}
于 2018-03-23T08:23:36.977 回答
0

以上所有方法都不适用于BlueStacks 5。正确的方法是检查路径是否/mnt/windows/BstSharedFolder存在。它在 BlueStacks 4 和 5 上运行良好。

   fun checkFilesExist(files: Array<String>): Boolean {
        files.forEach {
            val file = File(it)
            if (file.exists()) {
                return true
            }
        }
        return false
    }
    
    fun isBlueStacks(): Boolean {
        val BLUE_STACKS_FILES = arrayOf(
            "/mnt/windows/BstSharedFolder"
        )
        return checkFilesExist(BLUE_STACKS_FILES)
    }

于 2022-01-07T01:44:59.377 回答
-1

这将是独一无二的。

Bluestack 中没有蓝牙设备。

因此,请尝试在 Bluestack 或任何模拟器上获取始终为“空”的蓝牙地址字符串。确保在项目清单上添加蓝牙权限。

BluetoothAdapter m_BluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

 String m_bluetoothAdd = m_BluetoothAdapter.getAddress();
于 2016-05-14T12:16:51.237 回答
-1

根据Regis 先生的回答,您可以在共享文件夹存在时检测到它。但是在 Bluestacks 4 中,使用file.exists()只会返回 false。这是因为共享文件夹没有权限(000----------)。但是在目录中列出文件会检测到该文件夹​​。

String path = Environment.getExternalStorageDirectory().toString();
Log.d("FILES", "Path: " + path);
File directory = new File(path);
File[] files = directory.listFiles();
for (File file : files) {
    if (file.getName().contains("windows")) {
        Log.d("FILES", "windows file exists, it's a bluestacks emu");
    }
}
于 2019-01-29T13:19:04.960 回答