デフォルトのインターフェースメソッドは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をターゲットにしています。これを修正するにはどうすればよいですか?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をターゲットにしています。-それはあなたの不満ではありませんtargetSdkVersion。「これを修正するにはどうすればよいですか?」-Java 8互換性を有効にしてコンパイルしてみてください。「1.8 Javaに変更した場合、多くの顧客を見逃すことはありませんか?」-エラーメッセージが不平を言っているデフォルトのインターフェースメソッドのためではありません。「android studioをアップグレードする前にこのエラーが発生しなかったのはなぜですか?」-おそらく暗黙的な依存関係(たとえば、データバインディング)。
CommonsWare 2018年

2
@CommonsWareそれはあなたが言ったとおりでした。1.8に変更すると問題は解決しましたが、何が起こるかを確認するには、古いデバイスで確認する必要があります。それを行ったコードはcompileOptions {sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8}
j2emanue

回答:


597

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

これを追加すると、プロジェクト構造に再愛されない参照が表示されますが、それについて何か考えはありますか?
アービッシュラナ

1
ため息なぜグーグルはデフォルトのプロジェクト設定に適切なものを置くことができないのですか?..
Roman Truba

65

あなたは、に基づいて、これを解決するためにJava8を使用する必要がありますグーグルあなたは(クリックでこれを行うことができます[ファイル]> [プロジェクトの構造)。ソース互換性とターゲット互換性を変更します。

ここに画像の説明を入力してください

また、対応する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

54

アプリレベルの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

31

build.gradle(Module:app)add 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. [適用]または[OK]をクリックします。それはあなたの問題を解決します。

また、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

これは私にも起こりましたが、動的機能を使用しています。アプリモジュールで既にJava 8互換性を有効にしていましたが、この互換性行を動的機能モジュールに追加する必要があり、それが機能しました。


0

minSdkVersionを19から21に設定すると、問題が解決しました。

defaultConfig {
        applicationId "com.example"
        minSdkVersion 21
        targetSdkVersion 29
        versionCode 23
        versionName "1.0"
        vectorDrawables.useSupportLibrary = true
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.