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 aplicativos direcionados ao nível de API 28 ou posterior. Aplicativos que definem targetSdkVersion para o nível de API 28 ou posterior devem ser modificados para oferecer suporte a esses comportamentos de forma apropriada, nas áreas aplicáveis.

Consulte as mudanças que afetem todos os aplicativos executados no Android 9, independentemente do nível de API ao qual eles estejam direcionados, em Mudanças de comportamento: todos os aplicativos.

Serviços de primeiro plano

Os aplicativos voltados ao Android 9 ou a uma versão mais recente e que usam serviços em primeiro plano devem solicitar a permissão FOREGROUND_SERVICE . Essa é uma permissão normal, portanto, o sistema a concede automaticamente ao aplicativo que solicita.

Se um aplicativo voltado ao Android 9 ou a uma versão mais recente tentar criar um serviço em primeiro plano sem solicitar FOREGROUND_SERVICE, o sistema gerará uma SecurityException.

Mudanças de privacidade

Se os aplicativo é voltado ao Android 9, você deve saber das seguintes mudanças de comportamento. Essas atualizações às 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 é sempre definido como "UNKNOWN" para proteger a privacidade do usuário.

Se seu aplicativo precisar acessar o número de série do hardware de um dispositivo, será preciso solicitar a permissão READ_PHONE_STATE e chamar getSerial().

Privacidade do DNS

Os aplicativos voltados ao Android 9 devem respeitar as APIs de DNS privadas. Isso significa que os aplicativos devem garantir que, se o resolvedor do sistema estiver usando DNS-over-TLS, todos os clientes DNS integrados usam DNS criptografado para o mesmo nome de host que o sistema ou são desativados em favor do resolvedor do sistema.

Mudanças na segurança da biblioteca

O Android 9 traz diversas mudanças de comportamento que aumentam a segurança dos aplicativos, mas elas só valem para aplicativos voltados para a API de nível 28 ou uma versão posterior.

TLS de rede ativo por padrão

Se o aplicativo tem o Android 9 como versão-alvo, o método isCleartextTrafficPermitted() retorna false por padrão. Se o aplicativo precisar habilitar texto não criptografado para domínios específicos, você precisa definir cleartextTrafficPermitted como true para esses domínios explicitamente na Configuração de segurança de rede do aplicativo.

Pastas de dados na web separadas por processo

Para aumentar a estabilidade do aplicativo e a integridade dos dados no Android 9, os aplicativos não podem mais compartilhar uma única pasta de dados WebView entre diversos processos. Normalmente, essas pastas de dados armazenam cookies, caches HTTP e outros armazenamentos permanentes e temporários relacionados à navegação web.

Na maioria dos casos, o aplicativo deve usar classes do pacote android.webkit, como WebView e CookieManager, em apenas um processo. Por exemplo, você deve transferir todos os objetos Activity que usam uma WebView para o mesmo processo. É possível aplicar a regra de "apenas um processo" de forma mais rígida chamando disableWebView() nos outros processos do aplicativo. Isso impede que a WebView seja inicializada nesses outros processos acidentalmente, mesmo que seja chamada a partir de uma biblioteca dependente.

Se o aplicativo precisar usar instâncias de WebView em mais de um processo, você precisará atribuir um sufixo de pasta de dados exclusivo para cada processo usando o método WebView.setDataDirectorySuffix() antes de usar determinada instância de WebView nesse processo. Esse método coloca os dados web de cada processo na sua própria pasta, que fica dentro da pasta de dados do aplicativo.

Observação: mesmo que você use setDataDirectorySuffix(), o sistema não compartilha cookies e outros dados web além dos limites do processo do aplicativo. Se diversos processos precisarem de acesso aos mesmos dados web, você terá que copiá-los para cada processo manualmente. Por exemplo, você pode chamar getCookie() e setCookie() para transferir dados de cookie manualmente de um processo a outro.

Domínios SELinux por aplicativo

