Chciałbym, aby mój kod działał nieco inaczej podczas uruchamiania na emulatorze niż podczas uruchamiania na urządzeniu. ( Na przykład użycie 10.0.2.2 zamiast publicznego adresu URL do automatycznego uruchomienia na serwerze programistycznym.) Jaki jest najlepszy sposób na wykrycie, kiedy aplikacja na Androida działa w emulatorze?
android
android-emulator
Joe Ludwig
źródło
źródło
android.os.Build
.Odpowiedzi:
A co z tym rozwiązaniem:
Zwróć uwagę, że niektóre emulatory podają dokładne specyfikacje rzeczywistych urządzeń, więc ich wykrycie może być niemożliwe.
Oto mały fragment, który możesz zrobić w APK, aby pokazać różne rzeczy na jego temat, abyś mógł dodać własne reguły:
źródło
Wydaje się, że jeden jest powszechny
Build.FINGERPRINT.contains("generic")
źródło
FINGERPRINT
wartości.No cóż, identyfikator Androida nie działa dla mnie, obecnie używam:
źródło
W oparciu o wskazówki z innych odpowiedzi jest to prawdopodobnie najbardziej niezawodny sposób:
isEmulator = "goldfish".equals(Build.HARDWARE)
źródło
isEmulator = Build.HARDWARE.contains("golfdish")
Google używa tego kodu we wtyczce Flutter do informacji o urządzeniu, aby ustalić, czy urządzenie jest emulatorem:
źródło
Co powiesz na poniższy kod, aby stwierdzić, czy Twoja aplikacja została podpisana za pomocą klucza debugowania? nie wykrywa emulatora, ale może działać w twoim przypadku?
źródło
BuildConfig.DEBUG
.Ten kod działa dla mnie
W przypadku, gdy urządzenie nie ma karty SIM, resetuje pusty ciąg znaków: „”
Ponieważ emulator Androida zawsze ponownie „Android” jako operator sieci, używam powyższego kodu.
źródło
Oba następujące są ustawione na „google_sdk”:
Dlatego powinno wystarczyć użycie jednej z poniższych linii.
lub
źródło
sdk_x86
.Wypróbowałem kilka technik, ale zdecydowałem się na nieco zmienioną wersję sprawdzania Build.PRODUCT, jak poniżej. Wydaje się, że różni się to nieco w zależności od emulatora, dlatego mam 3 testy, które obecnie mam. Wydaje mi się, że mogłem właśnie sprawdzić, czy product.contains („sdk”), ale uznałem, że poniższe sprawdzenie jest nieco bezpieczniejsze.
Do Twojej wiadomości - odkryłem, że mój Kindle Fire miał Build.BRAND = „rodzajowy”, a niektóre emulatory nie miały „Androida” dla operatora sieci.
źródło
I wystarczy spojrzeć na
_sdk
,_sdk_
lubsdk_
, lub nawet tylkosdk
część wBuild.PRODUCT
:źródło
contains("sdk")
? Jedyna różnica (poza tym, że jest szybsza) polega na tym,matches(".*_?sdk_?.*")
że jeśli przed lub po sdk znajduje się znak, musi to być znak podkreślenia „_”, który nie jest aż tak ważny do sprawdzenia.Nigdy nie znalazłem dobrego sposobu na sprawdzenie, czy jesteś w emulatorze.
ale jeśli potrzebujesz tylko detecetować, jeśli jesteś w środowisku programistycznym, możesz to zrobić:
Mam nadzieję, że to pomoże....
źródło
użyj tej funkcji:
źródło
Nie wiem, czy są lepsze sposoby na wykrycie emu, ale emulator będzie miał plik
init.goldfish.rc
w katalogu głównym.Jest to skrypt startowy specyficzny dla emulatora i nie powinien on być dostępny w wersji innej niż emulator.
źródło
Oto moje rozwiązanie (działa tylko wtedy, gdy na serwerze debugowania działa serwer WWW): Utworzyłem zadanie w tle, które uruchamia się po uruchomieniu aplikacji. Wygląda na http://10.0.2.2 a jeśli istnieje to zmienia parametr globalny (IsDebug) true. Jest to cichy sposób, aby dowiedzieć się, gdzie biegniesz.
z głównej działalności na Utwórz:
źródło
Z baterii emulator: źródłem zasilania jest zawsze ładowarka sieciowa. Temperatura wynosi zawsze 0.
I możesz użyć
Build.HOST
do rejestrowania wartości hosta, inny emulator ma inną wartość hosta.źródło
Inną opcją byłoby przyjrzenie się właściwości ro.hardware i sprawdzenie, czy jest ustawiona na złotą rybkę. Niestety wydaje się, że nie ma łatwego sposobu na zrobienie tego z Javy, ale jest to trywialne z C przy użyciu property_get () .
źródło
Powyższe sugerowane rozwiązanie do sprawdzenia
ANDROID_ID
działało dla mnie, dopóki nie zaktualizowałem dzisiaj do najnowszych narzędzi SDK wydanych z Androidem 2.2.Dlatego obecnie przełączyłem się na następujące rozwiązanie, które działa do tej pory z tą wadą, że musisz jednak ustawić uprawnienie odczytu PHONE_STATE (
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
)źródło
Wszystkie odpowiedzi w jednej metodzie
źródło
init.goldfish.rc
istnieje tylko w emulatorach; jest to dodatkowo dobry sprawdzian w przyszłości, oprócz szczegółów kompilacji.Znalazłem nowy emulator
Build.HARDWARE = "ranchu"
.Odniesienie: https://groups.google.com/forum/#!topic/android-emulator-dev/dltBnUW_HzU
Znalazłem też oficjalny sposób Androida, aby sprawdzić, czy emulator, czy nie. Myślę, że jest to dla nas dobre odniesienie.
Musimy
ScreenShapeHelper.IS_EMULATOR
sprawdzić, czy emulator.Mamy
Build.IS_EMULATOR
sprawdzić, czy emulator.Sposób, w jaki urzędnik sprawdza, czy emulator nie jest nowy, a także może niewystarczający, wspomniane powyżej również odpowiedzi.
Ale może to nam pokazać, że urzędnik zapewni sposób urzędnikowi, aby sprawdzić, czy emulator, czy nie.
Korzystając z wyżej wymienionych wszystkich sposobów, teraz możemy również skorzystać z dwóch sposobów sprawdzenia, czy emulator.
Jak uzyskać dostęp do
com.android.internal
pakietu i@hide
i poczekaj na oficjalny otwarty zestaw SDK.
źródło
Moja rekomendacja:
spróbuj tego z github.
Łatwy do wykrycia emulator Androida
Jak używać z przykładem:
źródło
możesz sprawdzić numer IMEI #, http://developer.android.com/reference/android/telephony/TelephonyManager.html#getDeviceId%28%29
jeśli przywołam na emulatorze ten zwrot 0. jednak nie ma dokumentacji, która by to zapewniła. chociaż emulator nie zawsze zwraca 0, wydaje się całkiem bezpieczne, że zarejestrowany telefon nie zwróci 0. co by się stało na urządzeniu z Androidem innym niż telefon, lub bez zainstalowanej karty SIM lub niezarejestrowanym na sieć?
wydaje się, że to zły pomysł, polegać na tym.
oznacza to również, że musisz poprosić o pozwolenie na odczytanie stanu telefonu, co jest złe, jeśli nie potrzebujesz go już do czegoś innego.
jeśli nie, to zawsze coś gdzieś przerzucasz, zanim w końcu wygenerujesz podpisaną aplikację.
źródło
0
na tablecie z Androidem lub telefonie bez karty SIM.Powinno to zwrócić wartość true, jeśli aplikacja działa na emulatorze.
Na co powinniśmy uważać, nie wykrywamy wszystkich emulatorów, ponieważ istnieje tylko kilka różnych emulatorów. Łatwo to sprawdzić. Musimy upewnić się, że rzeczywiste urządzenia nie zostaną wykryte jako emulator.
Korzystałem z aplikacji o nazwie „ Udostępnianie informacji o urządzeniu z Androidem ” ”, aby to sprawdzić.
W tej aplikacji możesz zobaczyć różnego rodzaju informacje o wielu urządzeniach (prawdopodobnie o większości urządzeń na świecie; jeśli urządzenia, którego używasz, brakuje na liście, zostanie ono dodane automatycznie).
źródło
W rzeczywistości ANDROID_ID na 2.2 zawsze jest równy 9774D56D682E549C (zgodnie z tym wątkiem + moje własne eksperymenty).
Więc możesz sprawdzić coś takiego:
Nie najładniejszy, ale spełnia swoje zadanie.
źródło
To działa dla mnie
źródło
Umieść plik w systemie plików emulatora; ponieważ plik nie będzie istniał na prawdziwym urządzeniu, powinien być stabilny, niezawodny i łatwy do naprawienia, gdy się zepsuje.
źródło
Zebrałem wszystkie odpowiedzi na to pytanie i opracowałem funkcję pozwalającą wykryć, czy Android działa na emulatorze vm / emulatorze:
Testowane na emulatorach, genymotion i Bluestacks (1 października 2015).
źródło
Sprawdzając odpowiedzi, żadna z nich nie działała podczas korzystania z emulatorów LeapDroid, Droid4x lub Andy,
Dla wszystkich przypadków działa to:
źródło
Ponieważ podstawowym mechanizmem emulacji Genymotion jest VirtualBox, który nie zmieni się w najbliższym czasie, uznałem następujący kod za najbardziej niezawodny:
źródło
Niezależnie od tego kodu użyć, aby zrobić wykrywanie emulatora, bardzo polecam pisanie testów jednostkowych na pokrycie wszystkich
Build.FINGERPRINT
,Build.HARDWARE
iBuild.MANUFACTURER
wartości, które zależą. Oto kilka przykładowych testów:... a oto nasz kod (dzienniki debugowania i komentarze zostały usunięte dla zwięzłości):
źródło
Inną opcją jest sprawdzenie, czy jesteś w trybie debugowania czy w trybie produkcyjnym:
if (BuildConfig.DEBUG) { Log.i(TAG, "I am in debug mode"); }
prosty i niezawodny.
Nie do końca odpowiedź na pytanie, ale w większości przypadków możesz rozróżnić sesje debugowania / testowania od sesji życiowych bazy użytkowników.
W moim przypadku ustawiłem Google Analytics na dryRun () w trybie debugowania, więc to podejście działa dla mnie całkowicie dobrze.
Dla bardziej zaawansowanych użytkowników jest inna opcja. warianty budowy stopni:
w pliku oceny aplikacji dodaj nowy wariant:
W kodzie sprawdź typ kompilacji:
Teraz masz możliwość zbudowania 3 różnych typów aplikacji.
źródło