android应用程序在emulator vs设备上运行时是否可以检测到

android应用程序在emulator vs设备上运行时是否可以检测到,android,android-emulator,Android,Android Emulator,我开发了一个严重依赖于时间的游戏,当我在模拟器中运行它时,它的执行速度比我在手机上运行时要慢,这是可以理解的。这迫使我在游戏中增加所有的“统计数据”,这样我就可以在开发时真正“击败它”——在调试时,游戏是不可能赢的 是否有一个调用、变量或其他东西可以用来确定当前是否在模拟器上运行,而不是在设备上运行 我曾考虑尝试检测帧率是否较低。 我曾考虑尝试从某种内置系统字段中读取“设备名称” 但这两种方法都不是很好的追求方法 任何帮助都会很好 使用该值并与“sdk”进行比较。第一个想法:检查网络运营商,在模

我开发了一个严重依赖于时间的游戏,当我在模拟器中运行它时,它的执行速度比我在手机上运行时要慢,这是可以理解的。这迫使我在游戏中增加所有的“统计数据”,这样我就可以在开发时真正“击败它”——在调试时,游戏是不可能赢的

是否有一个调用、变量或其他东西可以用来确定当前是否在模拟器上运行,而不是在设备上运行

我曾考虑尝试检测
帧率是否较低。
我曾考虑尝试从某种内置系统字段中读取“设备名称”

但这两种方法都不是很好的追求方法


任何帮助都会很好

使用该值并与“sdk”进行比较。

第一个想法:检查网络运营商,在模拟器上,它始终等于“Android”。没有文档记录,只是猜测它每次都会工作

TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
String networkOperator = tm.getNetworkOperatorName();
if("Android".equals(networkOperator)) {
    // Emulator
}
else {
    // Device
}
第二个想法:制造商:

public boolean isEmulator() {
    return Build.MANUFACTURER.equals("unknown");
}
第三个想法:似乎是最好的,检查调试键:

static final String DEBUGKEY = 
      "get the debug key from logcat after calling the function below once from the emulator"; 




public static boolean signedWithDebugKey(Context context, Class<?> cls) 
{
    boolean result = false;
    try {
        ComponentName comp = new ComponentName(context, cls);
        PackageInfo pinfo = context.getPackageManager().getPackageInfo(comp.getPackageName(),PackageManager.GET_SIGNATURES);
        Signature sigs[] = pinfo.signatures;
        for ( int i = 0; i < sigs.length;i++)
        Log.d(TAG,sigs[i].toCharsString());
        if (DEBUGKEY.equals(sigs[0].toCharsString())) {
            result = true;
            Log.d(TAG,"package has been signed with the debug key");
        } else {
            Log.d(TAG,"package signed with a key other than the debug key");
        }

    } catch (android.content.pm.PackageManager.NameNotFoundException e) {
        return false;
    }

    return result;

} 
静态最终字符串调试键=
“从模拟器调用下面的函数一次后,从logcat获取调试密钥”;
公共静态布尔值signedWithDebugKey(上下文,类cls)
{
布尔结果=假;
试一试{
ComponentName comp=新的ComponentName(上下文,cls);
PackageInfo pinfo=context.getPackageManager().getPackageInfo(comp.getPackageName(),PackageManager.GET_签名);
签名sigs[]=pinfo.signatures;
对于(int i=0;i

从这里开始:

如果您使用的是谷歌API,您需要:

"google_sdk".equals( Build.PRODUCT );
如果没有,您将希望使用:

"sdk".equals( Build.PRODUCT );
较旧的(因为不推荐)方法是检查
ANDROID\u ID
,它在AVD上为空,但在API 7及更高版本上不起作用:

// ONLY WORKS ON 2.1 AND BELOW

 String android_id = Secure.getString(getContentResolver(), Secure.ANDROID_ID); 
  if (android_id == null) { 
      // Emulator!  
  } else { 
      // Device
  }  

Dan S给出了一个关于如何在模拟器上运行时进行检测的好答案。不过,有几点建议:

  • 与其依赖SDK中的某些东西,为什么不设置自己的标志呢?只需保留一个
    public final static boolean iSimulator
    ,根据环境将其从
    true
    更改为
    false
    ,并使用ifs和else构建代码。
    Build.DEVICE
    方法不是100%安全的,因为某些根设备可能已经损坏
  • 低帧率检测可能是一个很好的实现方法。鉴于安卓设备种类繁多,它可能对低端设备有所帮助
  • 看一看检测仿真器