에뮬레이터에서 Android 애플리케이션이 실행 중인지 어떻게 알 수 있습니까? 에뮬레이터에서 실행할 때 장치에서

에뮬레이터에서 실행할 때 장치에서 실행할 때와 코드가 약간 다르게 실행되도록하고 싶습니다. ( 예를 들어 , 공개 URL 대신 10.0.2.2를 사용하여 개발 서버에 대해 자동으로 실행합니다.) 에뮬레이터에서 Android 애플리케이션이 실행될 때 감지하는 가장 좋은 방법은 무엇입니까?



답변

이 솔루션은 어떻습니까?

    fun isProbablyAnEmulator() = 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.BOARD == "QC_Reference_Phone" //bluestacks
            || Build.MANUFACTURER.contains("Genymotion")
            || Build.HOST.startsWith("Build") //MSI App Player
            || (Build.BRAND.startsWith("generic") && Build.DEVICE.startsWith("generic"))
            || "google_sdk" == Build.PRODUCT

일부 에뮬레이터는 실제 장치의 정확한 사양을 위조하므로 감지하지 못할 수도 있습니다.

여기에 APK에서 만들 수있는 작은 스 니펫이 나와 있습니다.

        textView.text = "FINGERPRINT:${Build.FINGERPRINT}\n" +
                "MODEL:${Build.MODEL}\n" +
                "MANUFACTURER:${Build.MANUFACTURER}\n" +
                "BRAND:${Build.BRAND}\n" +
                "DEVICE:${Build.DEVICE}\n" +
                "BOARD:${Build.BOARD}\n" +
                "HOST:${Build.HOST}\n" +
                "PRODUCT:${Build.PRODUCT}\n"


답변

하나의 일반적인 하나 Build.FINGERPRINT.contains("generic")


답변

글쎄, 안드로이드 ID가 나를 위해 작동하지 않습니다, 나는 현재 사용하고 있습니다 :

"google_sdk".equals( Build.PRODUCT );


답변

다른 답변의 힌트를 바탕으로 아마도 가장 강력한 방법 일 것입니다.

isEmulator = "goldfish".equals(Build.HARDWARE)


답변

Google은 Flutter 의 device-info 플러그인 에서이 코드를 사용 하여 기기가 에뮬레이터인지 확인합니다.

private boolean isEmulator() {
    return (Build.BRAND.startsWith("generic") && Build.DEVICE.startsWith("generic"))
        || Build.FINGERPRINT.startsWith("generic")
        || Build.FINGERPRINT.startsWith("unknown")
        || Build.HARDWARE.contains("goldfish")
        || Build.HARDWARE.contains("ranchu")
        || Build.MODEL.contains("google_sdk")
        || Build.MODEL.contains("Emulator")
        || Build.MODEL.contains("Android SDK built for x86")
        || Build.MANUFACTURER.contains("Genymotion")
        || Build.PRODUCT.contains("sdk_google")
        || Build.PRODUCT.contains("google_sdk")
        || Build.PRODUCT.contains("sdk")
        || Build.PRODUCT.contains("sdk_x86")
        || Build.PRODUCT.contains("vbox86p")
        || Build.PRODUCT.contains("emulator")
        || Build.PRODUCT.contains("simulator");
}


답변

아래 코드와 같이 앱이 디버그 키로 서명되었는지 여부는 어떻습니까? 에뮬레이터를 감지하지 못하지만 목적에 따라 작동 할 수 있습니까?

public void onCreate Bundle b ) {
   super.onCreate(savedInstanceState);
   if ( signedWithDebugKey(this,this.getClass()) ) {
     blah blah blah
   }

  blah
    blah
      blah

}

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;

} 


답변

이 코드는 나를 위해 작동합니다

TelephonyManager tm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
String networkOperator = tm.getNetworkOperatorName();
if("Android".equals(networkOperator)) {
    // Emulator
}
else {
    // Device
}

장치에 SIM 카드가없는 경우 빈 문자열을 다시 조정합니다 : “”

Android 에뮬레이터는 항상 “Android”를 네트워크 운영자로 재조정하므로 위 코드를 사용합니다.