Como migrar aplicativos para o Android 8.0

O Android 8.0 traz diversos novos recursos e APIs, além de mudanças que podem afetar o comportamento do seu aplicativo, mesmo que você não mude nada. Para ajudar você a se preparar, essa página explica como realizar testes de compatibilidade e como atualizar o aplicativo para usar os novos recursos do Android 8.0:

  1. Garantir compatibilidade com a plataforma

    Verifique se o aplicativo funciona perfeitamente na nova versão da plataforma. Nessa etapa, você não usa novas APIs nem muda targetSdkVersion do aplicativo, mas algumas pequenas mudanças podem ser necessárias.

  2. Compilar o aplicativo com o Android 8.0 SDK

    Quando estiver tudo pronto para você desfrutar dos novos recursos da plataforma, atualize targetSdkVersion para "O", verifique se o aplicativo continua funcionando normalmente e depois comece a usar as novas APIs.

Garantir compatibilidade com a plataforma

O objetivo é garantir que o aplicativo funcione da mesma forma no Android 8.0. Como algumas mudanças da plataforma podem afetar o comportamento do aplicativo, pode ser necessário fazer alguns ajustes, mas não é obrigatório usar novas APIs nem alterar targetSdkVersion.

Preparar um dispositivo que trabalha com Android 8.0

  • Se você tem um dispositivo compatível (Pixel, Pixel XL, Pixel C, Nexus 5X, Nexus 6P ou Nexus Player), obtenha as imagens do sistema do Android 8.0 do seu dispositivo na página Downloads e siga as instruções para atualizar o dispositivo.
  • Ou baixe as imagens do sistema do Android 8.0 para o Android Emulator. Ele fica no SDK Manager, na seção Android 8.0 Preview com o nome de Google APIs Intel x86 Atom System Image.

    Observação: as imagens do sistema do Android 8.0 estão disponíveis para download somente a partir do Android Studio 3.0 Canary. Para saber mais, veja a seção abaixo sobre como obter o Android 8.0 SDK.

Realizar testes de compatibilidade

Para a maior parte, testar a compatibilidade com o Android 8.0 envolve o mesmo tipo de testes que se realiza ao preparar o aplicativo para o lançamento. Essa é uma boa hora de rever as Orientações fundamentais de qualidade dos aplicativos e as Práticas recomendadas para testes.

Porém, há um outro aspecto nos testes: o Android 8.0 insere alterações na plataforma Android que podem afetar o comportamento do seu aplicativo ou corrompê-lo totalmente, mesmo que você não altere targetSdkVersion. Por isso, é importante dar uma olhada nas principais mudanças na tabela 1 e testar as possíveis soluções que você implementar para se adequar a elas.

Tabela 1. Principais mudanças que afetam todos os aplicativos executados em dispositivos Android 8.0.

Mudança Resumo Mais informações
Atualizações de localização em segundo plano menos frequentes Se o aplicativo receber atualizações de localização de um serviço de segundo plano, elas serão menos frequentes no Android 8.0 em comparação com versões mais antigas da plataforma. Na prática, um serviço de segundo plano não pode receber atualizações de localização mais de poucas vezes por hora. No entanto, se o aplicativo estiver em primeiro plano, a taxa de atualização de localização será a mesma. Limites da localização em segundo plano
net.hostname não é mais compatível Consultar a propriedade net.hostname do sistema gera um resultado nulo. Não há
Nova exceção de send(DatagramPacket) O método send(DatagramPacket) gerará uma SocketException se o método connect(InetAddress, int) executado anteriormente falhar. Mudanças de comportamento: redes e conectividade HTTP(S)
NullPointerException adequada dos métodos AbstractCollection Agora, AbstractCollection.removeAll(null) e AbstractCollection.retainAll(null) sempre geram uma NullPointerException; antes, a NullPointerException não era acionada quando a coleta estava vazia. Essa mudança deixa o comportamento mais coerente com a documentação. Mudanças de comportamento: gerenciamento de coleta
NullPointerException adequada do Currency.getDisplayName(null) Chamar Currency.getDisplayName(null) aciona uma NullPointerException. Mudanças de comportamento: localidades e internacionalização

Para ver uma lista mais detalhada de mudanças de comportamento no Android 8.0, acesse Mudanças de comportamento do Android 8.0.

Compilar o aplicativo com recursos do Android 8.0

Além de oferecer novas APIs, o Android 8.0 gera outras mudanças de comportamento quando se atualiza targetSdkVersion, como descrito na tabela 2. Esta seção explica como configurar o seu ambiente de desenvolvimento para direcioná-lo à nova plataforma e começar a compilar e testar as mudanças e novos recursos com as Android 8.0 APIs.

Observação: As etapas descritas acima para garantir compatibilidade com a plataforma são pré-requisito para se compilar para o Android 8.0, então certifique-se de passar por essas etapas primeiro.

