วิธีการเริ่มต้นได้รับการรองรับเฉพาะการเริ่มต้นด้วย 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 ซึ่งอยู่ข้างหน้าของ 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'
    }

20
"อย่างที่คุณเห็นฉันกำลังตั้งเป้าหมาย 27 ซึ่งอยู่ข้างหน้าของ 24 ที่บ่นเกี่ยวกับ?" - targetSdkVersionมันเป็นไม่ได้บ่นเกี่ยวกับ "ฉันควรทำอย่างไรเพื่อแก้ไขปัญหานี้" - พยายามรวบรวมกับJava 8 ความเข้ากันได้เปิดใช้งาน "ถ้าฉันเปลี่ยนเป็น 1.8 java ฉันจะไม่พลาดลูกค้าจำนวนมากหรือ" - ไม่ใช่สำหรับวิธีการอินเทอร์เฟซเริ่มต้นที่ข้อความแสดงข้อผิดพลาดบ่น "ทำไมฉันถึงไม่ได้รับข้อผิดพลาดนี้ก่อนที่ฉันจะอัพเกรด android studio" - บางทีการพึ่งพาโดยนัย (เช่นการรวมข้อมูล)
CommonsWare

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 ของคุณทั้งไฟล์ project และโมดูล gradle อาจโพสต์คำถาม
j2emanue

การเพิ่มสิ่งนี้จะแสดงการอ้างอิงที่ไม่ได้รับการแก้ไขในโครงสร้างของโครงการแนวคิดใด ๆ
Urvish rana

1
เฮ้อทำไม google ไม่สามารถใส่สิ่งที่เหมาะสมในการตั้งค่าโปรเจ็กต์เริ่มต้นได้? ..
Roman Truba

65

คุณควรใช้ Java8 เพื่อแก้ปัญหานี้โดยอิงจากgoogleคุณสามารถทำได้โดยคลิก ( ไฟล์> โครงสร้างโครงการ ) และเปลี่ยนความเข้ากันได้ของแหล่งที่มาและความเข้ากันได้ของเป้าหมาย

ป้อนคำอธิบายรูปภาพที่นี่

และคุณยังสามารถกำหนดค่าโดยตรงในไฟล์ 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 programmer.Nice Job
Zafar Iqbal

54

ในระดับแอปคุณต้องเขียนโค้ดเหล่านี้:

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

พวกเขามาจากJavaVersion.javaใน Android

การแจกแจงของเวอร์ชัน 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 ของคุณ (โมดูล: แอป) เพิ่มcompileOptionsบล็อกและเพิ่มJavaVersion.VERSION_1_8

apply plugin: 'com.android.application'

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

25

คุณสามารถแก้ไขปัญหานี้ได้โดยการปรับลดรุ่นความเข้ากันได้ของแหล่งข้อมูลและเวอร์ชั่นความเข้ากันได้ของเป้าหมาย Java เป็น 1.8 ใน Android Studio เวอร์ชัน 3.4.1 ล่าสุด

  1. เปิดการตั้งค่าโมดูล (โครงสร้างโครงการ) Winodw โดยคลิกขวาที่โฟลเดอร์แอพหรือ Command + Down Arrow บน Mac ป้อนคำอธิบายรูปภาพที่นี่

  2. ไปที่โมดูล -> คุณสมบัติ ป้อนคำอธิบายรูปภาพที่นี่

  3. เปลี่ยนความเข้ากันได้ของแหล่งที่มาและเวอร์ชันความเข้ากันได้ของเป้าหมายเป็น 1.8 ป้อนคำอธิบายรูปภาพที่นี่

  4. คลิกที่ใช้หรือตกลงนั่น มันจะแก้ปัญหาของคุณ

นอกจากนี้คุณยังสามารถเพิ่มใน build.gradle (โมดูล: แอพ)

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 จะไม่ทำงาน มันมักจะตำหนิที่ฟังก์ชั่นอินเทอร์เฟซคงที่ ButterKnife จนกว่าฉันจะพบการโยกย้ายนี้จาก Retrolambda

TL; DR

เพียงเพิ่ม JavaVersion.VERSION_1_8 และลบ retrolambda ทั้งหมดจากโครงการของคุณ มันจะสร้างสำเร็จ


0

สิ่งนี้เกิดขึ้นกับฉันเช่นกัน แต่ใช้คุณสมบัติไดนามิก ฉันได้เปิดใช้งานความเข้ากันได้ Java 8 ในโมดูลแอพแล้ว แต่ฉันต้องเพิ่มบรรทัดความเข้ากันได้นี้ไปยังโมดูลคุณสมบัติแบบไดนามิก


0

การตั้งค่า minSdkVersion เป็น 21 จาก 19 แก้ไขปัญหาให้ฉัน

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.