Introdução: O erro «invisível» que quebra a compilação
\n\nVocê 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\nDefault interface methods are only supported starting with Android 7.0 (Nougat)\n\nSituaçã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\nNa 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\nNeste 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\nO que é um «default interface method» e por que ele surgiu?
\n\nVamos 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\nO Kotlin, sendo uma linguagem moderna, suporta totalmente esse conceito. Por exemplo:
\n\ninterface Logger {\n fun log(message: String)\n fun logWithTimestamp(message: String) {\n log("${System.currentTimeMillis()}: $message")\n }\n}\n\nAqui, 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 é?
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\nPor que o erro ocorre no Android Studio?
\n\nQuando 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).
É por isso que o compilador exibe o erro:
\n\nDefault 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\nCenário típico onde isso acontece
\n\nNa 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,
LifecycleObserverouDefaultLifecycleObserver). \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\nComo corrigir o erro? 3 maneiras comprovadas
\n\nVamos analisar todas as soluções possíveis — desde a mais simples até a mais flexível.
\n\nManeira 1: Aumentar o minSdkVersion para 24
\n\nEsta é 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):
android {\n ...\n defaultConfig {\n minSdkVersion 24\n targetSdkVersion 34\n ...\n }\n}\n\nVantagens: rápido, limpo