Use recursos de linguagem do Java 8

O Android aceita todos os recursos de linguagem Java 7 e um subconjunto de recursos de linguagem Java 8 que variam de acordo com a versão da plataforma. Esta página descreve os novos recursos de idioma que você pode usar, como configurar o seu projeto adequadamente para usá-los e possíveis problemas conhecidos.

Observação: Ao desenvolver aplicativos para Android, usar os recursos de linguagem Java 8 é algo opcional. É possível manter os valores de compatibilidade de origem e destino definidos para Java 7, mas ainda será necessário compilar usando o JDK 8.

A compatibilidade com recursos de linguagem Java 8 exige um novo compilador chamado Jack. O Jack só é compatível com o Android Studio 2.1 ou mais recente. Portanto, se quiser usar os recursos de linguagem do Java 8, será preciso usar o Android Studio 2.1 para compilar seu aplicativo.

Se você já instalou o Android Studio, lembre-se de atualizá-lo para a versão mais recente em Help > Check for Update (no Mac, Android Studio > Check for Updates). Se ainda não tiver o IDE instalado na sua estação de trabalho, baixe o Android Studio aqui.

Recursos de linguagem e APIs do Java 8 compatíveis

O Android não é compatível com todos os recursos de linguagem do Java 8. No entanto, os seguintes recursos estão disponíveis ao desenvolver aplicativos para Android 7.0 (API de nível 24):

Observação: As informações de anotação de tipo só estão disponíveis no tempo de compilação e não durante o tempo de execução.

Para testar expressões Lambda, referências de método e tipos de anotação em versões mais antigas do Android, acesse o arquivo build.gradle e configure compileSdkVersion e targetSdkVersion para 23 ou inferior. Você ainda precisará permitir que a cadeia de ferramentas Jack use esses recursos do Java 8.

Além disso, as seguintes APIs de linguagem Java 8 também estão disponíveis:

Ativar os recursos do Java 8 e a cadeia de ferramentas Jack

Para usar os novos recursos de linguagem do Java 8, você também deve usar a cadeia de ferramentas Jack. Essa nova cadeia de ferramentas do Android compila os códigos-fonte de linguagem Java em um código de bytes dex legível no Android, que tem o próprio formato de biblioteca .jack e fornece a maioria dos recursos de uma cadeia de ferramentas em uma só ferramenta: reempacotamento, redução, ofuscação e multidex.

Veja uma comparação entre duas cadeias de ferramentas usadas para compilar arquivos Android DEX:

  • Cadeia de ferramentas legada javac:
    javac (.java.class) → dx (.class.dex)
  • Nova cadeia de ferramentas Jack:
    Jack (.java.jack.dex)

Configurar o Gradle

Para ativar os recursos de linguagem do Java 8 e o Jack para seu projeto, insira o seguinte no arquivo build.gradle de nível do módulo:

android {
  ...
  defaultConfig {
    ...
    jackOptions {
      enabled true
    }
  }
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
}

Problemas conhecidos

O Instant Run não funciona com o Jack e será desativado enquanto a nova cadeia de ferramentas estiver em uso.

Como o Jack não gera arquivos de classe intermediária ao compilar um aplicativo, ferramentas que dependem desses arquivos não funcionam com o Jack. Alguns exemplos dessas ferramentas são:

  • Detectores de códigos suspeitos que operam em arquivos de classe
  • Ferramentas e bibliotecas que exigem os arquivos de classe do aplicativo (como testes de instrumentação com JaCoCo)

Se encontrar outros problemas ao usar o Jack, envie um relatório de erros.