O Android 10 inclui mudanças de comportamento que podem afetar seu app.
As mudanças listadas nesta página se aplicam ao app quando executado
no Android 10, independente da targetSdkVersion do app. Teste
seu app e modifique-o conforme necessário para que ele ofereça suporte a essas mudanças.
Se o targetSdkVersion do app for 29 ou mais recente, você também precisará
oferecer suporte a outras mudanças. Leia as mudanças de comportamento para apps
com nível 29 como destino para saber mais.
Observação : além das mudanças listadas nesta página, o Android 10 introduz um grande número de mudanças e restrições baseadas em privacidade, incluindo as seguintes:
- Acesso em segundo plano à localização do dispositivo
- Início da atividade em segundo plano
- Informações de afinidade de contatos
- Ordem aleatória de endereço MAC
- Metadados da câmera
- Modelo de permissões
Essas mudanças afetam todos os apps e melhoram a privacidade do usuário. Para saber mais sobre como oferecer suporte a essas mudanças, consulte a página Mudanças de privacidade.
Restrições da interface não SDK
Para garantir a estabilidade e a compatibilidade dos apps, a plataforma começou a restringir quais interfaces externas ao SDK podem ser usadas no Android 9 (nível 28 da API). O Android 10 inclui listas atualizadas de interfaces não SDK restritas com base na colaboração com desenvolvedores Android e nos testes internos mais recentes. Nosso objetivo é garantir que alternativas públicas estejam disponíveis antes de restringirmos as interfaces não SDK.
Se você não segmentar o Android 10 (nível 29 da API), algumas dessas mudanças podem não afetar você imediatamente. No entanto, embora atualmente seja possível usar algumas interfaces não SDK (dependendo do nível da API de destino do app), o uso de qualquer método ou campo não SDK sempre apresenta um alto risco de corromper o app.
Se você não sabe se o app usa interfaces não SDK, é possível testá-lo para descobrir. Se ele depende de interfaces não SDK, planeje uma migração para alternativas SDK. No entanto, entendemos que alguns apps têm casos de uso válidos para interfaces não SDK. Se você não encontrar uma alternativa para deixar de usar uma interface não SDK em um recurso no app, solicite uma nova API pública.
Para saber mais, consulte Atualizações para restrições de interface não SDK no Android 10 e Restrições para interfaces não SDK.
Navegação por gestos
A partir do Android 10, os usuários podem ativar a navegação por gestos em todo o dispositivo. Se um usuário ativar a navegação por gestos, isso vai afetar todos os apps no dispositivo, independente de o app ser destinado ao nível desejado da API 29. Por exemplo, se o usuário deslizar a partir da borda da tela, o sistema vai interpretar esse gesto como uma navegação de retorno, a menos que um app substitua especificamente esse gesto em partes da tela.
Para tornar seu app compatível com a navegação por gestos, estenda o conteúdo dele de ponta a ponta e processe os gestos conflitantes de forma adequada. Para mais informações, consulte a documentação sobre navegação por gestos.
NDK
O Android 10 inclui as alterações do NDK descritas a seguir.
Objetos compartilhados não podem conter realocações de texto
O Android 6.0 (nível 23 da API) não permite o uso de realocações de texto em objetos compartilhados. O código precisa ser carregado como está e não pode ser modificado. Essa alteração melhora o tempo de carregamento e a segurança dos apps.
O SELinux aplica essa restrição a apps destinados ao Android 10 ou versões mais recentes. Se esses apps continuarem usando objetos compartilhados que contêm realocações de texto, eles correm um alto risco de falhar.
Alterações nos caminhos das bibliotecas Bionic e do vinculador dinâmico
A partir do Android 10, vários caminhos são links simbólicos em vez de arquivos normais. Os apps que dependem de caminhos que são arquivos normais podem falhar:
/system/lib/libc.so->/apex/com.android.runtime/lib/bionic/libc.so/system/lib/libm.so->/apex/com.android.runtime/lib/bionic/libm.so/system/lib/libdl.so->/apex/com.android.runtime/lib/bionic/libdl.so/system/bin/linker->/apex/com.android.runtime/bin/linker
Essas mudanças também se aplicam às variantes de 64 bits do arquivo, com
lib/ substituído por lib64/.
Para compatibilidade, os links simbólicos são fornecidos nos caminhos antigos. Por exemplo,
/system/lib/libc.so é um link simbólico para
/apex/com.android.runtime/lib/bionic/libc.so. Portanto,
dlopen(“/system/lib/libc.so”) continua funcionando, mas os apps vão encontrar
a diferença quando tentarem examinar as bibliotecas carregadas lendo
/proc/self/maps ou algo semelhante, o que não é comum, mas descobrimos que
alguns apps fazem isso como parte do processo de combate à invasão. Se sim, os
caminhos /apex/… precisam ser adicionados como caminhos válidos para os arquivos Bionic.
Binários/bibliotecas do sistema mapeados para memória somente de execução
A partir do Android 10, os segmentos executáveis de binários e bibliotecas do sistema
são mapeados na memória como somente execução (ilegíveis) como uma técnica de proteção
contra ataques de reutilização de código. Se o app realizar operações de leitura em
segmentos de memória marcados como somente execução, seja por bug, vulnerabilidade ou
inspeção intencional de memória, o sistema vai enviar um sinal SIGSEGV ao app.
Para identificar se esse comportamento causou uma falha, examine o arquivo de tombstone
relacionado em /data/tombstones/. Uma falha relacionada ao modo somente execução
contém a seguinte mensagem de cancelamento:
Cause: execute-only (no-read) memory access error; likely due to data in .text.
Para contornar esse problema e realizar operações como inspeção de memória, é
possível marcar segmentos somente de execução como leitura+execução chamando
mprotect(). No entanto, recomendamos que você volte para
somente execução depois, já que essa configuração de permissão de acesso oferece melhor
proteção para seu app e usuários.
Segurança
O Android 10 inclui as seguintes alterações de segurança.
TLS 1.3 ativado por padrão
No Android 10 e versões mais recentes, o TLS 1.3 é ativado por padrão para todas as conexões TLS. Confira alguns detalhes importantes sobre nossa implementação do TLS 1.3:
- Os conjuntos de criptografia do TLS 1.3 não podem ser personalizados. Os conjuntos de criptografia do TLS 1.3 com suporte são sempre
ativados quando o TLS 1.3 está ativado. Todas as tentativas de desativá-los chamando
setEnabledCipherSuites()serão ignoradas. - Quando o TLS 1.3 é negociado, os objetos
HandshakeCompletedListenersão chamados antes que as sessões sejam adicionadas ao cache da sessão. No TLS 1.2 e em outras versões anteriores, esses objetos são chamados depois que as sessões são adicionadas ao cache da sessão. - Em algumas situações em que as instâncias de
SSLEnginegeram umaSSLHandshakeExceptionem versões anteriores do Android, em vez disso, essas instâncias geram umaSSLProtocolExceptionno Android 10 e versões mais recentes. - O modo 0-RTT não é compatível.
Se quiser, você pode extrair um SSLContext que tenha o TLS 1.3 desativado chamando
SSLContext.getInstance("TLSv1.2").
Você também pode ativar ou desativar versões de protocolo em cada conexão, chamando setEnabledProtocols() em um objeto apropriado.
Certificados assinados com SHA-1 não são confiáveis no TLS
No Android 10, os certificados que usam o algoritmo de hash SHA-1 não são confiáveis nas conexões TLS. As ACs raiz não emitem esse certificado desde 2016 e não são mais confiáveis no Chrome nem nos outros principais navegadores.
Todas as tentativas de conexão vão falhar ao tentar se conectar a um site com um certificado usando SHA-1.
Mudanças e melhorias no comportamento do KeyChain
Alguns navegadores, como o Google Chrome, permitem que os usuários escolham um certificado quando um servidor TLS envia uma mensagem de solicitação de certificado como parte de um handshake de TLS. No Android 10 e versões mais recentes, os objetos KeyChain respeitam os emissores e os parâmetros de especificação da chave ao chamar KeyChain.choosePrivateKeyAlias() para mostrar aos usuários uma solicitação de seleção de certificado. Em particular, esse comando não contém opções que não atendem às especificações do servidor.
Se não houver certificados selecionáveis pelo usuário disponíveis, como acontece quando nenhum certificado corresponde à especificação do servidor ou um dispositivo não possui nenhum certificado instalado, o prompt de seleção de certificado não vai aparecer.
Além disso, não é necessário ter um bloqueio de tela do dispositivo para importar chaves
ou certificados de CA para um objeto KeyChain no Android 10 ou versões mais recentes.
Outras mudanças de TLS e criptografia
Houve várias pequenas mudanças nas bibliotecas de TLS e criptografia que entraram em vigor no Android 10:
- As criptografias AES/GCM/NoPadding e ChaCha20/Poly1305/NoPadding retornam tamanhos de buffer mais precisos de
getOutputSize(). - O pacote de criptografia
TLS_FALLBACK_SCSVé omitido das tentativas de conexão com um protocolo máximo de TLS 1.2 ou mais recente. Devido a melhorias nas implementações do servidor TLS, não recomendamos a tentativa de substituto externo ao TLS. Em vez disso, recomendamos confiar na negociação da versão do TLS. - ChaCha20-Poly1305 é um alias para ChaCha20/Poly1305/NoPadding.
- Nomes de host com pontos à direita não são considerados nomes de host SNI válidos.
- A extensão supported_signature_algorithms em
CertificateRequesté respeitada ao escolher uma chave de assinatura para respostas de certificado. - Chaves de assinatura opacas, como as do Android Keystore, podem ser usadas com assinaturas RSA-PSS no TLS.
Transmissões do Wi-Fi Direct
No Android 10, as seguintes transmissões relacionadas ao Wi-Fi Direct não são fixas:
Caso seu app dependia do recebimento dessas transmissões no momento de registro porque elas eram fixas, use o método get() apropriado na inicialização para conseguir as informações.
Funções do Wi-Fi Aware
O Android 10 adiciona suporte para facilitar a criação de soquetes TCP/UDP usando caminhos de dados
do Wi-Fi Aware. Para criar um soquete TCP/UDP que se conecte a um ServerSocket, o dispositivo
cliente precisa saber o endereço IPv6 e a porta do servidor. Antes,
isso precisava ser comunicado fora de banda, como usando mensagens de camada 2 do BT ou do Wi-Fi Aware,
ou descoberto em banda usando outros protocolos, como mDNS. Com o
Android 10, as informações podem ser comunicadas como parte da configuração da rede.
O servidor pode fazer uma destas ações:
- Inicialize um
ServerSockete defina ou receba a porta que será usada. - Especificar as informações da porta como parte da solicitação de rede Wi-Fi Aware.
O exemplo de código a seguir mostra como especificar informações de porta como parte da solicitação de rede:
Kotlin
val ss = ServerSocket() val ns = WifiAwareNetworkSpecifier.Builder(discoverySession, peerHandle) .setPskPassphrase("some-password") .setPort(ss.localPort) .build() val myNetworkRequest = NetworkRequest.Builder() .addTransportType(NetworkCapabilities.TRANSPORT_WIFI_AWARE) .setNetworkSpecifier(ns) .build()
Java
ServerSocket ss = new ServerSocket(); WifiAwareNetworkSpecifier ns = new WifiAwareNetworkSpecifier .Builder(discoverySession, peerHandle) .setPskPassphrase(“some-password”) .setPort(ss.getLocalPort()) .build(); NetworkRequest myNetworkRequest = new NetworkRequest.Builder() .addTransportType(NetworkCapabilities.TRANSPORT_WIFI_AWARE) .setNetworkSpecifier(ns) .build();
Em seguida, o cliente faz uma solicitação de rede Wi-Fi Aware para receber o IPv6 e a porta fornecida pelo servidor:
Kotlin
val callback = object : ConnectivityManager.NetworkCallback() { override fun onAvailable(network: Network) { ... } override fun onLinkPropertiesChanged(network: Network, linkProperties: LinkProperties) { ... } override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities) { ... val ti = networkCapabilities.transportInfo if (ti is WifiAwareNetworkInfo) { val peerAddress = ti.peerIpv6Addr val peerPort = ti.port } } override fun onLost(network: Network) { ... } }; connMgr.requestNetwork(networkRequest, callback)
Java
callback = new ConnectivityManager.NetworkCallback() { @Override public void onAvailable(Network network) { ... } @Override public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) { ... } @Override public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) { ... TransportInfo ti = networkCapabilities.getTransportInfo(); if (ti instanceof WifiAwareNetworkInfo) { WifiAwareNetworkInfo info = (WifiAwareNetworkInfo) ti; Inet6Address peerAddress = info.getPeerIpv6Addr(); int peerPort = info.getPort(); } } @Override public void onLost(Network network) { ... } }; connMgr.requestNetwork(networkRequest, callback);
SYSTEM_ALERT_WINDOW em dispositivos Android Go
Os apps executados em dispositivos Android 10 (versão Go) não podem receber a permissão
SYSTEM_ALERT_WINDOW. Isso ocorre porque o desenho de janelas de sobreposição usa muita memória,
o que é particularmente prejudicial ao desempenho de dispositivos Android
com pouca memória.
Se um app em um dispositivo Go com o Android 9 ou versões anteriores receber a permissão
SYSTEM_ALERT_WINDOW, ele vai manter a permissão mesmo que o
dispositivo seja atualizado para o Android 10. No entanto, os apps que ainda não têm essa
permissão não podem recebê-la após o upgrade do dispositivo.
Se um app em um dispositivo Go enviar uma intent com a ação
ACTION_MANAGE_OVERLAY_PERMISSION,
o sistema vai negar automaticamente a solicitação e levar o usuário a uma tela de
Configurações que informa que a permissão não é permitida porque
deixa o dispositivo mais lento. Se um app em um dispositivo Go chamar
Settings.canDrawOverlays(),
o método sempre vai retornar "false". Novamente, essas restrições não se aplicam a apps
que receberam a permissão SYSTEM_ALERT_WINDOW antes do upgrade do dispositivo
para o Android 10.
Avisos para apps voltados a versões anteriores do Android
Os dispositivos com o Android 10 ou versões mais recentes avisam os usuários na primeira vez que eles executam um app destinado ao Android 5.1 (nível 22 da API) ou versões anteriores. Se o app exigir que o usuário conceda permissões, ele também terá a oportunidade de ajustar as permissões do app antes que ele seja executado pela primeira vez.
Devido aos requisitos de API desejada do Google Play, um usuário só vê esses avisos ao executar um app que não foi atualizado recentemente. Para apps distribuídos por outras lojas, requisitos semelhantes de nível desejado da API vão entrar em vigor em 2019. Para mais informações sobre esses requisitos, consulte Como expandir os requisitos de nível desejado da API em 2019.
Conjuntos de criptografia CBC SHA-2 removidos
Os seguintes conjuntos de criptografia CBC SHA-2 foram removidos da plataforma:
TLS_RSA_WITH_AES_128_CBC_SHA256TLS_RSA_WITH_AES_256_CBC_SHA256TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
Esses conjuntos de criptografia são menos seguros do que os conjuntos semelhantes que usam GCM, e a maioria dos servidores é compatível com as variantes GCM e CBC desses conjuntos ou não é compatível com nenhuma delas.
Uso de apps
O Android 10 traz as seguintes mudanças de comportamento relacionadas ao uso de apps:
Melhorias no uso do app UsageStats: o Android 10 rastreia com precisão o uso de apps com o UsageStats quando eles são usados no modo de tela dividida ou picture-in-picture. Além disso, o Android 10 rastreia corretamente o uso de apps instantâneos.
Escala de cinza por app: o Android 10 pode definir um modo de exibição em escala de cinza para cada app.
Estado de distração por app: o Android 10 pode definir seletivamente os apps para um "estado de distração" em que as notificações são suprimidas e eles não aparecem como apps sugeridos.
Suspensão e reprodução: No Android 10, os apps suspensos não podem reproduzir áudio.
Alterações na conexão HTTPS
Se um app executado no Android 10 transmitir null para
setSSLSocketFactory(),
ocorre uma
IllegalArgumentException. Nas versões anteriores, transmitir null para setSSLSocketFactory()
tinha o mesmo efeito que a transmissão da fábrica
padrão atual.
A biblioteca android.preference está obsoleta
A biblioteca android.preference foi descontinuada no Android 10.
Em vez disso, os desenvolvedores precisam usar a biblioteca de preferências do AndroidX, que faz parte do Android
Jetpack. Para mais recursos que ajudam na migração e no
desenvolvimento, confira o Guia de
configurações atualizado, além do nosso app de exemplo
público
e da documentação de referência.
Mudanças na biblioteca de utilitários de arquivos ZIP
O Android 10 apresenta as mudanças abaixo nas classes do pacote java.util.zip, que processa arquivos ZIP. Essas mudanças tornam o comportamento da biblioteca mais
consistente entre o Android e outras plataformas que usam java.util.zip.
Inflater
Nas versões anteriores, alguns métodos na classe Inflater geravam uma
IllegalStateException se fossem
invocados após uma chamada para end().
No Android 10, esses métodos geram uma
NullPointerException.
ZipFile
No Android 10 e versões mais recentes, o construtor para
ZipFile
que usa argumentos do tipo File, int e Charset não gera uma
ZipException se o arquivo ZIP fornecido
não tiver arquivos.
ZipOutputStream
No Android 10 e versões mais recentes, o método
finish() em
ZipOutputStream não gera uma
ZipException se tentar gravar um
fluxo de saída para um arquivo ZIP que não contém arquivos.
Mudanças da câmera
Muitos apps que usam a câmera presumem que, se o dispositivo estiver em uma configuração de retrato, o dispositivo físico também estará na orientação retrato, conforme descrito em Orientação da câmera. Essa era uma suposição segura no passado, mas isso mudou com a expansão dos formatos disponíveis, como os dobráveis. Essa suposição nesses dispositivos pode levar a uma exibição incorretamente girada ou dimensionada (ou ambas) do visor da câmera.
Os aplicativos destinados ao nível desejado da API 24 ou versões mais recentes precisam definir explicitamente
android:resizeableActivity e fornecer a funcionalidade necessária para processar
a operação de várias janelas.
Acompanhamento de uso da bateria
A partir do Android 10,
o SystemHealthManager redefine
as estatísticas de uso da bateria sempre que o dispositivo é desconectado após um evento de carregamento
significativo. De modo geral, um evento de carregamento importante é quando o dispositivo
foi totalmente carregado ou quando ele passou de quase sem bateria para quase
totalmente carregado.
Antes do Android 10, as estatísticas de uso da bateria eram redefinidas sempre que o dispositivo era desconectado, não importando o quanto o Nível de bateria tinha mudado.
Obsolescência do Android Beam
No Android 10, o Android Beam, um recurso mais antigo para iniciar o compartilhamento de dados entre dispositivos usando a comunicação a curta distância (NFC), foi descontinuado. Também estamos descontinuando várias APIs de NFC relacionadas. O Android Beam continua disponível como opção para os fabricantes de dispositivos que quiserem usá-lo, mas não está mais em desenvolvimento ativo. No entanto, o Android vai continuar oferecendo suporte a outros recursos e APIs de NFC, e casos de uso como leitura de tags e pagamentos vão continuar funcionando como esperado.
Mudança de comportamento de java.math.BigDecimal.stripTrailingZeros()
BigDecimal.stripTrailingZeros() não preserva mais zeros à direita como um
caso especial se o valor de entrada for zero.
Mudanças de comportamento de java.util.regex.Matcher e Pattern
O resultado de split() foi alterado para não começar mais com uma String vazia
("") quando há uma correspondência de largura zero no início da entrada. Isso também
afeta String.split(). Por exemplo, "x".split("") agora retorna {"x"},
enquanto retornava {"", "x"} em versões mais antigas do Android.
"aardvark".split("(?=a)" agora retorna {"a", "ardv", "ark"} em vez de
{"", "a", "ardv", "ark"}.
O comportamento de exceção para argumentos inválidos também foi melhorado:
appendReplacement(StringBuffer, String)agora gera umaIllegalArgumentExceptionem vez deIndexOutOfBoundsExceptionse a substituiçãoStringterminar com uma barra invertida isolada, o que é ilegal. A mesma exceção agora é gerada se oStringde substituição terminar com um$. Antes, nenhuma exceção era gerada nesse cenário.replaceFirst(null)não chama maisreset()noMatcherse ele gerar umaNullPointerException.NullPointerExceptionagora também é gerado quando não há correspondência. Antes, ela só era gerada quando havia uma correspondência.start(int group),end(int group)egroup(int group)agora geram umaIndexOutOfBoundsExceptionmais geral se o índice do grupo estiver fora dos limites. Anteriormente, esses métodos geravamArrayIndexOutOfBoundsException.
O ângulo padrão para GradientDrawable agora é TOP_BOTTOM.
No Android 10, se você definir um
GradientDrawable
em XML e não fornecer uma medida de ângulo, a orientação do gradiente
vai usar como padrão
TOP_BOTTOM.
Essa é uma mudança em relação às versões anteriores do Android, em que o padrão era
LEFT_RIGHT.
Como solução alternativa, se você atualizar para a versão mais recente do AAPT2, a ferramenta vai definir uma medição de ângulo de 0 para apps legados se nenhuma medição for especificada.
Geração de registros para objetos serializados usando o SUID padrão
No Android 7.0 (nível 24 da API) e versões mais recentes, a plataforma fez uma correção
no serialVersionUID padrão para objetos
serializáveis. Essa correção
não afetou apps direcionados ao nível 23 da API ou versões anteriores.
A partir do Android 10, se um app for direcionado ao nível 23 da API ou anterior
e depender do serialVersionUID padrão antigo e incorreto, o sistema vai registrar
um aviso e sugerir uma correção de código.
Especificamente, o sistema registra um aviso se todas as seguintes condições forem verdadeiras:
- O app segmenta o nível desejado da API 23 ou anterior.
- Uma classe é serializada.
- A classe serializada usa o
serialVersionUIDpadrão, em vez de definir explicitamente umserialVersionUID. - O
serialVersionUIDpadrão é diferente doserialVersionUIDque seria usado se o app fosse direcionado ao nível desejado da API 24 ou mais recente.
Esse aviso é registrado uma vez para cada classe afetada.
A mensagem de aviso inclui uma sugestão de correção, que é definir explicitamente
o serialVersionUID como o valor padrão que seria calculado se
o app fosse direcionado ao nível desejado da API 24 ou mais recente. Ao usar essa correção, você garante que, se um objeto dessa classe for serializado em um app destinado ao nível 23 ou anterior da API,
ele será lido corretamente por apps destinados ao nível 24 ou mais recente
e vice-versa.
Mudanças em java.io.FileChannel.map()
No Android 10 e versões mais recentes, o FileChannel.map() não é compatível com
arquivos não padrão, como /dev/zero, que não podem ter o tamanho alterado usando
truncate(). As versões
anteriores do Android engoliam o errno retornado por
truncate(), mas o Android 10 gera uma IOException. Se você precisar do comportamento antigo,
use o código nativo.