Saya ingin kode saya berjalan sedikit berbeda ketika berjalan di emulator daripada ketika berjalan di perangkat. ( Misalnya , menggunakan 10.0.2.2 alih-alih URL publik untuk berjalan melawan server pengembangan secara otomatis.) Apa cara terbaik untuk mendeteksi ketika aplikasi Android berjalan di emulator?
android
android-emulator
Joe Ludwig
sumber
sumber
android.os.Build
.Jawaban:
Bagaimana dengan solusi ini:
Perhatikan bahwa beberapa emulator memalsukan spesifikasi pasti dari perangkat nyata, jadi mungkin tidak mungkin untuk mendeteksinya.
Berikut cuplikan kecil yang dapat Anda buat di APK untuk menunjukkan berbagai hal tentangnya, sehingga Anda dapat menambahkan aturan Anda sendiri:
sumber
Satu sem yang biasa
Build.FINGERPRINT.contains("generic")
sumber
FINGERPRINT
nilai.Yah Android id tidak berfungsi untuk saya, saya saat ini menggunakan:
sumber
Berdasarkan petunjuk dari jawaban lain, ini mungkin cara yang paling kuat:
isEmulator = "goldfish".equals(Build.HARDWARE)
sumber
isEmulator = Build.HARDWARE.contains("golfdish")
Google menggunakan kode ini di plugin info-perangkat dari Flutter untuk menentukan apakah perangkat itu emulator:
sumber
Bagaimana dengan sesuatu seperti kode di bawah ini untuk mengetahui apakah aplikasi Anda ditandatangani dengan kunci debug? itu tidak mendeteksi emulator tetapi mungkin berhasil untuk tujuan Anda?
sumber
BuildConfig.DEBUG
.Kode ini berfungsi untuk saya
Jika perangkat tidak memiliki kartu sim, ia mengembalikan string kosong: ""
Karena Android emulator selalu mengembalikan "Android" sebagai operator jaringan, saya menggunakan kode di atas.
sumber
Saya mencoba beberapa teknik, tetapi memutuskan untuk memeriksa versi Build.PRODUCT yang sedikit direvisi seperti di bawah ini. Ini tampaknya sedikit berbeda dari emulator ke emulator, itu sebabnya saya memiliki 3 pemeriksaan yang saya miliki saat ini. Saya kira saya bisa saja memeriksa apakah product.contains ("SDK") tetapi berpikir pemeriksaan di bawah ini sedikit lebih aman.
FYI - Saya menemukan bahwa Kindle Fire saya memiliki Build.BRAND = "generik", dan beberapa emulator tidak memiliki "Android" untuk operator jaringan.
sumber
Kedua hal berikut ini disetel ke "google_sdk":
Jadi itu sudah cukup untuk menggunakan salah satu dari baris berikut.
atau
sumber
sdk_x86
.Saya hanya mencari
_sdk
,_sdk_
atausdk_
, atau bahkan hanyasdk
bagian dalamBuild.PRODUCT
:sumber
contains("sdk")
? Satu-satunya perbedaan (selain menjadi lebih cepat) adalah yangmatches(".*_?sdk_?.*")
mensyaratkan bahwa jika ada karakter sebelum atau setelah sdk, itu harus garis bawah '_', yang tidak terlalu penting untuk diperiksa.Saya tidak pernah menemukan cara yang baik untuk mengetahui apakah Anda berada di emulator.
tetapi jika Anda hanya perlu mendeteksi jika Anda berada dalam lingkungan pengembangan Anda dapat melakukan ini:
Semoga bantuan ini ....
sumber
gunakan fungsi ini:
sumber
Tidak tahu apakah ada cara yang lebih baik untuk mendeteksi emu, tetapi emulator akan memiliki file
init.goldfish.rc
di direktori root.Ini adalah skrip startup khusus emulator, dan seharusnya tidak ada pada build non-emulator.
sumber
Ini solusi saya (hanya berfungsi jika Anda menjalankan server web pada mesin debug Anda): Saya telah membuat tugas latar belakang yang dimulai ketika aplikasi dimulai. Itu mencari http://10.0.2.2 dan jika ada itu mengubah parameter global (IsDebug) menjadi true. Ini adalah cara diam untuk mengetahui di mana Anda berlari.
dari aktivitas utama onCreate:
sumber
Dari Baterai, emulator: Sumber daya selalu AC Charger. Temperatur selalu 0.
Dan Anda dapat menggunakan
Build.HOST
untuk mencatat nilai host, emulator yang berbeda memiliki nilai host yang berbeda.sumber
Saya menemukan emulator baru
Build.HARDWARE = "ranchu"
.Referensi: https://groups.google.com/forum/#!topic/android-emulator-dev/dltBnUW_HzU
Dan juga saya menemukan cara resmi Android untuk memeriksa apakah emulator atau tidak. Saya pikir itu referensi yang baik untuk kita.
Kami harus
ScreenShapeHelper.IS_EMULATOR
memeriksa apakah emulator.Kami harus
Build.IS_EMULATOR
memeriksa apakah emulator.Cara resmi untuk mengecek apakah emulator tidak baru, dan juga mungkin tidak cukup, jawaban di atas juga disebutkan.
Tapi ini mungkin menunjukkan kepada kita bahwa pejabat akan menyediakan cara resmi untuk memeriksa apakah emulator atau tidak.
Seperti menggunakan semua cara yang disebutkan di atas, saat ini kita juga dapat menggunakan dua cara untuk memeriksa apakah emulator.
Cara mengakses
com.android.internal
paket dan@hide
dan tunggu SDK resmi yang terbuka.
sumber
Pilihan lain adalah melihat properti ro.hardware dan melihat apakah diatur ke ikan mas. Sayangnya sepertinya tidak ada cara mudah untuk melakukan ini dari Java tetapi sepele dari C menggunakan property_get () .
sumber
Solusi yang disarankan di atas untuk memeriksa
ANDROID_ID
bekerja untuk saya sampai saya memperbarui hari ini ke alat SDK terbaru yang dirilis dengan Android 2.2.Karena itu saya saat ini beralih ke solusi berikut yang berfungsi sejauh ini dengan kerugiannya namun Anda harus meletakkan izin baca PHONE_STATE (
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
)sumber
Semua jawaban dalam satu metode
sumber
init.goldfish.rc
hanya ada di emulator; itu juga pemeriksaan yang bagus untuk maju di samping detail Build.Rekomendasi saya:
coba ini dari github.
Mudah mendeteksi emulator android
Cara menggunakan dengan Contoh:
sumber
Anda dapat memeriksa IMEI #, http://developer.android.com/reference/android/telephony/TelephonyManager.html#getDeviceId%28%29
jika saya ingat pada emulator ini kembali 0. Namun, tidak ada dokumentasi saya dapat menemukan yang menjamin itu. walaupun emulator mungkin tidak selalu mengembalikan 0, tampaknya cukup aman bahwa ponsel yang terdaftar tidak akan mengembalikan 0. apa yang akan terjadi pada perangkat android non-ponsel, atau yang tanpa kartu SIM terpasang atau yang saat ini tidak terdaftar pada jaringan?
Sepertinya itu ide yang buruk, bergantung pada itu.
itu juga berarti Anda harus meminta izin untuk membaca keadaan ponsel, yang buruk jika Anda belum memerlukannya untuk hal lain.
jika tidak, maka selalu ada membalik sedikit di suatu tempat sebelum Anda akhirnya menghasilkan aplikasi yang ditandatangani.
sumber
0
pada tablet Android, atau pada ponsel tanpa kartu SIM.Ini akan kembali benar jika aplikasi berjalan pada emulator.
Yang harus kita perhatikan adalah tidak mendeteksi semua emulator karena hanya ada beberapa emulator yang berbeda. Mudah diperiksa. Kita harus memastikan bahwa perangkat yang sebenarnya tidak terdeteksi sebagai emulator.
Saya menggunakan aplikasi yang disebut " Berbagi Info Perangkat Android " untuk memeriksa ini.
Pada aplikasi ini, Anda dapat melihat berbagai jenis informasi dari banyak perangkat (mungkin sebagian besar perangkat di dunia; jika perangkat yang Anda gunakan tidak ada dalam daftar, itu akan ditambahkan secara otomatis).
sumber
Memeriksa jawabannya, tidak ada yang berfungsi saat menggunakan emulator LeapDroid, Droid4x atau Andy,
Apa yang berfungsi untuk semua kasus adalah sebagai berikut:
sumber
Sebenarnya, ANDROID_ID pada 2.2 selalu sama dengan 9774D56D682E549C (sesuai dengan utas ini + eksperimen saya sendiri).
Jadi, Anda dapat memeriksa sesuatu seperti ini:
Bukan yang tercantik, tetapi berhasil.
sumber
Ini bekerja untuk saya
sumber
Letakkan file di sistem file emulator; karena file tidak akan ada pada perangkat nyata, ini harus stabil, dapat diandalkan dan mudah diperbaiki ketika rusak.
sumber
Saya telah mengumpulkan semua jawaban pada pertanyaan ini dan muncul dengan fungsi untuk mendeteksi apakah Android berjalan pada vm / emulator:
Diuji pada Emulator, Genymotion dan Bluestacks (1 Oktober 2015).
sumber
Kode apa pun yang Anda gunakan untuk melakukan deteksi emulator, saya sangat merekomendasikan penulisan unit test untuk mencakup semua
Build.FINGERPRINT
,Build.HARDWARE
danBuild.MANUFACTURER
nilai yang Anda andalkan. Berikut ini beberapa contoh tes:... dan inilah kode kami (debug log dan komentar dihapus untuk keringkasan):
sumber
Karena mesin emulasi yang mendasari untuk Genymotion adalah VirtualBox dan itu tidak akan berubah dalam waktu dekat saya menemukan kode berikut yang paling dapat diandalkan:
sumber
Pilihan lain adalah untuk memeriksa apakah Anda dalam mode debug atau mode produksi:
if (BuildConfig.DEBUG) { Log.i(TAG, "I am in debug mode"); }
sederhana dan andal.
Tidak sepenuhnya menjawab pertanyaan tetapi dalam kebanyakan kasus Anda mungkin ingin membedakan antara sesi debug / tes dan sesi kehidupan basis pengguna Anda.
Dalam kasus saya, saya mengatur google analytics ke dryRun () ketika dalam mode debug sehingga pendekatan ini berfungsi dengan baik untuk saya.
Untuk pengguna yang lebih mahir ada opsi lain. varian gradle build:
di file gradle aplikasi Anda tambahkan varian baru:
Di kode Anda, periksa tipe build:
Sekarang Anda memiliki kesempatan untuk membangun 3 jenis aplikasi Anda.
sumber