Métodos de interface padrão no Android: erro Nougat e sua solução (Kotlin)

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução: O erro «invisível» que quebra a compilação

\n\n

Você está escrevendo um aplicativo em Kotlin, tudo está indo muito bem, mas de repente — bum! — o Android Studio destaca uma linha em vermelho e nos logs de compilação aparece uma mensagem assustadora:

\n\n
Default interface methods are only supported starting with Android 7.0 (Nougat)
\n\n

Situação familiar? Se você é iniciante no desenvolvimento Android, esse erro pode parecer um verdadeiro mistério. Afinal, você está apenas usando uma interface com um método padrão — o que poderia dar errado?

\n\n

Na verdade, o problema está na incompatibilidade entre o minSdkVersion do seu aplicativo e os recursos da linguagem Kotlin (que internamente usa funcionalidades do Java 8).

\n\n

Neste artigo, vamos entender por que esse erro ocorre, como corrigi-lo e como escrever código moderno sem perder o suporte a dispositivos antigos. Vamos lá!

\n\n

O que é um «default interface method» e por que ele surgiu?

\n\n

Vamos começar pelo básico. Nas versões antigas do Java (anteriores à 8), as interfaces podiam conter apenas declarações de métodos — sem implementação. Mas com a chegada do Java 8, surgiu a possibilidade de adicionar métodos com corpo às interfaces (os chamados métodos padrão).

\n\n

O Kotlin, sendo uma linguagem moderna, suporta totalmente esse conceito. Por exemplo:

\n\n
interface Logger {\n    fun log(message: String)\n    fun logWithTimestamp(message: String) {\n        log("${System.currentTimeMillis()}: $message")\n    }\n}
\n\n

Aqui, logWithTimestamp é um default interface method. Se uma classe implementar Logger, ela pode não sobrescrever esse método, mas usar a implementação «padrão». Conveniente, não é?

\n\n

O problema é que, no nível do bytecode do Android, esses métodos exigem suporte do sistema operacional. E esse suporte só apareceu no Android 7.0 (Nougat, API 24).

\n\n

Por que o erro ocorre no Android Studio?

\n\n

Quando você define minSdkVersion abaixo de 24 (por exemplo, 21 ou 23), o compilador do Android percebe que seu aplicativo pode rodar em dispositivos com Android 6.0 ou 5.0. E nessas versões, os métodos padrão de interfaces não são suportados no nível da máquina virtual (Dalvik/ART).

\n\n

É por isso que o compilador exibe o erro:

\n\n
Default interface methods are only supported starting with Android 7.0 (Nougat)
\n\n

Ele está literalmente dizendo: «Não consigo compilar este código porque seu aplicativo pode ser executado em um dispositivo que não sabe executar esses métodos».

\n\n

Cenário típico onde isso acontece

\n\n

Na maioria das vezes, o erro ocorre em dois casos:

\n\n
    \n
  • Uso de coleções Kotlin (por exemplo, listOf, mapOf) — elas possuem métodos padrão.
  • \n
  • Uso de bibliotecas de terceiros que internamente contêm interfaces com métodos padrão.
  • \n
  • Trabalho com Android Jetpack (por exemplo, LifecycleObserver ou DefaultLifecycleObserver).
  • \n
\n\n

Você pode nem mesmo escrever suas próprias interfaces com métodos padrão — o erro ainda aparecerá se alguma das dependências as utilizar.

\n\n

Como corrigir o erro? 3 maneiras comprovadas

\n\n

Vamos analisar todas as soluções possíveis — desde a mais simples até a mais flexível.

\n\n

Maneira 1: Aumentar o minSdkVersion para 24

\n\n

Esta é a solução mais direta. Se seu aplicativo não precisa suportar dispositivos anteriores ao Android 7.0, basta alterar o minSdkVersion no arquivo build.gradle (no nível do módulo):

\n\n
android {\n    ...\n    defaultConfig {\n        minSdkVersion 24\n        targetSdkVersion 34\n        ...\n    }\n}
\n\n

Vantagens: rápido, limpo

Blogs

Book Recommendations