Ambiente do Xamarin.Android
Ambiente de execução
O ambiente de execução é o conjunto de variáveis de ambiente e propriedades do sistema Android que influenciam a execução do programa. As propriedades do sistema Android podem ser definidas com o comando adb shell setprop
, enquanto as variáveis de ambiente podem ser configuradas definindo-se a propriedade do sistema debug.mono.env
:
## Enable GREF logging
adb shell setprop debug.mono.log gref
## Set the MONO_LOG_LEVEL and MONO_LOG_MASK environment variables
## so that additional Mono messages will be written to `adb logcat`.
adb shell setprop debug.mono.env "'MONO_LOG_LEVEL=info|MONO_LOG_MASK=asm'"
As propriedades do sistema Android são definidas para todos os processos no dispositivo de destino.
Começando com o Xamarin.Android 4.6, as propriedades do sistema e as variáveis de ambiente podem ser definidas ou substituídas em uma base por aplicativo adicionando-se um arquivo de ambiente ao projeto. Um arquivo do ambiente é um arquivo de texto sem formatação em formato Unix com uma ação de build de AndroidEnvironment
.
O arquivo de ambiente contém linhas com o formato chave=valor.
Os comentários são linhas que começam com #
. As linhas em branco são ignoradas.
Se a chave começa com uma letra maiúscula, chave é tratada como uma variável de ambiente e setenv(3) é usado para definir a variável de ambiente para o valor especificado durante a inicialização do processo.
Se a chave começa com uma letra minúscula, a chave é tratada como uma propriedade do sistema Android e valor é o valor padrão: propriedades do sistema Android que controlam o comportamento de execução do Xamarin.Android são pesquisadas primeiro do repositório de propriedades do sistema Android e, se nenhum valor está presente, o valor especificado no arquivo de ambiente é usado. Isso é para permitir que adb shell setprop
seja usado para substituir valores provenientes do arquivo de ambiente para fins de diagnóstico.
Variáveis de ambiente do Xamarin.Android
O Xamarin.Android é compatível com a variável XA_HTTP_CLIENT_HANDLER_TYPE
, que pode ser definida por meio de adb shell setprop debug.mono.env
ou por meio da ação de build $(AndroidEnvironment)
.
XA_HTTP_CLIENT_HANDLER_TYPE
O tipo qualificado por assembly que deve herdar de HttpMessageHandler e é construído por meio do construtor padrão HttpClient()
.
No Xamarin.Android 6.1, essa variável de ambiente não é definida por padrão e HttpClientHandler é usada.
Como alternativa, o valor Xamarin.Android.Net.AndroidClientHandler
pode ser especificado para usar java.net.URLConnection
para acesso à rede, o que pode permitir o uso do TLS 1.2 quando o Android for compatível.
Adicionado no Xamarin.Android 6.1.
Propriedades do sistema Xamarin.Android
O Xamarin.Android é compatível com as seguintes variáveis do sistema, que podem ser definidas por meio de adb shell setprop
ou por meio da ação de build $(AndroidEnvironment)
.
debug.mono.debug
debug.mono.env
debug.mono.gc
debug.mono.log
debug.mono.max_grefc
debug.mono.profile
debug.mono.runtime_args
debug.mono.trace
debug.mono.wref
XA_HTTP_CLIENT_HANDLER_TYPE
debug.mono.debug
O valor da propriedade do sistema debug.mono.debug
é um inteiro. Se 1
, comporte-se "como se" o processo começasse com mono --debug
.
Geralmente, isso mostra informações de arquivo e de linha em rastreamentos de pilha, etc., sem a necessidade de o aplicativo ser iniciado de um depurador.
debug.mono.env
Contém uma lista de variáveis de ambiente separadas por |
.
debug.mono.gc
O valor da propriedade do sistema debug.mono.gc
é um inteiro.
Se 1
, as informações de GC devem ser registradas.
Isso é equivalente a fazer com que propriedade do sistema debug.mono.log
contenha gc
.
debug.mono.log
Controla quais informações adicionais o Xamarin.Android registrará em adb logcat
.
É uma cadeia de caracteres separada por vírgulas (,
), que contém um dos seguintes valores:
all
: imprimir todas as mensagens. Isso raramente é uma boa ideia, pois inclui mensagenslref
.assembly
: imprimir mensagens de análise de assembly e.apk
.gc
: imprimir mensagens relacionadas a GC.gref
: imprimir mensagens de referência global de JNI.lref
: imprimir mensagens de referência local de JNI.Observação
isso realmente enviará
adb logcat
como spam. No Xamarin.Android 5.1, isso também criará um arquivo.__override__/lrefs.txt
, que pode ficar gigantesco. Evitar.timing
: imprimir algumas informações de tempo de método. Isso também criará os arquivos.__override__/methods.txt
e.__override__/counters.txt
.
debug.mono.max_grefc
O valor da propriedade do sistema debug.mono.max_grefc
é um inteiro.
O valor dela substitui a contagem máxima de GREF padrão detectada para o dispositivo de destino.
Observação: isso só pode ser usado com adb shell setprop debug.mono.max_grefc
, pois o valor não estará disponível em tempo com um arquivo environment.txt.
debug.mono.profile
A propriedade do sistema debug.mono.profile
habilita o criador de perfil.
Ele equivale à opção mono --profile
e usa os mesmos valores que ela. (Consulte a página de manual do mono(1) para obter mais informações.)
debug.mono.runtime_args
A propriedade do sistema debug.mono.runtime_args
contém opções adicionais que devem ser analisadas por mono.
debug.mono.trace
A propriedade do sistema debug.mono.trace
habilita o rastreamento.
Ele equivale à opção mono --trace
e usa os mesmos valores que ela. (Consulte a página de manual do mono(1) para obter mais informações.)
Em geral, a recomendação é não usar. O uso de rastreamento enviará a saída adb logcat
como spam, deixando o comportamento do programa severamente mais lento; além disso, ele alterará o comportamento do programa (até mesmo incluindo a adição de condições de erro adicionais).
Às vezes, no entanto, ele permite que alguma investigação adicional seja executada...
debug.mono.wref
A propriedade do sistema debug.mono.wref
permite substituir o mecanismo de referência fraca JNI padrão detectado. Há dois valores compatíveis:
jni
: use referências fracas JNI, conforme criadas peloJNIEnv::NewWeakGlobalRef()
e destruídas porJNIEnv::DeleteWeakGlobalREf()
.java
: Use referências JNI Global que fazem referência ajava.lang.WeakReference
instâncias.
java
é usado, por padrão, até a API-7 e na API-19 (Kit Kat) com ART habilitado. (API-8 adicionou jni
referências e ART quebrou jni
referências.)
Essa propriedade do sistema é útil para testes e para certas formas de investigação. Em geral, ela não deve ser alterada.
XA_HTTP_CLIENT_HANDLER_TYPE
Introduzida pela primeira vez no Xamarin.Android 6.1, essa variável de ambiente declara a implementação HttpMessageHandler
padrão que será usada pelo HttpClient
. Por padrão, essa variável não é definida e o Xamarin.Android usa a HttpClientHandler
.
XA_HTTP_CLIENT_HANDLER_TYPE=Xamarin.Android.Net.AndroidClientHandler
Observação
O dispositivo Android subjacente deve ser compatível com TLS 1.2. O Android 5.0 e versões posteriores dão suporte à TLS 1.2
Exemplo
## Comments are lines which start with '#'
## Blank lines are ignored.
## Enable GREF messages to `adb logcat`
debug.mono.log=gref
## Clear out a Mono environment variable to decrease logging
MONO_LOG_LEVEL=