Os aplicativos voltados para o Android 9 ou a uma versão mais recente não podem compartilhar dados com outros aplicativos usando permissões Unix amplamente acessíveis. Essa mudança aumenta a integridade da Sandbox dos Aplicativos Android, e principalmente a regra de que dados privados de um aplicativo só podem ser acessados por ele.

Para compartilhar arquivos com outros aplicativos, use um provedor de conteúdo.

Mudanças de conectividade

Contagem de dados de conectividade e multicaminho

Nos aplicativos voltados ao Android 9 ou a uma versão mais recente, o sistema contabiliza o tráfego de rede em redes que não são a padrão em determinado momento — como tráfego na rede celular quando o dispositivo está conectado ao Wi-Fi — e disponibiliza 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 celulares, mas quando o tráfego acumulado em um dia ultrapassa certo limite, passa a retornar false. Os aplicativos que operam no Android 9 devem chamar o método e respeitar essa indicação.

Agora, a classe ConnectivityManager.NetworkCallback envia informações sobre VPNs aos aplicativos. Essa mudança facilita muito para os aplicativos na hora de detectar eventos de conectividade, porque eles não precisam mais combinar chamadas síncronas e assíncronas e usar APIs limitadas. Além disso, isso significa que a transferência de informações funciona como o esperado quando o dispositivo está conectado a diversas redes Wi-Fi ou várias redes celulares simultaneamente.

Suspensão de uso do cliente Apache HTTP

Com o Android 6.0, removemos o suporte ao cliente Apache HTTP. Do Android 9 em diante, essa biblioteca foi removida do bootclasspath e está disponível aos aplicativos por padrão.

Para continuar usando o cliente Apache HTTP, os aplicativos voltados para o Android 9 e mais recentes podem adicionar o seguinte ao AndroidManifest.xml:

<uses-library android:name="org.apache.http.legacy" android:required="false"/>

Observação: o atributo android:required="false" é obrigatório para aplicativos que têm SDK mínimo de 23 ou menos, porque em dispositivos com níveis de API inferiores a 24, a biblioteca org.apache.http.legacy não está disponível (nesses dispositivos, as classes do Apache HTTP estão disponíveis no bootclasspath).

Uma alternativa ao uso da biblioteca Apache de tempo de execução é os aplicativos oferecerem seu próprio pacote de recursos da biblioteca org.apache.http no APK. Se você faz isso, deve criar um novo pacote com a biblioteca (com um utilitário como o Jar Jar) para evitar problemas de compatibilidade com as classes fornecidas em tempo 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. Cabe a você solicitar o foco inicial, se desejar.

Processamento de valores hexadecimais RGBA em CSS

Os aplicativos para Android 9 ou uma versão mais recente devem ativar o comportamento preliminar do Módulo de cor CSS nível 4 para lidar com cores CSS hexadecimais de 4 e 8 dígitos.

O Módulo de cor CSS nível 4 conta com suporte do Chrome desde a versão 52, mas, no momento, o WebView desativa esse recurso porque descobriu-se que alguns aplicativos Android atuais contêm cores hexadecimais de 32 bits na ordenação Android (ARGB), e isso causaria erros de renderização.

Por exemplo, atualmente, a cor #80ff8080 é renderizada no WebView como vermelho claro opaco (#ff8080) para aplicativos voltados a APIs de nível 27 ou maior. O componente principal (que pode ser interpretado pelo Android como o componente alfa) atualmente é ignorado. Se o aplicativo é voltado para a API de nível 28 ou maior, #80ff8080 é interpretado como verde claro transparente 50% (#80ff80).

Elemento de rolagem de documento

O Android 9 lida da forma correta com o caso em que um elemento raiz do documento é o elemento de rolagem. Nas versões antigas, 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 dentro dos 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 resultará em comportamentos diferentes 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.

Content and code samples on this page are subject to the licenses described in the Content License. Java is a registered trademark of Oracle and/or its affiliates.