默认接口方法仅支持Android 7.0(Nougat)及以上版本。

340

我升级到了Android Studio 3.1,但是出现了以下错误:

仅从Android N(--min-api 24)开始支持默认接口方法:void android.arch.lifecycle.DefaultLifecycleObserver.onCreate(android.arch.lifecycle.LifecycleOwner)

Message{kind=ERROR, text=仅从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'
    }

27
你可以看到,我正在针对27进行目标设置,而它已经超过24,这就是它所抱怨的吗?-- 它并不是在抱怨你的targetSdkVersion。我应该做什么来解决这个问题?-- 尝试启用Java 8兼容性后重新编译。如果我改成1.8 Java,我会错失很多客户吗?-- 对于错误信息所抱怨的默认接口方法,不会错过太多的客户。为什么我升级Android Studio之前没有遇到这个错误呢?-- 可能是隐式依赖(例如数据绑定)导致的。 - CommonsWare
2
@CommonsWare 正如你所说。更改为1.8解决了问题,但我需要在旧设备上检查一下会发生什么。完成此操作的代码是compileOptions {sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8}。 - j2emanue
感谢您提出这个问题。 - Androider
10个回答

739

CommonsWare提到的,为了解决这个问题,在你的应用模块(app级别)的build.gradle中,在android {...}闭包中添加以下内容:

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

14
请明确指出应该在 Android 大括号内部添加,像这样:android {// 在此处添加 } - Idee
4
@j2emanue 我已经在 build.gradle 中添加了这个,但是发布版本仍然出现了同样的问题。 - ductran
我需要查看你的Gradle文件,包括项目和模块Gradle文件。或许你可以发布一个问题。 - j2emanue
2
叹气 为什么谷歌不能在默认项目设置中放置适当的东西呢?.. - Roman Truba
1
我曾担心这会使我的应用程序与旧版的Android设备不兼容,但事实并非如此:https://developer.android.com/studio/write/java8-support - Eric
显示剩余2条评论

88

根据Android文档,为了解决这个问题,您应该使用Java 8,并通过单击菜单文件项目结构进行更改。

然后更改源兼容性目标兼容性

输入图像描述

您也可以在应用级别的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
  }
}

谢谢你,程序员。做得很好。 - Enough Technology

63

1
感谢您对更新哪个文件的应用级别或项目级别进行解释和提供信息。 - Lalit Sharma

48

更新您的 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
    }
}

27
您可以通过将最新的Android Studio版本3.4.1中的源兼容性目标兼容性Java版本降级至1.8来解决此问题。
  1. 通过右键单击应用程序文件夹或Mac上的Command+Down Arrow打开模块设置(项目结构)窗口

    Enter image description here

  2. 转到模块属性

    Enter image description here

  3. 更改源兼容性目标兼容性版本为1.8

    Enter image description here

  4. 单击ApplyOK。就这样,它会解决您的问题。

此外,您还可以在文件build.gradle(模块:app)中手动添加:

android {
...

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

...
}

1
它刚好解决了我的问题。但请告诉我你是怎么知道这就是解决方案的? - mehrdad seyrafi

12
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"
}
在你的app模块的build.gradle文件中添加配置。
android {
    ...
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

7

在您的build.gradle文件中使用此代码:

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

3
我的项目使用ButterKnife和Retro lambda。设置JavaVersion.VERSION_1_8是不起作用的,它总是责怪ButterKnife静态接口函数,直到我找到了这个从Retrolambda迁移的文档。
简而言之,只需添加JavaVersion.VERSION_1_8并完全删除项目中的retrolambda,它将成功构建。

3

将minSdkVersion从19更改为21解决了我的问题。

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

1
这也发生在我身上,但是使用动态特性。我已经在应用程序模块中启用了Java 8兼容性,但我必须将此兼容性行添加到动态特性模块中,然后它才能正常工作。

1
你能提供一个如何做到这一点的例子吗? - Oleg Yablokov
@OlegYablokov 我的意思是:compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 }请参考这里:https://dev59.com/pFUL5IYBdhLWcg3w-sN4#56911656 - Joaquin Iurchuk
最好更新您的答案。评论可能随时被删除。但是请不要添加“编辑:”、“更新:”或类似的内容——答案应该看起来像是今天写的。 - Peter Mortensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接