Android Dev Summit, October 23-24: two days of technical content, directly from the Android team. Sign-up for livestream updates.

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 são válidas exclusivamente para aplicativos direcionados ao nível de API 28 ou posterior. Aplicativos que definem targetSdkVersion para o nível de API 28 ou posterior precisam ser modificados para oferecer compatibilidade com esses comportamentos de forma apropriada, nas áreas aplicáveis.

Consulte as mudanças que afetam todos os aplicativos executados no Android 9, independentemente do nível de API ao qual eles sejam destinados, 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 precisam 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 seu aplicativo é voltado ao Android 9, é necessário conhecer as seguintes mudanças de comportamento. Essas atualizações às informações de DNS e ao 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 precisam respeitar as APIs de DNS privadas. Em particular, eles precisam garantir que, se o resolvedor do sistema estiver usando DNS-over-TLS, todos os clientes DNS integrados usem DNS criptografado para o mesmo nome de host que o sistema ou sejam desativados em favor do resolvedor do sistema.

Mudanças na segurança do framework

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

TLS de rede ativo por padrão

Se o aplicativo é destinado ao Android 9 ou versões posteriores, o método isCleartextTrafficPermitted() retorna false por padrão. Se o aplicativo precisar ativar texto não criptografado para domínios específicos, será necessário definir cleartextTrafficPermitted como true para esses domínios explicitamente na Configuração de segurança de rede do aplicativo.

Diretórios de dados na Web separados por processo

Para aumentar a estabilidade do aplicativo e a integridade dos dados no Android 9, os aplicativos não podem mais compartilhar um único diretório de dados WebView entre diversos 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 aplicativo precisa usar classes do pacote android.webkit, como WebView e CookieManager, em apenas um processo. Por exemplo, é necessário 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 por uma biblioteca dependente.

Se o aplicativo precisar usar instâncias de WebView em mais de um processo, você precisará atribuir um sufixo de diretório 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 no próprio diretório, que fica dentro do diretório de dados do aplicativo.

Domínios SELinux por aplicativo

Os aplicativos voltados para o Android 9 ou posterior 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, 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 móveis, mas quando o tráfego acumulado em um dia ultrapassa certo limite, passa a retornar false. Os aplicativos que operam no Android 9 precisam chamar o método e respeitar essa indicação.

Agora, a classe ConnectivityManager.NetworkCallback envia informações sobre VPNs para aplicativos. Essa alteração 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 a 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 versões mais recentes podem adicionar o seguinte ao AndroidManifest.xml:

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

Uma alternativa ao uso da biblioteca do ambiente de execução Apache é os aplicativos oferecerem o próprio pacote de recursos da biblioteca org.apache.http no APK. Se você fizer isso, precisará criar um novo pacote com 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. Cabe a você solicitar o foco inicial, se quiser.

Processamento de valores hexadecimais RGBA em CSS

Os aplicativos para Android 9 ou versões posteriores precisam 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 menor. O componente principal (que pode ser interpretado pelo Android como o componente alfa) é ignorado. Se o aplicativo é voltado para a API de nível 28 ou maior, #80ff8080 é interpretado como verde claro transparente 50% (#80ff80).

Sniffing de tipo MIME para arquivo: URIs

As versões anteriores ao Android 9 podiam inferir os tipos MIME pelo conteúdo do arquivo. A partir do Android 9 (nível de API 28), os aplicativos 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 ela 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 do 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 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.