Obter o Android 8.0 SDK

  1. Instale o Android Studio 3.0 Canary.

    Somente o Android Studio 3.0 contém suporte para todos os novos recursos ao desenvolvedor disponíveis com o Android 8.0. Por isso, você precisa ter a versão Canary do Android Studio 3.0 para começar a usar o Android 8.0 SDK. Mas você ainda pode manter a sua versão estável do Android Studio instalada.

  2. Inicialize o Android Studio 3.0 e abra o SDK Manager clicando em Tools > Android > SDK Manager.
  3. Na aba SDK Platforms, marque Show Package Details. Embaixo de Android 8.0 Preview, marque o seguinte:
    • Android SDK Platform O
    • Google APIs Intel x86 Atom System Image (necessário apenas para o emulador)
  4. Siga para a aba SDK Tools e marque todos os itens que têm atualizações disponíveis (clique em todas as caixas de seleção que têm um traço ). Assim, você incluirá o seguinte (que é necessário):
    • Android SDK Build-Tools 26.0.0 (rc2 ou posterior)
    • Android SDK Platform-Tools 26.0.0 (rc2 ou posterior)
    • Android Emulator 26.0.0
    • Repositório de suporte
  5. Clique em Ok para instalar todos os pacotes de SDK selecionados.

Agora você está com tudo pronto para começar a desenvolver com a Android 8.0.

Atualizar a configuração da compilação

Atualize compileSdkVersion, buildToolsVersion, targetSdkVersion e a Biblioteca de suporte com as seguintes versões:

android {
  compileSdkVersion 'android-O'
  buildToolsVersion '26.0.0-rc2'

  defaultConfig {
    targetSdkVersion 'O'
  }
  ...
}

dependencies {
  compile 'com.android.support:appcompat-v7:26.0.0-beta1'
}

// REQUIRED: Google's new Maven repo is required for the latest
// support library that is compatible with Android 8.0
repositories {
    maven {
        url 'https://maven.google.com'
    }
}

Não é possível publicar o aplicativo com essa configuração. A versão "O" é uma API provisória útil somente para desenvolvimento e teste durante a Android 8.0. Você deve esperar a API final ser lançada para publicar suas mudanças para o Android 8.0. Quando isso acontecer, atualize a configuração novamente.

Remover receptores de transmissão do arquivo de manifesto

Como o Android 8.0 traz novas limitações para receptores de transmissão, você deve remover todos os receptores registrados em intents de transmissão implícita. Se você não fizer isso, seu aplicativo não será corrompido em tempo de compilação nem de execução, mas eles não terão nenhum efeito quando ele for executado no Android 8.0.

As intents de transmissão explícita — às que somente o seu aplicativo pode responder — continuam funcionando da mesma forma no Android 8.0.

Há algumas exceções a essa nova restrição. Para ver uma lista de transmissões implícitas que ainda funcionam em aplicativos voltados para o Android 8.0, acesse Exceções da transmissão implícita.

Testar o aplicativo voltado para o Android 8.0

Com as preparações acima concluídas, você pode compilar o aplicativo e fazer mais testes para garantir que ele funcione corretamente quando voltado para o Android 8.0. Esse é outro momento legal de dar uma nova olhada nas Orientações fundamentais para a qualidade do aplicativo e Práticas recomendadas para testes.

Quando compilar o aplicativo com targetSdkVersion configurada como "O", há mudanças específicas da plataforma que você precisa conhecer. Algumas dessas mudanças podem afetar significativamente o comportamento do seu aplicativo ou até corromper o seu aplicativo completamente, mesmo que você não implemente novos recursos no Android 8.0.

A tabela 2 fornece uma lista dessas mudanças com links para mais informações.

Tabela 2. Principais mudanças que afetam os aplicativos quando targetSdkVersion é definida como "O".

Mudança Resumo Mais informações
Privacidade O Android 8.0 não oferece suporte ao uso das propriedades net.dns1, net.dns2, net.dns3 e net.dns4 do sistema. Mudanças de comportamento: privacidade
Segmentos graváveis e executáveis impostos Em bibliotecas nativas, o Android 8.0 impõe a regra de que os dados não devem ser executáveis e o código não deve ser gravável. Mudanças de comportamento: bibliotecas nativas
Validação de cabeçalho e seção de ELF O vinculador dinâmica verifica mais valores nos cabeçalhos de seção e cabeçalho ELF e falha se eles forem inválidos. Mudanças de comportamento: bibliotecas nativas
Notificações Os aplicativos voltados à versão SDK do Android 8.0 devem implementar um ou mais canais de notificação para exibir notificações aos usuários. Visão geral da API: notificações
O método List.sort() Implementações desse método não podem mais chamar Collections.sort(), caso contrário, o aplicativo gerará uma exceção devido a excesso de fluxo na pilha. Mudanças de comportamento: gerenciamento de coleta
O método Collections.sort() Em implementações de "List", Collections.sort() agora gera uma ConcurrentModificationException. Mudanças de comportamento: gerenciamento de coleta

Para ver uma lista mais completa das mudanças de comportamento do Android 8.0, acesse Mudanças de comportamento do Android 8.0.

Para explorar os novos recursos e APIs disponíveis no Android 8.0, leia Recursos e APIs do Android 8.0.