Standardschnittstellenmethoden werden nur ab Android N unterstützt

262

Ich habe ein Upgrade auf Android Studio 3.1 durchgeführt und erhalte die folgende Fehlermeldung:

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

Geben Sie hier die Bildbeschreibung ein

hier ist meine gradle config:

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

Wie Sie sehen können, ziele ich auf 27 ab, was bereits vor 24 liegt, über die es sich beschwert. Was genau soll ich tun, um dies zu beheben? Wenn ich auf 1.8 Java wechsle, werde ich dann nicht viele Kunden vermissen? Warum habe ich diesen Fehler nicht erhalten, bevor ich Android Studio aktualisiert habe?

Ich weiß nicht, ob es sich um die LifecycleObserver-Klasse handelt, die ich kürzlich eingefügt habe. Sie war in Kotlin und jetzt habe ich sie in Java geändert, aber nach dem Bereinigen des Projekts wird immer noch der gleiche Fehler angezeigt:

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

Wie kann ich nachverfolgen, woher der Fehler kommt, damit ich ihn beheben kann?

Hier sind meine Versionsabhängigkeiten:

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
quelle
20
"Wie Sie sehen können, ziele ich auf 27, was bereits vor 24 liegt, über die es sich beschwert?" - Es beschwert sich nicht über Ihre targetSdkVersion. "Was genau soll ich tun, um das zu beheben?" - Versuchen Sie, mit aktivierter Java 8-Kompatibilität zu kompilieren . "Wenn ich zu 1.8 Java wechsle, werde ich dann nicht viele Kunden vermissen?" - Nicht für die Standardschnittstellenmethoden, über die sich die Fehlermeldung beschwert. "Warum habe ich diesen Fehler nicht erhalten, bevor ich Android Studio aktualisiert habe?" - möglicherweise eine implizite Abhängigkeit (z. B. Datenbindung).
CommonsWare
2
@ CommonsWare war es genau wie du erwähnt hast. Das Ändern auf 1.8 hat das Problem behoben, aber ich muss es auf älteren Geräten überprüfen, um zu sehen, was passiert. Der Code, der es tat, war compileOptions {sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8}
j2emanue

Antworten:

597

Wie von CommonsWare erwähnt, fügen Sie dies als Referenz in den android {...}Abschluss in build.gradle für Ihr App-Modul ein, um das Problem zu beheben:

android {
...
  compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
...
}
j2emanue
quelle
13
Bitte geben Sie an, dass es sich wie folgt in der geschweiften Klammer des Android befinden soll: android {// hier hinzufügen}
Idee
3
@ j2emanue Ich habe dieses bereits in build.gradle hinzugefügt, bekomme aber immer noch das gleiche Problem, nur für Release Build
R4j
Ich müsste Ihre Gradle-Datei sowohl Projekt- als auch Modul-Gradle-Dateien sehen. Vielleicht eine Frage stellen.
j2emanue
Wenn Sie dies hinzufügen, wird ein ungelöster Verweis in die Projektstruktur angezeigt. Haben Sie eine Idee dazu?
Urvish Rana
1
Seufz Warum kann Google nicht einfach entsprechende Dinge in die Standardeinstellungen des Projekts
einfügen
65

Sie sollten Java8 verwenden, um dies zu lösen. Basierend auf Google können Sie dies tun (klicken Sie auf Datei> Projektstruktur ). und ändern Sie die Quell- und Zielkompatibilität.

Geben Sie hier die Bildbeschreibung ein

Sie können es auch direkt in der entsprechenden build.gradle-Datei konfigurieren:

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
quelle
Vielen Dank Programmierer. Gute Arbeit
Zafar Iqbal
54

In Gradle auf App-Ebene müssen Sie diesen Code schreiben:

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

Sie kommen von JavaVersion.java in Android.

Eine Aufzählung von Java-Versionen.

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

Nach 9: http://openjdk.java.net/jeps/223

@canerkaseler

canerkaseler
quelle
1
Vielen Dank für die Erklärung und Informationen darüber, welche Datei aktualisiert werden soll. App-Ebene oder Projektebene.
Lalit Sharma
31

Aktualisieren Sie Ihren Build.gradle (Modul: App), fügen Sie einen compileOptionsBlock hinzu und fügen Sie ihn hinzuJavaVersion.VERSION_1_8

apply plugin: 'com.android.application'

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

Sie können dieses Problem beheben, indem Sie die Java-Version für Quellkompatibilität und Zielkompatibilität in der neuesten Android Studio-Version 3.4.1 auf 1.8 herabstufen

  1. Öffnen Sie die Moduleinstellungen (Projektstruktur) Winodw, indem Sie mit der rechten Maustaste auf den App-Ordner oder Befehl + Abwärtspfeil auf dem Mac klicken Geben Sie hier die Bildbeschreibung ein

  2. Gehen Sie zu Module -> Eigenschaften Geben Sie hier die Bildbeschreibung ein

  3. Ändern Sie die Quellkompatibilitäts- und Zielkompatibilitätsversion in 1.8 Geben Sie hier die Bildbeschreibung ein

  4. Klicken Sie auf Übernehmen oder OK. Es wird Ihr Problem lösen.

Sie können build.gradle auch manuell hinzufügen (Modul: App)

android {
...

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

...
}
Rajesh Dalsaniya
quelle
1
Es hat gerade mein Problem gelöst. Aber bitte raten Sie mir, woher zum Teufel wussten Sie, dass dies die Lösung ist?
mehrdad seyrafi
5

Verwenden Sie diesen Code in Ihrem build.gradle

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

Mein Projekt verwendet ButterKnife und Retro Lambda. Das Festlegen von JavaVersion.VERSION_1_8 funktioniert nicht. Es gibt immer die Schuld an der statischen Schnittstellenfunktion von ButterKnife, bis ich diese Migration von Retrolambda gefunden habe

TL; DR

Fügen Sie einfach JavaVersion.VERSION_1_8 hinzu und ENTFERNEN Sie Retrolambda vollständig aus Ihrem Projekt. Es wird erfolgreich gebaut.

leegor
quelle
0

Dies ist mir auch passiert, aber ich habe dynamische Funktionen verwendet. Ich hatte bereits Java 8-Kompatibilität im App-Modul aktiviert, musste diese Kompatibilitätszeilen jedoch zum Dynamic Feature-Modul hinzufügen, und dann funktionierte es.

Joaquin Iurchuk
quelle
0

Das Setzen der minSdkVersion auf 21 von 19 löste das Problem für mich.

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