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%安全的,因为某些根设备可能已经损坏
低帧率检测可能是一个很好的实现方法。鉴于安卓设备种类繁多,它可能对低端设备有所帮助
看一看检测仿真器