Gostaria que meu código fosse executado de maneira um pouco diferente ao executar no emulador e ao executar em um dispositivo. ( Por exemplo , usando 10.0.2.2 em vez de um URL público para executar automaticamente em um servidor de desenvolvimento.) Qual é a melhor maneira de detectar quando um aplicativo Android está sendo executado no emulador?
android
android-emulator
Joe Ludwig
fonte
fonte
android.os.Build
.Respostas:
Que tal esta solução:
Observe que alguns emuladores falsificam especificações exatas de dispositivos reais; portanto, pode ser impossível detectá-lo.
Aqui está um pequeno trecho que você pode criar no APK para mostrar várias coisas sobre ele e adicionar suas próprias regras:
fonte
Um sems comum a ser
Build.FINGERPRINT.contains("generic")
fonte
FINGERPRINT
valor.Bem, o ID do Android não funciona para mim. No momento, estou usando:
fonte
Com base nas dicas de outras respostas, esta é provavelmente a maneira mais robusta:
isEmulator = "goldfish".equals(Build.HARDWARE)
fonte
isEmulator = Build.HARDWARE.contains("golfdish")
O Google usa esse código no plug-in de informações do dispositivo do Flutter para determinar se o dispositivo é um emulador:
fonte
Que tal algo como o código abaixo para saber se seu aplicativo foi assinado com a chave de depuração? não está detectando o emulador, mas pode funcionar para o seu propósito?
fonte
BuildConfig.DEBUG
.Este código funciona para mim
Caso esse dispositivo não possua um cartão SIM, ele retira a string vazia: ""
Como o emulador do Android sempre executa o "Android" como operador de rede, eu uso o código acima.
fonte
Eu tentei várias técnicas, mas resolvi usar uma versão revisada para verificar o Build.PRODUCT como abaixo. Isso parece variar bastante de emulador para emulador, é por isso que tenho as 3 verificações que tenho atualmente. Acho que poderia ter verificado se product.contains ("sdk"), mas achei a verificação abaixo um pouco mais segura.
Para sua informação, descobri que meu Kindle Fire tinha Build.BRAND = "generic" e alguns dos emuladores não tinham "Android" para a operadora de rede.
fonte
Os seguintes itens estão definidos como "google_sdk":
Portanto, deve ser suficiente usar uma das seguintes linhas.
ou
fonte
sdk_x86
.Acabei de olhar para
_sdk
,_sdk_
ousdk_
, ou mesmo apenassdk
parteBuild.PRODUCT
:fonte
contains("sdk")
? A única diferença (além de ser mais rápida) é que,matches(".*_?sdk_?.*")
se houver um caractere antes ou depois do sdk, ele deverá ser um sublinhado '_', que não é tão importante assim.Eu nunca encontrei uma boa maneira de saber se você está no emulador.
mas se você apenas precisar detectar se está em um ambiente de desenvolvimento, poderá fazer o seguinte:
Espero que esta ajuda ....
fonte
use esta função:
fonte
Não sei se existem maneiras melhores de detectar a emu, mas o emulador terá o arquivo
init.goldfish.rc
no diretório raiz.É o script de inicialização específico do emulador e não deve estar lá em uma compilação que não seja emulador.
fonte
Aqui está minha solução (ela funciona apenas se você executar um servidor Web em sua máquina de depuração): Criei uma tarefa em segundo plano que é iniciada quando o aplicativo é iniciado. Ele procura por http://10.0.2.2 e, se existir, altera um parâmetro global (IsDebug) para true. É uma maneira silenciosa de descobrir onde você está executando.
da atividade principal do onCreate:
fonte
Da bateria, o emulador: A fonte de energia é sempre o carregador CA. A temperatura é sempre 0.
E você pode usar
Build.HOST
para registrar o valor do host, emulador diferente tem valor de host diferente.fonte
Encontrei o novo emulador
Build.HARDWARE = "ranchu"
.Referência: https://groups.google.com/forum/#!topic/android-emulator-dev/dltBnUW_HzU
E também encontrei a maneira oficial do Android para verificar se o emulador ou não. Acho que é uma boa referência para nós.
Nós temos
ScreenShapeHelper.IS_EMULATOR
verificar se o emulador.Nós temos
Build.IS_EMULATOR
verificar se o emulador.A maneira como o funcionário verifica se o emulador não é novo, e também talvez não seja suficiente, as respostas acima também mencionaram.
Mas isso talvez nos mostre que o oficial fornecerá o caminho do oficial para verificar se o emulador ou não.
Como usamos todas as maneiras acima mencionadas, agora também podemos usar as duas maneiras para verificar se o emulador.
Como acessar o
com.android.internal
pacote e@hide
e aguarde o SDK oficial aberto.
fonte
Outra opção seria olhar para a propriedade ro.hardware e ver se ela está definida como peixinho. Infelizmente, não parece haver uma maneira fácil de fazer isso em Java, mas é trivial em C usando property_get () .
fonte
A solução sugerida acima para verificar se
ANDROID_ID
funcionou para mim até que eu atualizei hoje as ferramentas mais recentes do SDK lançadas com o Android 2.2.Portanto, atualmente mudei para a seguinte solução, que funciona até agora com a desvantagem, no entanto, é necessário colocar a permissão de leitura PHONE_STATE (
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
)fonte
Todas as respostas em um método
fonte
init.goldfish.rc
existe apenas em emuladores; além disso, é uma boa verificação, além dos detalhes da compilação.Minha recomendação:
tente isso no github.
Fácil de detectar emulador Android
Como usar com um exemplo:
fonte
você pode verificar o número IMEI, http://developer.android.com/reference/android/telephony/TelephonyManager.html#getDeviceId%28%29
se eu me lembro no emulador esse retorno 0. no entanto, não há documentação que eu possa encontrar que garanta isso. embora o emulador nem sempre retorne 0, parece bastante seguro que um telefone registrado não retorne 0. o que aconteceria em um dispositivo Android sem telefone, ou um sem um cartão SIM instalado ou um que não esteja registrado no momento rede?
parece que seria uma má ideia, depender disso.
isso também significa que você precisará pedir permissão para ler o estado do telefone, o que é ruim se você ainda não o exige para outra coisa.
caso contrário, sempre haverá uma inversão em algum lugar antes de você finalmente gerar seu aplicativo assinado.
fonte
0
em um tablet Android ou em um telefone sem cartão SIM.Isso deve retornar verdadeiro se o aplicativo estiver sendo executado em um emulador.
O que devemos ter cuidado é não detectar todos os emuladores, porque existem apenas vários emuladores diferentes. É fácil de verificar. Temos que garantir que os dispositivos reais não sejam detectados como um emulador.
Eu usei o aplicativo chamado " Android Device Info Share " para verificar isso.
Neste aplicativo, você pode ver vários tipos de informações de muitos dispositivos (provavelmente a maioria dos dispositivos no mundo; se o dispositivo que você estiver usando estiver ausente na lista, ele será adicionado automaticamente).
fonte
Verificando as respostas, nenhuma delas funcionou ao usar emuladores LeapDroid, Droid4x ou Andy,
O que funciona para todos os casos é o seguinte:
fonte
Na verdade, ANDROID_ID em 2.2 sempre é igual a 9774D56D682E549C (de acordo com este tópico + minhas próprias experiências).
Então, você pode verificar algo como isto:
Não é a mais bonita, mas faz o trabalho.
fonte
Isso funciona para mim
fonte
Coloque um arquivo no sistema de arquivos do emulador; como o arquivo não existe no dispositivo real, ele deve ser estável, confiável e fácil de corrigir quando quebrar.
fonte
Reuni todas as respostas sobre esta questão e criei uma função para detectar se o Android está sendo executado em um vm / emulator:
Testado em emulador, Genymotion e Bluestacks (1 de outubro de 2015).
fonte
Qualquer que seja o código que você usa para fazer a detecção de emulador, eu recomendo escrever testes de unidade para cobrir todas as
Build.FINGERPRINT
,Build.HARDWARE
eBuild.MANUFACTURER
valores que você está dependendo. Aqui estão alguns exemplos de testes:... e aqui está o nosso código (logs de depuração e comentários removidos por concisão):
fonte
Como o mecanismo de emulação subjacente do Genymotion é o VirtualBox e isso não mudará tão cedo, achei o código a seguir mais confiável:
fonte
Outra opção é verificar se você está no modo de depuração ou modo de produção:
if (BuildConfig.DEBUG) { Log.i(TAG, "I am in debug mode"); }
simples e confiável.
Não é totalmente a resposta da pergunta, mas na maioria dos casos você pode distinguir entre sessões de depuração / teste e sessões de vida da sua base de usuários.
No meu caso, defino o google analytics como dryRun () quando no modo de depuração, para que essa abordagem funcione totalmente bem para mim.
Para usuários mais avançados, há outra opção. variantes de construção gradle:
no arquivo de classificação do seu aplicativo, adicione uma nova variante:
No seu código, verifique o tipo de compilação:
Agora você tem a oportunidade de criar três tipos diferentes de seu aplicativo.
fonte