Mudanças de comportamento: aplicativos direcionados a níveis de API acima do 28

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, independente do nível de API segmentado, consulte Mudanças de comportamento: todos os apps.

Serviços em primeiro plano

Os apps destinados ao Android 9 ou 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 vai gerar uma SecurityException.

Mudanças de privacidade

Caso seu app seja destinado ao Android 9, lembre-se das seguintes mudanças de comportamento. Essas atualizações nas informações de DNS e número de série do dispositivo melhoram 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 de 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 fazendo DNS sobre TLS, qualquer cliente DNS integrado use DNS criptografado para o mesmo nome de host do 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 for direcionado ao nível da API 28 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 explicitamente cleartextTrafficPermitted 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 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. Para aplicar a regra de "apenas um processo" de forma mais rígida, chame disableWebView() nos outros processos do app. Essa chamada impede que WebView seja inicializado nesses outros processos por engano, mesmo que seja chamado de uma biblioteca dependente.

Se o app precisar usar instâncias de WebView em mais de um processo, será necessário atribuir um sufixo de diretório de dados exclusivo para cada processo, usando o método WebView.setDataDirectorySuffix(), antes de usar uma determinada instância de WebView nesse processo. Esse método coloca os dados da Web de cada processo no próprio diretório, que fica dentro do diretório de dados do app.

Domínios SELinux por aplicativo

Os apps destinados 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 de 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 fornece métodos na classe NetworkStatsManager para consultar esse tráfego.

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 de celular, mas quando mais de uma certa 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.

Agora, a classe ConnectivityManager.NetworkCallback envia informações sobre VPNs para apps. Essa mudança facilita muito a detecção de eventos de conectividade pelos apps, sem que seja necessário misturar chamadas síncronas e assíncronas e usar APIs limitadas. Além disso, isso significa que a transferência de informações funciona como esperado 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. No Android 9 e versões mais recentes, essa biblioteca foi removida do bootclasspath e está indisponível para apps por padrão.

Para continuar usando o cliente HTTP Apache, os apps direcionados 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 o 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 destinados 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 hexadecimais de 4 e 8 dígitos.

O módulo de cores CSS de nível 4 tem suporte no Chrome desde a versão 52, mas no momento, a WebView desativa o recurso porque foram encontrados apps Android existentes que 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 destinados ao nível 27 da API ou versões 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 mais recente, #80ff8080 será interpretado como verde claro transparente (#80ff80) em 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 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 mais recentes.

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 será renderizado como HTML, mas um URI como file:///sdcard/test será 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 "body", 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, acessar diretamente 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.