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 seguintes mudanças de comportamento se aplicam exclusivamente a aplicativos que segmentam API de nível 28 ou mais recente. Apps que definem targetSdkVersion para o nível 28 da API ou "superior" precisa modificar para oferecer suporte a esses comportamentos de forma adequada, quando aplicável.

Para mudanças que afetam todos os apps executados no Android 9, independentemente de qual API no nível desejado, 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 FOREGROUND_SERVICE permissão. Essa é uma permissão normal, para que o sistema a conceda automaticamente ao app solicitante.

Se um app destinado ao Android 9 ou a uma versão mais recente tentar criar um serviço em primeiro plano sem solicitando FOREGROUND_SERVICE, o sistema gera uma SecurityException.

Mudanças de privacidade

Se seu aplicativo for direcionado ao Android 9, você deve manter o seguinte mudanças de comportamento em mente. Essas atualizações nas informações de DNS e de número de série do dispositivo melhorar 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 os privacidade.

Caso seu aplicativo precise acessar o número de série do hardware de um dispositivo, recomendamos solicite o READ_PHONE_STATE a permissão, depois chame getSerial()

Privacidade do DNS

Os aplicativos voltados ao Android 9 devem respeitar as APIs de DNS privadas. Especificamente, se o resolvedor do sistema estiver fazendo DNS sobre TLS, integrado usa DNS criptografado com o mesmo nome de host do ou desativado em favor do resolvedor do sistema.

Mudanças na segurança do framework

O Android 9 apresenta diversas mudanças de comportamento que melhoram do app, mas essas mudanças só entram em vigor se o app for direcionado ao nível da API 28 ou superior.

TLS de rede ativo por padrão

Caso seu app seja direcionado ao Android 9 ou a uma versão mais recente, a isCleartextTrafficPermitted() retorna false por padrão. Caso seu app precise ativar texto não criptografado para domínios específicos, defina cleartextTrafficPermitted como true para os domínios na seção Segurança de rede Configuração.

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 dado de WebView; entre vários processos. Normalmente, esses diretórios armazenam cookies, caches HTTP e outros recursos armazenamento temporário relacionado à navegação na Web.

Na maioria dos casos, o aplicativo deve usar classes do android.webkit, como como WebView e CookieManager, em apenas um de desenvolvimento de software. Por exemplo, você deve mover todos Objetos Activity que usam um WebView no mesmo processo. É possível aplicar "somente um processo" de forma mais rígida regra chamando disableWebView() pol. os outros processos do seu app. Essa chamada impede que WebView seja inicializado nesses outros processos por engano, mesmo que seja chamado de uma instância biblioteca.

Caso seu app precise usar instâncias do WebView em mais de um processo; você precisa atribuir um sufixo de diretório de dados exclusivo para cada processo, usando o 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 dentro dos dados do app diretório.

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 o permissões Unix de acesso universal. Essa mudança melhora a integridade Sandbox do aplicativo Android, especialmente a exigência de que os dados particulares sejam acessíveis apenas por esse app.

Para compartilhar arquivos com outros apps, use um objeto content provedor.

Mudanças de conectividade

Contagem de dados de conectividade e multicaminho

Em apps direcionados ao Android 9 ou versões mais recentes, o sistema faz a contagem tráfego de rede nas redes que não sejam o padrão atual, como tráfego de rede celular enquanto o dispositivo está ligado Wi-Fi e fornece métodos na NetworkStatsManager para consultar esse tráfego.

Especificamente, getMultipathPreference() agora retorna um valor com base no tráfego de rede mencionado acima. Começando com No Android 9, o método retorna true para dados de célula, mas quando mais de uma certa quantidade de se acumular em um dia, ele começará a retornar false. Apps em execução em O Android 9 precisa chamar o método e respeitar essa dica.

O ConnectivityManager.NetworkCallback agora envia informações sobre VPNs para apps. Com essa mudança, para que os aplicativos detectem eventos de conectividade sem precisar misturar eventos síncronos e chamadas assíncronas e usar APIs limitadas. Além disso, significa que a transferência de informações funciona como esperado quando um dispositivo está conectado a 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 para o cliente Apache HTTP. A partir do Android 9, essa biblioteca é removida da bootclasspath e não está disponível para aplicativos por padrão.

Para continuar usando o cliente Apache HTTP, 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 os própria versão da biblioteca org.apache.http no APK. Se você fizer isso, você precisa reempacotar a biblioteca (com um utilitário como Jar Jar) para evitar problemas de compatibilidade de classe. 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 implicitamente em modo de toque. 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 rascunho Módulo de cores CSS nível 4 para lidar com cores CSS de 4 e 8 dígitos hexadecimais.

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

Por exemplo, a cor #80ff8080 está renderizada atualmente em WebView como opaco vermelho-claro (#ff8080) para apps destinados aos níveis de API 27 ou anteriores. As principais (que pode ser interpretado pelo Android como o componente alfa) é ignorada no momento. Se um app for direcionado ao nível 28 da API ou mais recente, #80ff8080 será interpretado como verde claro transparente 50% (#80ff80).

Sniffing de tipo MIME para arquivo: URIs

As versões do Android anteriores ao Android 9 podiam inferir os tipos MIME do arquivo conteúdo. A partir do Android 9 (nível 28 da API), os apps precisam usar o a extensão de arquivo correta ao carregar URIs file: em uma WebView.

Usar o conteúdo do arquivo para inferir tipos MIME pode gerar bugs de segurança. e isso geralmente não é permitido pelos navegadores mais recentes.

Se um arquivo tiver uma extensão 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 reconhecido, o tipo MIME será simples em textos.

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 lida corretamente com o caso em que a raiz de um documento é o elemento de rolagem. Em versões anteriores, a posição de rolagem era definida no elemento do corpo e o elemento raiz não tem valores de rolagem. O Android 9 habilita comportamento em conformidade com os padrões em que o elemento de rolagem é a raiz .

Além disso, acessar diretamente document.body.scrollTop, document.body.scrollLeft, document.documentElement.scrollTop ou document.documentElement.scrollLeft se comportarão de maneira diferente dependendo do SDK de destino. Para acessar a rolagem da janela de visualização valores, 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é o app é retomado.