Методи інтерфейсу за замовчуванням підтримуються лише починаючи з 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, чи не пропустять я багато клієнтів? Чому я не отримував цієї помилки перед оновленням андроїд-студії?

Я не знаю, чи йдеться про клас 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 Java, я не буду бракувати багато клієнтів?" - не для методів інтерфейсу за замовчуванням, на які скаржиться повідомлення про помилку. "чому я не отримував цієї помилки перед тим, як я оновив андроїд-студію." - можливо, неявна залежність (наприклад, прив'язка даних).
CommonsWare

2
@CommonsОбережно, це було саме так, як ви згадали. Зміна на 1.8 вирішила проблему, але мені доведеться перевірити це на старих пристроях, щоб побачити, що відбувається. код, який це зробив, був компільованийОпції {sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8}
j2emanue

Відповіді:


596

Як згадувалося в CommonsWare, для довідок додайте це всередину android {...}закриття в build.gradle для вашого модуля програми, щоб вирішити проблему:

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

13
Вкажіть, будь ласка, що він повинен знаходитись у фігурній дужці андроїда так: android {// додати тут}
Idee

3
@ j2emanue Я вже додав цей у build.gradle, але все одно отримаю ту саму проблему, лише для збирання релізу
R4j

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

додавши це, покаже невподобане посилання в структуру проекту будь-яке уявлення про це?
Urvish rana

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

Програміст з подяки. Нічна робота
Зафар Ікбал

53

У градусі на рівні додатків потрібно написати цей код:

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
дякую за пояснення та інформацію про те, який файл потрібно оновити. Додаток або рівень проекту.
Лаліт Шарма

30

Оновіть 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 до версії 1.8 до останньої версії Android Studio 3.4.1

  1. Відкрийте Параметри модуля (Структура проекту) Winodw, клацнувши правою кнопкою миші на папці програми або Command + Стрілка вниз на Mac введіть тут опис зображення

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

  3. Змініть сумісність джерела та цільову сумісність версії на 1.8 введіть тут опис зображення

  4. Клацніть на Застосувати або Гаразд Це все. Це вирішить вашу проблему.

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

android {
...

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

...
}

1
Це просто вирішило мою проблему. Але, будь ласка, порадите мені, як, чорт, ви знали, що це рішення?
mehrdad seyrafi

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, поки я не знайшов цю міграцію від Retrolambda

TL; DR

Просто додайте JavaVersion.VERSION_1_8 і повністю ВИДАЛУЙТЕ retrolambda зі свого проекту. Це буде успішно будуватися.


0

Це трапилось і зі мною, але за допомогою функції Dynamic. У мене вже було включено сумісність 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.