Os métodos de interface padrão são suportados apenas a partir do Android N

262

Atualizei para o android studio 3.1 e estou recebendo o seguinte erro:

    Default interface methods are only supported starting with Android N (--min-api 24): void android.arch.lifecycle.DefaultLifecycleObserver.onCreate(android.arch.lifecycle.LifecycleOwner)
Message{kind=ERROR, text=Default interface methods are only supported starting with Android N (--min-api 24): void android.arch.lifecycle.DefaultLifecycleObserver.onCreate(android.arch.lifecycle.LifecycleOwner), sources=[Unknown source file], tool name=Optional.of(D8)}

insira a descrição da imagem aqui

aqui está a minha configuração gradle:

compileSdkVersion 27
//buildToolsVersion '27.0.3'
defaultConfig {
    minSdkVersion 16
    targetSdkVersion 27
     multiDexEnabled true
     //...
   }

Como você pode ver, estou direcionando 27, que já estão à frente dos 24 dos quais está reclamando. O que exatamente devo fazer para corrigir isso? Se eu mudar para 1,8 java, não sentirei falta de muitos clientes? Por que não recebi esse erro antes de atualizar o android studio?

Não sei se isso é sobre a classe LifecycleObserver que eu inseri recentemente, estava no kotlin e agora mudei para java, mas ainda assim recebo o mesmo erro após a limpeza do projeto:

    public class LifeCycleAwareObserver implements LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    public void  onAppBackgrounded() {
        AnalyticsUtils.trackStartSession(true);
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void onAppForegrounded() {
        AnalyticsUtils.trackStartSession(false);
    }
}

Como rastrear a origem do erro para que eu possa corrigi-lo?

aqui estão as minhas dependências de versão:

project.ext {

        firebase_version = '12.0.0'

        supportlib_version = '27.0.2'

        room_version = '1.0.0'

        espresso_version = '3.0.1'

        archLifecycleVersion = '1.1.1'
    }
j2emanue
fonte
20
"como você pode ver, eu estou mirando 27, que já está à frente de 24 que está reclamando?" - não está reclamando do seu targetSdkVersion. "O que exatamente devo fazer para consertar isso?" - tente compilar com a compatibilidade com Java 8 ativada . "se eu mudar para 1.8 java, não vou perder muitos clientes?" - não para os métodos de interface padrão dos quais a mensagem de erro está reclamando. "por que eu não estava recebendo esse erro antes de atualizar o android studio." - talvez uma dependência implícita (por exemplo, ligação de dados).
CommonsWare 27/03/18
2
@ CommmonsWare foi exatamente como você mencionou. alterar para 1,8 resolveu o problema, mas terei que verificar em dispositivos mais antigos para ver o que acontece. o código que o fez foi compileOptions {sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8}
j2emanue

Respostas:

597

Como o CommonsWare mencionou, para referência, adicione isso dentro do android {...}fechamento no build.gradle para o seu módulo de aplicativo resolver o problema:

android {
...
  compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
...
}
j2emanue
fonte
13
Por favor, especifique que ele deve estar dentro da chaveta android assim: android {// acrescentar aqui}
Idee
3
@ j2emanue Já adicionado este um em build.gradle, mas ainda obter o mesmo problema, apenas para compilação de lançamento
R4j
Eu teria que ver o seu arquivo gradle arquivos de projeto e módulo gradle. talvez poste uma pergunta.
J2emanue
adicionar isso mostrará uma referência não recomendada na estrutura do projeto, alguma idéia sobre isso?
Urvish rana
1
Suspirar por que o Google não pode simplesmente colocar as coisas apropriadas nas configurações padrão do projeto ..?
Roman Truba
65

Você deve usar o Java8 para resolver isso. Com base no google, você pode fazer isso (clique em Arquivo> Estrutura do projeto ). e altere a compatibilidade de origem e a compatibilidade de destino.

insira a descrição da imagem aqui

E você também pode configurá-lo diretamente no arquivo build.gradle correspondente:

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
  }
}
Amir
fonte
Thankuu programmer.Nice Job
Zafar Iqbal
54

No gradle no nível do aplicativo, você deve escrever este código:

android {
...
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
  }
}

Eles vêm do JavaVersion.java no Android.

Uma enumeração de versões Java.

Antes das 9: http://www.oracle.com/technetwork/java/javase/versioning-naming-139433.html

Após as 9: http://openjdk.java.net/jeps/223

@canerkaseler

canerkaseler
fonte
1
obrigado pela explicação e informações sobre qual arquivo atualizar. Nível de aplicativo ou nível de projeto.
Lalit Sharma
31

Atualize seu build.gradle (Module: app) add compileOptionsblock e addJavaVersion.VERSION_1_8

apply plugin: 'com.android.application'

android {
    .................
    .........................
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}
Vasudev Vyas
fonte
25

Você pode resolver esse problema fazendo o downgrade da versão Java da compatibilidade de origem e compatibilidade de destino para 1.8 na versão mais recente do Android Studio 3.4.1

  1. Abra as Configurações do módulo (Estrutura do projeto) Winodw clicando com o botão direito do mouse na pasta do aplicativo ou Command + Seta para baixo no Mac insira a descrição da imagem aqui

  2. Vá para Módulos -> Propriedades insira a descrição da imagem aqui

  3. Alterar a compatibilidade de origem e a versão de compatibilidade de destino para 1.8 insira a descrição da imagem aqui

  4. Clique em Aplicar ou OK É isso. Isso resolverá o seu problema.

Além disso, você pode adicionar manualmente o build.gradle (Módulo: app)

android {
...

compileOptions {
        sourceCompatibility = '1.8'
        targetCompatibility = '1.8'
    }

...
}
Rajesh Dalsaniya
fonte
1
Apenas resolveu o meu problema. Mas, por favor, me informe como diabos você sabia que esta é a solução?
mehrdad seyrafi
5

Use este código em seu build.gradle

android {
    compileOptions {
        incremental true
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}
Mahabub Karim
fonte
2

Meu projeto usa ButterKnife e Retro lambda, definindo JavaVersion.VERSION_1_8 não funcionará. Ele sempre culpa a função de interface estática do ButterKnife até encontrar esse Migrate from Retrolambda

TL; DR

Basta adicionar JavaVersion.VERSION_1_8 e REMOVER completamente a retrolambda do seu projeto. Ele será construído com sucesso.

leegor
fonte
0

Isso também aconteceu comigo, mas usando Recursos Dinâmicos. Eu já tinha a compatibilidade com o Java 8 ativada no módulo de aplicativo, mas precisava adicionar essas linhas de compatibilidade ao módulo Dynamic Feature e, em seguida, funcionou.

Joaquin Iurchuk
fonte
0

Definir o minSdkVersion para 21 de 19 resolveu o problema para mim.

defaultConfig {
        applicationId "com.example"
        minSdkVersion 21
        targetSdkVersion 29
        versionCode 23
        versionName "1.0"
        vectorDrawables.useSupportLibrary = true
    }
ricky roy
fonte