Я обновился до 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'
}
@CommonsWare, это было именно так, как вы упомянули. переход на 1.8 решил проблему, но мне придется проверить это на старых устройствах, чтобы узнать, что произойдет. код, который это сделал, был compileOptions {sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8}
спасибо за этот вопрос
Как CommonsWare упоминается, для справки добавьте это внутри закрытия android {...} в build.gradle для вашего модуля приложения, чтобы решить проблему:
android {
...
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
...
}
Укажите, что он должен быть внутри фигурной скобки android, например: android {// добавить сюда}
@ j2emanue Я уже добавил это в build.gradle, но по-прежнему получаю ту же проблему, только для сборки выпуска
Мне нужно было бы увидеть ваш файл Gradle как файлы проекта, так и файлы модуля Gradle. может задать вопрос.
добавление этого покажет неразрешенную ссылку в структуре проекта. Любое представление об этом?
я был обеспокоен тем, что это сделает мое приложение несовместимым со старыми устройствами Android, но это не так: developer.android.com/studio/write/java8-support
Меня устраивает. Но любопытно, что представляет собой вопрос. Подозрительным моментом является то, что DexGuard использует методы интерфейса по умолчанию.
Спасибо за этот ответ
Вы должны использовать Java 8, чтобы решить эту проблему. На основе документация Android это можно сделать, выбрав меню Файл → Структура проекта.
И измените Совместимость источников и Целевая совместимость.
И вы также можете настроить его прямо в файле 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
}
}
Спасибо, программист. Хорошая работа
Обновите свой 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.
Откройте окно настроек модуля (структура проекта), щелкнув правой кнопкой мыши папку приложения или Command + Down Arrow на Mac.
Перейти к Модули → Характеристики
Измените версию Совместимость источников и Целевая совместимость на 1.8
Щелкните Apply или OK. Вот и все. Это решит вашу проблему.
Также вы можете вручную добавить в файл build.gradle (Модуль: приложение):
android {
...
compileOptions {
sourceCompatibility = '1.8'
targetCompatibility = '1.8'
}
...
}
Это просто решило мою проблему. Но, пожалуйста, посоветуйте мне, как, черт возьми, вы узнали, что это решение?
В файле 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
спасибо за объяснение и информацию о том, какой файл обновлять. На уровне приложения или проекта.
Это тоже случилось со мной, но с использованием динамических функций. У меня уже была включена совместимость с Java 8 в модуле приложения, но мне пришлось добавить эти строки совместимости в модуль Dynamic Feature, и тогда это сработало.
Не могли бы вы привести пример, как это сделать?
@OlegYablokov Я имел в виду compileOptions {sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8}. Смотрите их здесь: stackoverflow.com/a/56911656/2823516
Лучше бы обнови свой ответ. Комментарии могут быть удалены в любое время. Но без «Edit:», «Update:» или подобное - ответ должен появиться так, как если бы он был написан сегодня.
В моем проекте используются 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
}
}
"Как вы можете видеть, я нацелен на 27, что уже опережает 24, на которые он жалуется?" - он не жалуется на ваш
targetSdkVersion. "Что именно я должен сделать, чтобы это исправить?" - попробуйте скомпилировать с Совместимость с Java 8 включена. "Если я перейду на 1.8 java, не буду ли я скучать по многим клиентам?" - не для методов интерфейса по умолчанию, на которые жалуется сообщение об ошибке. «Почему я не получал эту ошибку до обновления студии Android?» - возможно, неявная зависимость (например, привязка данных).