может ли приложение определить, когда оно работает на эмуляторе против устройства? - PullRequest
2 голосов
/ 12 сентября 2011

Я разрабатываю игру, которая сильно зависит от времени, когда я запускаю ее в эмуляторе, она выполняется явно медленнее, чем когда я запускаю ее на своем телефоне. Это вынуждает меня повышать всю «статистику» в моей игре, так что я действительно могу «побить ее» во время разработки - при отладке игра не выигрывает.

Есть ли вызов, или переменная, или что-то, что я могу использовать, чтобы определить, работаю ли я в данный момент на эмуляторе, а не на устройстве.

Я пытался определить, низкий ли Framerate. Я подумал о том, чтобы попытаться прочитать «имя устройства» из какого-то встроенного системного поля.

Но ни один из них не выглядит очень хорошим методом для поиска.

Любая помощь будет отличной.

Ответы [ 4 ]

1 голос
/ 12 сентября 2011

Первая идея: проверь оператора сети, на эмуляторе он всегда равен «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;

} 

отсюда: Как определить, когда в эмуляторе запущено приложение Android?

1 голос
/ 12 сентября 2011

Если вы используете API Google, вы хотите:

"google_sdk".equals( Build.PRODUCT );

Если нет, вы захотите использовать:

"sdk".equals( Build.PRODUCT );

Более старый (с тех пор устарел) способ сделать это состоял в проверке ANDROID_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
  }  
1 голос
/ 12 сентября 2011

Используйте значение Build.DEVICE и сравните с "sdk".

0 голосов
/ 12 сентября 2011

Дэн С дал хороший ответ о том, как обнаружить при запуске на эмуляторе. Однако несколько советов:

  1. Вместо того, чтобы полагаться на что-то в SDK, почему бы просто не установить собственный флаг? Просто сохраните значение public final static boolean isEmulator, которое вы измените с true на false в зависимости от среды, и постройте свой код, используя ifs и elses вокруг него. Метод Build.DEVICE не является безопасным на 100%, так как некоторые корневые устройства могут его потерять.
  2. Может быть полезно реализовать обнаружение низкой частоты кадров. Учитывая широкий диапазон устройств Android, это может оказаться полезным для более дешевых устройств.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...