O Android 9 (API de nível 28) introduz diversas mudanças ao sistema Android.
As mudanças de comportamento a seguir se aplicam exclusivamente a apps destinados ao
nível 28 da API ou mais recente. Apps que definem targetSdkVersion
para o nível 28 da API ou
mais recente precisam ser modificados
para oferecer suporte a esses comportamentos de forma adequada, quando aplicável.
Para ver as mudanças que afetam todos os apps executados no Android 9, independentemente do nível de API ao qual eles são direcionados, consulte Mudanças de comportamento: todos os apps.
Serviços em primeiro plano
Os apps direcionados ao Android 9 ou a versões mais recentes que usam serviços em primeiro plano precisam solicitar
a permissão
FOREGROUND_SERVICE
. Essa é uma permissão normal,
então o sistema a concede automaticamente ao app solicitante.
Se um app destinado ao Android 9 ou versões mais recentes tentar criar um serviço em primeiro plano sem
solicitar FOREGROUND_SERVICE
,
o sistema gerará uma SecurityException
.
Mudanças de privacidade
Caso seu app seja destinado ao Android 9, é importante lembrar das seguintes mudanças de comportamento. Essas atualizações das informações de DNS e número de série do dispositivo aumentam a privacidade do usuário.
Suspensão do número de série da versão
No Android 9, Build.SERIAL
está
sempre definido como "UNKNOWN"
para proteger a privacidade dos usuários.
Se o app precisar acessar o número de série do hardware de um dispositivo,
solicite a
permissão
READ_PHONE_STATE
e chame
getSerial()
.
Privacidade do DNS
Os aplicativos voltados ao Android 9 devem respeitar as APIs de DNS privadas. Em particular, os apps precisam garantir que, se o resolvedor do sistema estiver usando DNS sobre TLS, qualquer cliente DNS integrado use o DNS criptografado para o mesmo nome de host que o sistema ou seja desativado em favor do resolvedor do sistema.
Mudanças na segurança do framework
O Android 9 inclui várias mudanças de comportamento que melhoram a segurança do app, mas elas só entram em vigor se o app é direcionado ao nível 28 da API ou mais recente.
TLS de rede ativo por padrão
Se o app for direcionado ao Android 9 ou versões mais recentes, o método
isCleartextTrafficPermitted()
retornará false
por padrão. Se o app precisar ativar texto não criptografado para
domínios específicos, defina cleartextTrafficPermitted
de forma explícita como true
para esses domínios na Configuração de segurança
de rede do app.
Diretórios de dados na Web separados por processo
Para melhorar a estabilidade do app e a integridade dos dados no Android 9, os apps não podem
compartilhar um único diretório de dados
WebView
entre
vários processos. Normalmente,
esses diretórios de dados armazenam cookies, caches HTTP e outros armazenamentos permanentes e
temporários relacionados à navegação na Web.
Na maioria dos casos, o app precisa usar classes do pacote
android.webkit
, como
WebView
e
CookieManager
, em apenas um
processo. Por exemplo, mova todos
os objetos Activity
que usam um WebView
para o mesmo processo. É possível aplicar a regra de "apenas um processo"
de forma mais rigorosa chamando
disableWebView()
nos
outros processos do app. Essa chamada impede que WebView
seja inicializado
nesses outros processos por engano, mesmo que ele esteja sendo chamado em uma biblioteca
dependente.
Se o app precisar usar instâncias de
WebView
em mais de um processo,
você precisará atribuir um sufixo exclusivo de diretório de dados para cada processo, usando o método
WebView.setDataDirectorySuffix()
, antes de usar uma determinada instância de WebView
nesse processo. Esse método
coloca dados da Web de cada processo no próprio diretório dentro do diretório de dados
do app.
Domínios SELinux por aplicativo
Os apps direcionados ao Android 9 ou versões mais recentes não podem compartilhar dados com outros apps usando permissões Unix amplamente acessíveis. Essa mudança melhora a integridade do Sandbox dos aplicativos Android, principalmente o requisito de que os dados particulares de um app possam ser acessados apenas por ele.
Para compartilhar arquivos com outros apps, use um provedor de conteúdo.
Mudanças de conectividade
Contagem de dados de conectividade e multicaminho
Em apps direcionados ao Android 9 ou versões mais recentes, o sistema conta
o tráfego de rede em redes
que não são o padrão atual, como tráfego de celular enquanto o dispositivo está usando
Wi-Fi, e disponibiliza métodos na classe
NetworkStatsManager
para consultar esse tráfego.
Mais especificamente,
getMultipathPreference()
agora retorna um valor com base no tráfego de rede mencionado acima. A partir do
Android 9, o método retorna true
para dados móveis, mas quando mais de uma determinada quantidade de
tráfego acumula em um dia, ele começa a retornar false
. Os apps executados no
Android 9 precisam chamar o método e respeitar essa dica.
A classe ConnectivityManager.NetworkCallback
agora envia informações sobre VPNs para apps. Essa mudança facilita
que os apps detectem eventos de conectividade sem precisar misturar chamadas síncronas e
assíncronas e usar APIs limitadas. Além disso, isso significa que
a transferência de informações funciona da forma esperada quando um dispositivo está conectado a várias
redes Wi-Fi ou redes celulares simultaneamente.
Suspensão de uso do cliente Apache HTTP
Com o Android 6.0, removemos o suporte ao cliente Apache HTTP. A partir do Android 9, essa biblioteca é removida do bootclasspath e fica indisponível para apps por padrão.
Para continuar usando o cliente HTTP Apache, os apps destinados ao Android 9 e versões mais recentes
podem adicionar o seguinte ao AndroidManifest.xml
:
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
Como alternativa ao uso da biblioteca Apache de ambiente de execução, os apps podem agrupar a
própria versão da biblioteca org.apache.http
no APK. Se você fizer isso,
será necessário reempacotar a biblioteca (com um utilitário como
Jar Jar) para evitar problemas de compatibilidade
com as classes fornecidas no ambiente de execução.
Mudanças de IU
Foco de visualização
Vistas com área 0 (seja com largura ou altura 0) não podem mais receber foco.
Além disso, as atividades não atribuem mais o foco inicial no modo de toque implicitamente Em vez disso, cabe a você solicitar explicitamente o foco inicial, se quiser.
Processamento de valores hexadecimais RGBA em CSS
Os apps direcionados ao Android 9 ou versões mais recentes precisam ativar o comportamento de rascunho do Módulo de cor CSS nível 4 para processar cores CSS de 4 e 8 dígitos hexadecimais.
O módulo de cores CSS nível 4 tem suporte no Chrome desde a versão 52, mas a WebView atualmente desativa esse recurso porque foram descobertos que os apps Android existentes contêm cores hexadecimais de 32 bits na ordenação do Android (ARGB), o que causaria erros de renderização.
Por exemplo, no momento, a cor #80ff8080
é renderizada na
WebView como vermelho claro
opaco (#ff8080
) para apps direcionados aos níveis de API 27 ou anteriores. O componente
principal, que pode ser interpretado pelo Android como o componente Alfa,
é ignorado no momento. Se um app for direcionado ao nível 28 da API ou a versões mais recentes, #80ff8080
será
interpretado como verde claro transparente (#80ff80
) 50%.
Sniffing de tipo MIME para arquivo: URIs
As versões anteriores ao Android 9 podiam inferir tipos MIME pelo conteúdo do
arquivo. A partir do Android 9 (nível 28 da API), os apps precisam usar a
extensão de arquivo correta ao carregar URIs file:
em uma
WebView.
Usar o conteúdo do arquivo para inferir tipos MIME pode causar bugs de segurança, e isso geralmente não é permitido pelos navegadores modernos.
Se um arquivo tiver uma extensão de arquivo reconhecida, como .html
,
.txt
, .js
ou .css
, o tipo MIME será determinado pela extensão.
Se um arquivo não tiver extensão ou não for reconhecida, o tipo MIME será texto simples.
Por exemplo, um URI como file:///sdcard/test.html
é renderizado como HTML, mas um URI como file:///sdcard/test
é renderizado como texto simples, mesmo que o arquivo contenha dados HTML.
Elemento de rolagem de documento
O Android 9 processa corretamente o caso em que um elemento raiz de um documento é o elemento de rolagem. Nas versões anteriores, a posição de rolagem era definida no elemento do corpo, e o elemento raiz não tinha valores de rolagem. O Android 9 oferece o comportamento compatível com os padrões, em que o elemento de rolagem é o elemento raiz.
Além disso, o acesso direto a document.body.scrollTop
, document.body.scrollLeft
,
document.documentElement.scrollTop
ou document.documentElement.scrollLeft
se comportará de maneira diferente dependendo do SDK de destino. Para acessar os valores de rolagem
da janela de visualização, use document.scrollingElement
, se disponível.
Notificações de aplicativos suspensos
Antes do Android 9, as notificações de aplicativos suspensos haviam sido canceladas. A partir do Android 9, as notificações de aplicativos suspensos ficam ocultas até que o aplicativo seja retomado.