Методы интерфейса по умолчанию поддерживаются только начиная с Android 7.0 (Nougat)

Я обновился до Android Studio 3.1 и получаю следующую ошибку:

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

Методы интерфейса по умолчанию поддерживаются только начиная с Android 7.0 (Nougat)

Вот моя конфигурация Gradle:

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

Как видите, я нацелен на 27, что уже опережает 24, на которые он жалуется. Что именно я должен сделать, чтобы это исправить? Если я перейду на 1.8 Java, не упущу ли я много клиентов? Почему я не получал эту ошибку до обновления Android Studio?

Я не знаю, относится ли это к классу LifecycleObserver, который я недавно добавил. Он был в Kotlin, и теперь я изменил его на Java, но после очистки проекта у меня все равно возникает та же ошибка:

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

Как я могу отследить источник ошибки и исправить ее?

Вот мои зависимости от версии:

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

"Как вы можете видеть, я нацелен на 27, что уже опережает 24, на которые он жалуется?" - он не жалуется на ваш targetSdkVersion. "Что именно я должен сделать, чтобы это исправить?" - попробуйте скомпилировать с Совместимость с Java 8 включена. "Если я перейду на 1.8 java, не буду ли я скучать по многим клиентам?" - не для методов интерфейса по умолчанию, на которые жалуется сообщение об ошибке. «Почему я не получал эту ошибку до обновления студии Android?» - возможно, неявная зависимость (например, привязка данных).

CommonsWare 27.03.2018 14:32

@CommonsWare, это было именно так, как вы упомянули. переход на 1.8 решил проблему, но мне придется проверить это на старых устройствах, чтобы узнать, что произойдет. код, который это сделал, был compileOptions {sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8}

j2emanue 27.03.2018 17:25

спасибо за этот вопрос

Androider 26.08.2020 21:12
306
3
120 345
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

Ответ принят как подходящий

Как CommonsWare упоминается, для справки добавьте это внутри закрытия android {...} в build.gradle для вашего модуля приложения, чтобы решить проблему:

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

Укажите, что он должен быть внутри фигурной скобки android, например: android {// добавить сюда}

Idee 07.06.2018 17:29

@ j2emanue Я уже добавил это в build.gradle, но по-прежнему получаю ту же проблему, только для сборки выпуска

R4j 04.09.2018 16:28

Мне нужно было бы увидеть ваш файл Gradle как файлы проекта, так и файлы модуля Gradle. может задать вопрос.

j2emanue 04.09.2018 18:56

добавление этого покажет неразрешенную ссылку в структуре проекта. Любое представление об этом?

Urvish rana 01.05.2019 11:27
Вздох Почему Google не может просто поставить соответствующие вещи в настройки проекта по умолчанию? ..
Roman Truba 18.06.2019 13:04

я был обеспокоен тем, что это сделает мое приложение несовместимым со старыми устройствами Android, но это не так: developer.android.com/studio/write/java8-support

Eric 09.07.2019 17:17

Меня устраивает. Но любопытно, что представляет собой вопрос. Подозрительным моментом является то, что DexGuard использует методы интерфейса по умолчанию.

Francis Bacon 14.07.2020 08:55

Спасибо за этот ответ

Androider 26.08.2020 21:11

Вы должны использовать Java 8, чтобы решить эту проблему. На основе документация Android это можно сделать, выбрав меню ФайлСтруктура проекта.

И измените Совместимость источников и Целевая совместимость.

Enter image description here

И вы также можете настроить его прямо в файле build.gradle уровня приложения:

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

Спасибо, программист. Хорошая работа

Zafar Iqbal 14.03.2020 08:46

Обновите свой build.gradle (Module: app), добавьте блок compileOptions и добавьте JavaVersion.VERSION_1_8

apply plugin: 'com.android.application'

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

Используйте этот код в своем файле build.gradle:

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

Вы можете решить эту проблему, понизив версию Java Совместимость источников и * Target Compatibility до 1.8 в последней версии Android Studio 3.4.1.

  1. Откройте окно настроек модуля (структура проекта), щелкнув правой кнопкой мыши папку приложения или Command + Down Arrow на Mac.

    Enter image description here

  2. Перейти к МодулиХарактеристики

    Enter image description here

  3. Измените версию Совместимость источников и Целевая совместимость на 1.8

    Enter image description here

  4. Щелкните Apply или OK. Вот и все. Это решит вашу проблему.

Также вы можете вручную добавить в файл build.gradle (Модуль: приложение):

android {
...

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

...
}

Это просто решило мою проблему. Но, пожалуйста, посоветуйте мне, как, черт возьми, вы узнали, что это решение?

mehrdad seyrafi 16.05.2020 03:17

В файле Gradle уровня приложения вы должны написать этот код:

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

Они исходят из JavaVersion.java в Android.

An enumeration of Java versions.

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

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

спасибо за объяснение и информацию о том, какой файл обновлять. На уровне приложения или проекта.

Lalit Sharma 12.06.2020 09:55

Это тоже случилось со мной, но с использованием динамических функций. У меня уже была включена совместимость с Java 8 в модуле приложения, но мне пришлось добавить эти строки совместимости в модуль Dynamic Feature, и тогда это сработало.

Не могли бы вы привести пример, как это сделать?

Oleg Yablokov 23.01.2021 16:04

@OlegYablokov Я имел в виду compileOptions {sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8}. Смотрите их здесь: stackoverflow.com/a/56911656/2823516

Joaquin Iurchuk 27.01.2021 03:07

Лучше бы обнови свой ответ. Комментарии могут быть удалены в любое время. Но без «Edit:», «Update:» или подобное - ответ должен появиться так, как если бы он был написан сегодня.

Peter Mortensen 10.05.2021 16:20

В моем проекте используются ButterKnife и Retro lambda. Установка JavaVersion.VERSION_1_8 работать не будет. Он всегда обвинял функцию статического интерфейса ButterKnife, пока я не нашел этот Переход с Retrolambda.

TL; DR

Просто добавьте JavaVersion.VERSION_1_8 и полностью ретроламбду Удалить из вашего проекта. Он будет успешно построен.

Изменение minSdkVersion с 19 на 21 решило проблему для меня.

defaultConfig {
    applicationId "com.example"
    minSdkVersion 21
    targetSdkVersion 29
    versionCode 23
    versionName "1.0"
    vectorDrawables.useSupportLibrary = true
}
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"
}

Добавьте конфигурацию в build.gradle вашего модуля приложение

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

Другие вопросы по теме