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


262

Я обновился до 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)}

введите описание изображения здесь

вот мой конфиг 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'
    }

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

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

Ответы:


597

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

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

13
Пожалуйста, укажите, что он должен быть внутри фигурной скобки Android, например: android {// add here}
Idee

3
@ j2emanue Я уже добавил этот файл в build.gradle, но все еще получаю ту же проблему, только для релизной сборки
R4j

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

добавив это, вы увидите невостребованную ссылку в структуре проекта.
Урвиш Рана

1
Вздох Почему Google не может просто поместить соответствующие вещи в настройки проекта по умолчанию? ..
Роман Труба

65

Вы должны использовать Java8 для решения этой проблемы, на основе Google вы можете сделать это, нажав ( Файл> Структура проекта ). и измените Совместимость источника и Целевую совместимость.

введите описание изображения здесь

И Вы также можете настроить его непосредственно в соответствующем файле 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
  }
}

Спасибо программисту. Отличная работа
Зафар Икбал

54

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

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

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

Перечень версий Java.

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

После 9: http://openjdk.java.net/jeps/223

@canerkaseler


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

31

Обновите свой build.gradle (Модуль: приложение), добавьте compileOptionsблок и добавьтеJavaVersion.VERSION_1_8

apply plugin: 'com.android.application'

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

25

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

  1. Откройте настройки модуля (структура проекта) Winodw, щелкнув правой кнопкой мыши папку приложения или Ctrl + Стрелка вниз на Mac введите описание изображения здесь

  2. Перейти к модулям -> Свойства введите описание изображения здесь

  3. Изменить версию «Совместимость источника» и «Целевая совместимость» на 1.8 введите описание изображения здесь

  4. Нажмите Применить или ОК. Это решит вашу проблему.

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

android {
...

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

...
}

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

5

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

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

2

Мой проект использует ButterKnife и Retro lambda, настройка JavaVersion.VERSION_1_8 не будет работать. Это всегда обвиняет в статической функции интерфейса ButterKnife, пока я не нашел это Migrate from Retrolambda

TL; DR

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


0

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


0

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

defaultConfig {
        applicationId "com.example"
        minSdkVersion 21
        targetSdkVersion 29
        versionCode 23
        versionName "1.0"
        vectorDrawables.useSupportLibrary = true
    }
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.