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.
Consulte as mudanças que afetam todos os apps executados no Android 9, independentemente do nível de API ao qual eles são destinados, em Mudanças de comportamento: todos os apps.
Serviços em primeiro plano
Os apps 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 app que a solicitou.
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
Se o app é voltado ao Android 9, é necessário conhecer as seguintes mudanças de comportamento. 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 a privacidade dos usuários.
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. Em particular, os apps 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 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 de dados armazenam cookies, caches HTTP e outros armazenamentos permanentes e
temporários relacionados à 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ê precisa mover todos
os objetos Activity
que usam um WebView
para o mesmo processo. É possível aplicar "somente um processo" de forma mais rígida regra
chamando
disableWebView()
pol.
os outros processos do seu app. Isso impede que a WebView
seja inicializada
nesses outros processos por engano, mesmo que seja chamada por uma biblioteca
dependente.
Se o app 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 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 provedor de conteúdo.
Mudanças de conectividade
Contagem de dados de conectividade e multicaminho
Nos apps 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
. Apps em execução em
O Android 9 precisa chamar o método e respeitar essa dica.
A classe 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 ao 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 voltados para o Android 9 e versões mais recentes
podem adicionar o seguinte à AndroidManifest.xml
:
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
Uma alternativa ao uso da biblioteca Apache de tempo de execução é os apps oferecerem
seu próprio pacote de recursos 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 no modo de toque implicitamente. Cabe a você solicitar 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. 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 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 oferece o comportamento em conformidade 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
vai se comportar 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.