仅从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 Java,会不会有很多客户?” -不适用于错误消息所抱怨的默认接口方法。“为什么在升级android studio之前我没有得到这个错误。”-也许是隐式的依赖关系(例如,数据绑定)。
CommonsWare'Mar

2
@CommonsWare正是您所提到的。更改为1.8可解决此问题,但我将不得不在较旧的设备上进行检查以查看会发生什么。做到这一点的代码是compileOptions {sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8}
j2emanue

Answers:


596

如CommonsWare所述,作为参考,请将其添加android {...}到build.gradle 的闭包内部,以解决您的应用模块问题:

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

13
请指定它应位于android花括号内,如下所示:android {//在此处添加}
Idee

3
@ j2emanue我已经在build.gradle中添加了这个,但是仍然遇到相同的问题,仅对于发布版本
R4j

我将不得不看到您的gradle文件项目和模块gradle文件。也许发布一个问题。
j2emanue '18

添加此标记将在项目结构中显示出不受引用的引用,对此有任何想法吗?
Urvish rana

1
叹息为什么Google不能只在默认项目设置中放入适当的内容?..
Roman Truba

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

Thankuu程序员。尼斯·乔布
Zafar Iqbal

53

在应用程序级gradle中,您必须编写以下代码:

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

它们来自Android中的JavaVersion.java

Java版本的枚举。

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

9点之后:http//openjdk.java.net/jeps/223

@canerkaseler


1
感谢您的解释和有关要更新的文件的信息。应用程序级别或项目级别。
Lalit Sharma

30

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

25

您可以通过在最新的Android Studio版本3.4.1中将源兼容性和目标兼容性Java版本降级为1.8来解决此问题。

  1. 右键单击应用程序文件夹或在Mac上单击Command +向下箭头,以打开模块设置(项目结构)Winodw 在此处输入图片说明

  2. 转到模块->属性 在此处输入图片说明

  3. 将源兼容性和目标兼容性版本更改为1.8 在此处输入图片说明

  4. 单击“应用”或“确定”。它将解决您的问题。

您也可以手动添加build.gradle(模块:app)

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将不起作用。在我从Retrolambda找到此迁移之前,它总是归咎于ButterKnife静态接口功能

TL; DR

只需添加JavaVersion.VERSION_1_8并从项目中完全删除retrolambda。它将成功构建。


0

这也发生在我身上,但是使用了动态功能。我已经在app模块中启用了Java 8兼容性,但是我必须将此兼容性行添加到Dynamic Feature模块中,然后它才能工作。


0

将minSdkVersion从19设置为21为我解决了这个问题。

defaultConfig {
        applicationId "com.example"
        minSdkVersion 21
        targetSdkVersion 29
        versionCode 23
        versionName "1.0"
        vectorDrawables.useSupportLibrary = true
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.