O Plug-in do Android para Gradle 3.0.0 e versões mais recentes são compatíveis com todos os recursos da linguagem Java 7 e com um subconjunto de recursos da linguagem Java 8, que variam de acordo com a versão da plataforma. Ao criar seu app usando o Plug-in do Android para Gradle 4.0.0 e versões mais recentes, você pode usar várias APIs da linguagem Java 8 sem exigir um nível mínimo da API para seu app.
Esta página descreve os recursos da linguagem Java 8 que você pode usar, como configurar seu projeto adequadamente para usá-los e possíveis problemas conhecidos. Para ter uma visão geral, assista também o vídeo a seguir.
Observação: o uso de recursos da linguagem Java 8 é opcional no desenvolvimento de apps para Android. Você pode manter os valores de compatibilidade de origem e destino definidos como Java 7, mas ainda será necessário compilar usando o JDK 8.
O Plug-in do Android para Gradle é compatível com alguns recursos da linguagem Java 8
e com algumas bibliotecas de terceiros que os utilizam. Conforme mostrado na figura 1,
o conjunto de ferramentas padrão implementa os novos recursos da linguagem executando
transformações de bytecode, denominadas desugar
, como parte da compilação D8/R8
de arquivos de classe em código dex.
Figura 1. Compatibilidade com recursos da linguagem Java 8 usando transformações
de bytecode desugar
.
Compatibilidade com recursos da linguagem Java 8 (Plug-in do Android para Gradle 3.0.0+)
Para começar a usar os recursos da linguagem Java 8 compatíveis,
atualize o plug-in do Android
para a versão 3.0.0
(ou mais recente). Depois disso, para cada módulo que usa recursos da linguagem Java 8
(no código-fonte ou em dependências),
atualize o arquivo build.gradle
do módulo, conforme mostrado abaixo.
android {
...
// Configure only for each module that uses Java 8
// language features (either in its source code or
// through dependencies).
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
// For Kotlin projects
kotlinOptions {
jvmTarget = "1.8"
}
}
Ao criar seu app usando o Plug-in do Android para Gradle 3.0.0 ou versões mais recentes, o plug-in não é compatível com todos os recursos da linguagem Java 8. Os seguintes recursos de linguagem estão disponíveis em qualquer nível da API:
Recurso da linguagem Java 8 | Observações |
---|---|
Expressões lambda | O Android não é compatível com a serialização de expressões lambda. |
Referências de métodos (link em inglês) | |
Anotações de tipo (link em inglês) | 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. Além disso, a plataforma é compatível com
TYPE
na API de nível 24 ou anterior, mas não é compatível com ElementType.TYPE_USE ou
ElementType.TYPE_PARAMETER .
|
Métodos de interface padrão e estáticos (link em inglês) | |
Repetição de anotações (link em inglês) |
Além dos recursos da linguagem Java 8 acima, as versões de plug-in 3.0.0
e mais recentes ampliam a compatibilidade com
try
-with-resources (link em inglês) para todos os níveis de API do Android.
No momento, a simplificação não é compatível com
MethodHandle.invoke
ou
MethodHandle.invokeExact
(links em inglês).
Se o código-fonte ou uma das dependências do módulo usar um desses métodos,
será necessário especificar minSdkVersion 26
ou uma versão mais recente. Caso contrário, ocorrerá o
seguinte erro:
Dex: Error converting bytecode to dex:
Cause: signature-polymorphic method called without --min-sdk-version >= 26
Em alguns casos, o módulo pode não usar os métodos invoke
ou invokeExact
,
mesmo se estiverem incluídos em uma dependência de biblioteca. Portanto, para continuar usando
essa biblioteca com minSdkVersion 25
ou versões anteriores,
ative a redução de código para remover
os métodos não usados. Se isso não funcionar, use outra biblioteca que não utilize os métodos
incompatíveis.
Os recursos de simplificação de recursos do Java 8+ disponíveis no Plug-in
do Android para Gradle 3.0.0 não disponibilizam outras classes e APIs (como
java.util.stream.*
) para uso em versões mais antigas do Android. A compatibilidade com
a simplificação parcial da API Java está disponível no Plug-in do Android para Gradle 4.0.0 ou
mais recente e é descrita na seção a seguir.
Compatibilidade com a simplificação de APIs do Java 8+ (Android Gradle Plugin 4.0.0+)
Se você estiver criando o app usando o Android Gradle Plugin 4.0.0 ou mais recente, o plug-in ampliará a compatibilidade com o uso de várias APIs da linguagem Java 8 sem exigir um nível mínimo de API para o app.
Essa compatibilidade adicional com versões de plataforma mais antigas é possível porque o plug-in
4.0.0 e versões mais recentes ampliam o mecanismo de simplificação para funcionar com as APIs da linguagem Java.
Portanto, você pode incluir APIs de linguagem padrão que estavam disponíveis apenas em
versões recentes do Android (como java.util.streams
) em apps compatíveis com versões
mais antigas do Android.
O seguinte conjunto de APIs é compatível com a criação do app usando o Plug-in do Android para Gradle 4.0.0 ou versões mais recentes:
- Fluxos sequenciais (
java.util.stream
) - Um subconjunto de
java.time
java.util.function
- Adições recentes a
java.util.{Map,Collection,Comparator}
- Recursos opcionais (
java.util.Optional
,java.util.OptionalInt
ejava.util.OptionalDouble
) e algumas outras novas classes úteis com as APIs acima - Algumas adições a
java.util.concurrent.atomic
(novos métodos emAtomicInteger
,AtomicLong
eAtomicReference
) ConcurrentHashMap
(com correções de bugs para o Android 5.0)
Para ver uma lista completa das APIs compatíveis, acesse APIs Java 8+ disponíveis pela simplificação.
Para oferecer compatibilidade com essas APIs de linguagem, o plug-in compila um arquivo DEX separado que contém uma implementação das APIs ausentes e as inclui no app. O processo de simplificação reescreve o código do app para usar essa biblioteca durante o tempo da execução.
Para ativar a compatibilidade com essas APIs de linguagem em qualquer versão da plataforma Android,
atualize o plug-in do Android
para 4.0.0
(ou mais recente) e inclua o seguinte no arquivo
build.gradle
do seu módulo:
android {
defaultConfig {
// Required when setting minSdkVersion to 20 or lower
multiDexEnabled true
}
compileOptions {
// Flag to enable support for the new language APIs
coreLibraryDesugaringEnabled true
// Sets Java compatibility to Java 8
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.9'
}