仅从 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 Compatibility 和 Target 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 Compatibility和Target 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(牛轧糖)---对开发者来说