仅从 Android 7.0 (Nougat) 开始支持默认接口方法

Posted

技术标签:

【中文标题】仅从 Android 7.0 (Nougat) 开始支持默认接口方法【英文标题】:Default interface methods are only supported starting with Android 7.0 (Nougat) 【发布时间】:2018-09-05 20:20:16 【问题描述】:

我升级到 android Studio 3.1 并收到以下错误:

仅从 Android N (--min-api 24) 开始支持默认接口方法: void android.arch.lifecycle.DefaultLifecycleObserver.onCreate(android.arch.lifecycle.LifecycleOwner) Messagekind=ERROR, text=默认接口方法仅支持从 Android N (--min-api 24) 开始: void android.arch.lifecycle.DefaultLifecycleObserver.onCreate(android.arch.lifecycle.LifecycleOwner), sources=[未知源文件],工具名=Optional.of(D8)

这是我的 Gradle 配置:

compileSdkVersion 27
//buildToolsVersion '27.0.3'
defaultConfig 
    minSdkVersion 16
    targetSdkVersion 27
     multiDexEnabled true
     //...
   

如您所见,我的目标是 27,它已经超过了它抱怨的 24。我究竟应该怎么做才能解决这个问题?如果我改用Java 1.8,我会不会错过很多客户?为什么我在升级 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,它已经超过了它抱怨的 24?" -- 它不是在抱怨你的targetSdkVersion。 “我该怎么做才能解决这个问题?” -- 尝试用Java 8 compatibility enabled 编译。 “如果我更改为 1.8 java,我会不会错过很多客户?” -- 不适用于错误消息所抱怨的默认接口方法。 “为什么我在升级 android studio 之前没有收到这个错误。”——可能是隐式依赖(例如,数据绑定)。 @CommonsWare 和你提到的完全一样。更改为 1.8 解决了这个问题,但我必须在旧设备上检查它,看看会发生什么。执行此操作的代码是 compileOptions sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 感谢您提出这个问题 【参考方案1】:

作为CommonsWare mentioned,将其添加到您的应用模块(应用级别)的build.gradle 中的android ... 闭包中以供参考,以解决问题:

android 
...
  compileOptions 
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    
...

【讨论】:

请指定它应该在android花括号内,如下所示:android // add here @j2emanue 我已经在 build.gradle 中添加了这个,但仍然遇到同样的问题,仅适用于发布版本 我必须查看您的 gradle 文件,包括项目和模块 gradle 文件。也许发布一个问题。 添加这将在项目结构中显示未解决的参考任何想法? Sigh 为什么 google 不能在默认项目设置中添加适当的东西?..【参考方案2】:
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
    

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

我的项目使用 ButterKnife 和 Retro lambda。设置 JavaVersion.VERSION_1_8 将不起作用。在我找到这个Migrate from Retrolambda之前,它总是责怪ButterKnife静态接口函数。

TL;DR

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

【讨论】:

【参考方案5】:

在app级的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

【讨论】:

感谢您提供有关要更新哪个文件的说明和信息。应用级别或项目级别。【参考方案6】:

您可以通过在最新的 Android Studio 版本 3.4.1 中将 Source Compatibility 和 *Target Compatibility Java 版本降级到 1.8 来解决此问题。

    通过右键单击应用文件夹或 Command + 向下箭头 在 Mac 上打开模块设置(项目结构)窗口

    转到模块属性

    Source CompatibilityTarget Compatibility 版本更改为 1.8

    单击应用确定。而已。它会解决你的问题。

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

android 
...

compileOptions 
        sourceCompatibility = '1.8'
        targetCompatibility = '1.8'
    

...

【讨论】:

它刚刚解决了我的问题。但请告诉我你怎么知道这是解决方案?【参考方案7】:

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

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

【讨论】:

【参考方案8】:

您应该使用 Java 8 来解决这个问题。基于the Android documentation,您可以通过单击菜单文件项目结构来做到这一点。

并更改Source CompatibilityTarget Compatibility

而且你也可以直接在app级的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 程序员。干得好【参考方案9】:

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

【讨论】:

【参考方案10】:

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

【讨论】:

您能举例说明如何做到这一点吗? @OlegYablokov 我的意思是 compileOptions sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 。在这里看到他们:***.com/a/56911656/2823516 最好update your answer。评论可能随时被删除。但是没有“编辑:”、“更新:”或类似的 - 答案应该看起来好像是今天写的。

以上是关于仅从 Android 7.0 (Nougat) 开始支持默认接口方法的主要内容,如果未能解决你的问题,请参考以下文章

Android 7.0 (Nougat) 打盹模式停止 Web 服务

android 7.0 (nougat)的编译优化-ninja

Android 警报管理器 setExactAndAllowWhileIdle() 在打盹模式下的 Android 7.0 Nougat 中不起作用

Android 7.0 Nougat(牛轧糖)---对开发者来说

具透丨Android 7.0 Nougat 正式版来了,这是最全面的上手指南

Android Studios:Android 设备管理器在文件资源管理器中未显示 Nougat 7.0 的文件