I metodi di interfaccia predefiniti sono supportati solo a partire da Android N


292

Ho eseguito l'aggiornamento ad Android Studio 3.1 e ricevo il seguente errore:

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)}

Errore

Ecco la mia configurazione gradle:

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

Come puoi vedere, sto prendendo di mira 27 che è già davanti a 24 di cui si lamenta. Cosa devo fare esattamente per risolvere questo problema? Se cambio a 1.8 java, non mi mancheranno molti clienti? Perché non ho ricevuto questo errore prima di aggiornare Android Studio?

Non so se si tratta della classe LifecycleObserver che ho inserito di recente, era in Kotlin e ora l'ho cambiata in java ma ricevo ancora lo stesso errore dopo la pulizia del progetto:

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);
    }
}

Come rintracciare da dove proviene l'errore in modo da poterlo risolvere?

Ecco le mie dipendenze dalla versione:

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'
    }

21
"come puoi vedere sto mirando a 27 che è già davanti a 24 di cui si lamenta?" - non si lamenta del tuo targetSdkVersion. "Che cosa devo fare esattamente per risolvere questo problema?" - prova a compilare con la compatibilità Java 8 abilitata . "se cambio a 1.8 java non mi mancheranno molti clienti?" - non per i metodi di interfaccia predefiniti di cui si lamenta il messaggio di errore. "perché non ricevevo questo errore prima di aggiornare Android Studio." - forse una dipendenza implicita (ad esempio, associazione dati).
CommonsWare

2
@CommonsWare era esattamente come hai detto. il passaggio a 1.8 ha risolto il problema, ma dovrò controllarlo su dispositivi meno recenti per vedere cosa succede. il codice che lo ha fatto era compileOptions {sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8}
j2emanue

grazie per questa domanda
Andama

Risposte:


649

Come menzionato da CommonsWare, per riferimento aggiungi questo all'interno della android {...}chiusura in build.gradle per il modulo dell'app per risolvere il problema:

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

13
Si prega di specificare che dovrebbe essere all'interno della parentesi graffa Android in questo modo: android {// aggiungi qui}
Idee

3
@ j2emanue Ho già aggiunto questo in build.gradle, ma ho ancora lo stesso problema, solo per la build di rilascio
R4j

dovrei vedere il tuo file gradle sia il progetto che i file gradle del modulo. magari posta una domanda.
j2emanue

l'aggiunta di questo mostrerà riferimenti irrisolti nella struttura del progetto qualche idea al riguardo?
Urvish rana

1
Sigh Perché google non può semplicemente mettere cose appropriate nelle impostazioni di progetto predefinite? ..
Roman Truba

72

Dovresti usare Java 8 per risolvere questo problema, in base alla documentazione di Android con cui puoi farlo

facendo clic su File> Struttura del progetto

e cambia Source Compatibilitye Target Compatibility.

inserisci qui la descrizione dell'immagine

e puoi anche configurarlo direttamente nel build.gradlefile a livello di app :

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
  }
}

Programmatore Thankuu Nice Job
Zafar Iqbal

57

In gradle a livello di app, devi scrivere questo codice:

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

Provengono da JavaVersion.java in Android.

Un'enumerazione delle versioni di Java.

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

Dopo il 9: http://openjdk.java.net/jeps/223

@canerkaseler


1
grazie per la spiegazione e le informazioni su quale file aggiornare. A livello di app o di progetto.
Lalit Sharma

43

Aggiorna il tuo build.gradle (Modulo: app) aggiungi compileOptionsblocco e aggiungiJavaVersion.VERSION_1_8

apply plugin: 'com.android.application'

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

25

È possibile risolvere questo problema eseguendo il downgrade della versione Java di compatibilità di origine e compatibilità di destinazione alla versione 1.8 nell'ultima versione di Android Studio 3.4.1

  1. Apri Impostazioni modulo (struttura progetto) Winodw facendo clic con il pulsante destro del mouse sulla cartella dell'app o Comando + Freccia giù su Mac inserisci qui la descrizione dell'immagine

  2. Vai a Moduli -> Proprietà inserisci qui la descrizione dell'immagine

  3. Modificare la compatibilità di origine e la versione di compatibilità di destinazione su 1.8 inserisci qui la descrizione dell'immagine

  4. Fare clic su Applica o su OK. Risolverà il tuo problema.

Inoltre puoi aggiungere manualmente build.gradle (Modulo: app)

android {
...

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

...
}

1
Ha appena risolto il mio problema. Ma per favore avvisami come diavolo hai fatto a sapere che questa è la soluzione?
mehrdad seyrafi

7
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'


android {
compileSdkVersion 30
buildToolsVersion "30.0.0"

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

defaultConfig {
    applicationId "com.example.architecture"
    minSdkVersion 16
    targetSdkVersion 30
    versionCode 1
    versionName "1.0"

    testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
 buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
   }
}
dependencies {

implementation 'androidx.room:room-runtime:2.2.5'
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
annotationProcessor 'androidx.room:room-compiler:2.2.5'
def lifecycle_version = "2.2.0"
def arch_version = "2.1.0"

implementation fileTree(dir: "libs", include: ["*.jar"])
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation 'androidx.core:core-ktx:1.3.0'
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
implementation "androidx.lifecycle:lifecycle-viewmodel-savedstate:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-service:$lifecycle_version"
implementation "androidx.lifecycle:lifecycle-process:$lifecycle_version"
implementation "androidx.cardview:cardview:1.0.0"
}

Aggiungi la configurazione nel modulo della tua appbuild.gradle

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

5

Usa questo codice nel tuo build.gradle

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

2

Il mio progetto utilizza ButterKnife e Retro lambda, l'impostazione di JavaVersion.VERSION_1_8 non funzionerà. Incolpa sempre la funzione dell'interfaccia statica di ButterKnife fino a quando non ho trovato questo Migrate from Retrolambda

TL; DR

Basta aggiungere JavaVersion.VERSION_1_8 e RIMUOVI completamente retrolambda dal tuo progetto. Costruirà con successo.


2

L'impostazione di minSdkVersion su 21 da 19 ha risolto il problema per me.

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

0

Questo è successo anche a me, ma utilizzando le funzionalità dinamiche. Avevo già la compatibilità Java 8 abilitata nel modulo dell'app, ma ho dovuto aggiungere queste linee di compatibilità al modulo Dynamic Feature e poi ha funzionato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.