仅从Android N开始支持默认接口方法

时间:2018-03-27 12:16:38

标签: android java-8 kotlin

我升级到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)}

enter image description here

这是我的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'
    }

10 个答案:

答案 0 :(得分:294)

正如CommonsWare所提到的那样,为了参考,在build.gradle的android {...}闭包内添加这个,以便你的app模块解决问题:

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

答案 1 :(得分:24)

您应该使用Java8来解决此问题,基于google,您可以通过以下方法来做到这一点(单击文件>项目结构)。并更改源兼容性和目标兼容性。

enter image description here

您还可以直接在相应的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
  }
}

答案 2 :(得分:9)

更新您的build.gradle(Module:app)添加SearchTerm olderThan = new ReceivedDateTerm(ComparisonTerm.LT, someFutureDate); SearchTerm newerThan = new ReceivedDateTerm(ComparisonTerm.GT, somePastDate); SearchTerm andTerm = new AndTerm(olderThan, newerThan); inbox.search(andTerm); 块并添加compileOptions

JavaVersion.VERSION_1_8

答案 3 :(得分:7)

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

  1. 在Mac上右键单击应用程序文件夹或Command +向下箭头以打开模块设置(项目结构)Winodw enter image description here

  2. 转到模块->属性 enter image description here

  3. 将源兼容性和目标兼容性版本更改为1.8 enter image description here

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

您还可以手动添加build.gradle(模块:应用程序)

android {
...

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

...
}

答案 4 :(得分:7)

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

答案 5 :(得分:4)

在应用程序级别的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

答案 6 :(得分:2)

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

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

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

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

答案 9 :(得分:0)

我的项目使用ButterKnife和Retro lambda,设置JavaVersion.VERSION_1_8将不起作用。在我找到这个Migrate from Retrolambda

之前,它总是归咎于ButterKnife静态接口功能。

TL; DR

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