Question or issue of Kotlin Programming:
I upgraded to android studio 3.1 and I’m getting the following error:
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)}
Here is my gradle config:
compileSdkVersion 27 //buildToolsVersion '27.0.3' defaultConfig { minSdkVersion 16 targetSdkVersion 27 multiDexEnabled true //... }
As you can see, I am targeting 27 which is already ahead of 24 that it’s complaining about. What exactly should I do to fix this? If I change to 1.8 java, won’t I be missing a lot of customers? Why was I not getting this error before I upgraded Android Studio?
I do not know if this is about the LifecycleObserver class I recently put in, it was in Kotlin and now I changed it to java but still get the same error after cleaning project:
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); } }
How to trace where the error is coming from so I can fix it?
Here are my version dependencies:
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' }
How to solve this issue?
Solution no. 1:
As CommonsWare mentioned, for reference add this inside the android {...}
closure in the build.gradle for your app module to resolve issue:
android { ... compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } ... }
Solution no. 2:
You should use Java 8 to solve this, based on the Android documentation you can do this by
clicking File > Project Structure
and change Source Compatibility
and Target Compatibility
.
and you can also configure it directly in the app-level build.gradle
file:
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 } }
Solution no. 3:
In app-level gradle, you have to write these code:
android { ... compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } }
They come from JavaVersion.java in Android.
An enumeration of Java versions.
Before 9: http://www.oracle.com/technetwork/java/javase/versioning-naming-139433.html
After 9: http://openjdk.java.net/jeps/223
@canerkaseler
Solution no. 4:
Update your build.gradle(Module:app) add compileOptions
block and add JavaVersion.VERSION_1_8
apply plugin: 'com.android.application' android { ................. ......................... compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } }
Solution no. 5:
You can resolve this issue by downgrading Source Compatibility and Target Compatibility Java Version to 1.8 in Latest Android Studio Version 3.4.1
-
Open Module Settings (Project Structure) Winodw by right clicking on app folder or Command + Down Arrow on Mac
-
Change Source Compatibility and Target Compatibility Version to 1.8
-
Click on Apply or OK Thats it. It will solve your issue.
Also you can manually add in build.gradle (Module: app)
android { ... compileOptions { sourceCompatibility = '1.8' targetCompatibility = '1.8' } ... }
Solution no. 6:
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" }
Add the configuration in your app module’s build.gradle
android { ... compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } }
Solution no. 7:
Use this code in your build.gradle
android { compileOptions { incremental true sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } }
Solution no. 8:
My project use ButterKnife and Retro lambda, setting JavaVersion.VERSION_1_8 will not work. It always blames at ButterKnife static interface function until I found this Migrate from Retrolambda
TL;DR
Just add JavaVersion.VERSION_1_8 and completely REMOVE retrolambda from your project. It will build successfully.
Solution no. 9:
Setting the minSdkVersion to 21 from 19 solved the issue for me.
defaultConfig { applicationId "com.example" minSdkVersion 21 targetSdkVersion 29 versionCode 23 versionName "1.0" vectorDrawables.useSupportLibrary = true }
Solution no. 10:
This also happened to me but using Dynamic Features. I already had Java 8 compatibility enabled in the app module but I had to add this compatibility lines to the Dynamic Feature module and then it worked.