Các phương thức giao diện mặc định chỉ được hỗ trợ bắt đầu với Android N


262

Tôi đã nâng cấp lên android studio 3.1 và tôi gặp phải lỗi sau:

    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)}

nhập mô tả hình ảnh ở đây

đây là cấu hình gradle của tôi:

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

Như bạn có thể thấy, tôi đang nhắm mục tiêu 27 đã đi trước 24 mà nó phàn nàn. Chính xác thì tôi nên làm gì để khắc phục điều này? Nếu tôi đổi thành 1.8 java, tôi sẽ không thiếu nhiều khách hàng chứ? Tại sao tôi không nhận được lỗi này trước khi tôi nâng cấp studio android?

Tôi không biết đây có phải là về lớp LifecyclObserver mà tôi đã đặt gần đây không, nó ở kotlin và bây giờ tôi đã đổi nó thành java nhưng vẫn gặp lỗi tương tự sau khi làm sạch dự án:

    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);
    }
}

Làm thế nào để theo dõi lỗi đến từ đâu để tôi có thể sửa nó?

đây là phụ thuộc phiên bản của tôi:

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
"như bạn có thể thấy tôi đang nhắm mục tiêu 27 đã đi trước 24 mà nó phàn nàn?" - nó không phàn nàn về bạn targetSdkVersion. "Chính xác thì tôi nên làm gì để khắc phục điều này?" - thử biên dịch với khả năng tương thích Java 8 được kích hoạt . "nếu tôi đổi thành 1.8 java, tôi sẽ không thiếu nhiều khách hàng chứ?" - không dành cho các phương thức giao diện mặc định mà thông báo lỗi đang phàn nàn. "Tại sao tôi không nhận được lỗi này trước khi tôi nâng cấp studio android." - có lẽ là một phụ thuộc ngầm (ví dụ: ràng buộc dữ liệu).
CommonsWare 27/03/18

2
@CommonsWare nó chính xác như bạn đã đề cập. thay đổi thành 1.8 đã giải quyết vấn đề nhưng tôi sẽ phải kiểm tra nó trên các thiết bị cũ hơn để xem điều gì xảy ra. mã đã làm nó là compileOptions {sourceCompabilities JavaVersion.VERSION_1_8 targetCompabilities JavaVersion.VERSION_1_8}
j2emanue 27/03/18

Câu trả lời:


597

Như CommonsWare đã đề cập, để tham khảo thêm phần này vào bên trong android {...} đóng trong build.gradle cho mô-đun ứng dụng của bạn để giải quyết vấn đề:

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

13
Vui lòng xác định rằng nó phải nằm trong niềng răng android như vậy: android {// thêm vào đây}
Idee

3
@ j2emanue Tôi đã thêm cái này trong build.gradle, nhưng vẫn gặp vấn đề tương tự, chỉ dành cho bản dựng phát hành
R4j

Tôi sẽ phải xem tập tin lớp của bạn cả tập tin lớp dự án và mô-đun. có thể gửi một câu hỏi
j2emanue

thêm điều này sẽ hiển thị tham chiếu chưa được phản hồi vào cấu trúc dự án bất kỳ ý tưởng về điều đó?
Urvish rana

1
Thở dài Tại sao google không thể đặt những thứ phù hợp trong cài đặt dự án mặc định? ..
Roman Truba

65

Bạn nên sử dụng Java8 để giải quyết vấn đề này, dựa trên google, bạn có thể thực hiện việc này bằng cách (nhấp vào Tệp> Cấu trúc dự án ). và thay đổi Tương thích nguồn và Tương thích mục tiêu.

nhập mô tả hình ảnh ở đây

Và bạn cũng có thể định cấu hình nó trực tiếp trong tệp build.gradle tương ứng:

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 lập trình viên. Công việc tốt
Zafar Iqbal

54

Trong lớp cấp ứng dụng, bạn phải viết các mã sau:

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

Họ đến từ JavaVersion.java trong Android.

Một bảng liệt kê các phiên bản Java.

Trước 9: http://www.oracle.com/technetwork/java/javase/versioning-naming-139433.html

Sau 9: http://openjdk.java.net/jeps/223

@canerkaseler


1
cảm ơn đã giải thích và thông tin về tập tin nào cần cập nhật. Cấp ứng dụng hoặc cấp dự án.
Lalit Sharma

31

Cập nhật build.gradle (Module: ứng dụng) của bạn thêm compileOptionskhối và thêmJavaVersion.VERSION_1_8

apply plugin: 'com.android.application'

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

25

Bạn có thể giải quyết vấn đề này bằng cách hạ cấp Phiên bản Java Tương thích nguồn và Tương thích mục tiêu xuống 1.8 trong Phiên bản Android Studio mới nhất 3.4.1

  1. Mở Cài đặt mô-đun (Cấu trúc dự án) Winodw bằng cách nhấp chuột phải vào thư mục ứng dụng hoặc Command + Mũi tên xuống trên Mac nhập mô tả hình ảnh ở đây

  2. Chuyển đến Mô-đun -> Thuộc tính nhập mô tả hình ảnh ở đây

  3. Thay đổi phiên bản tương thích nguồn và tương thích mục tiêu thành 1.8 nhập mô tả hình ảnh ở đây

  4. Nhấp vào Áp dụng hoặc OK. Nó sẽ giải quyết vấn đề của bạn.

Ngoài ra, bạn có thể tự thêm vào build.gradle (Mô-đun: ứng dụng)

android {
...

compileOptions {
        sourceCompatibility = '1.8'
        targetCompatibility = '1.8'
    }

...
}

1
Nó chỉ giải quyết vấn đề của tôi. Nhưng làm ơn cho tôi biết làm thế quái nào bạn biết đây là giải pháp?
mehrdad seyrafi

5

Sử dụng mã này trong build.gradle của bạn

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

2

Dự án của tôi sử dụng ButterKnife và Retro lambda, thiết lập JavaVersion.VERSION_1_8 sẽ không hoạt động. Nó luôn đổ lỗi cho chức năng giao diện tĩnh ButterKnife cho đến khi tôi tìm thấy Di chuyển từ Retrolambda

TL; DR

Chỉ cần thêm JavaVersion.VERSION_1_8 và hoàn toàn XÓA retrolambda khỏi dự án của bạn. Nó sẽ xây dựng thành công.


0

Điều này cũng xảy ra với tôi nhưng sử dụng Tính năng động. Tôi đã kích hoạt tính tương thích Java 8 trong mô-đun ứng dụng nhưng tôi phải thêm các dòng tương thích này vào mô-đun Tính năng động và sau đó nó hoạt động.


0

Đặt minSdkVersion thành 21 từ 19 đã giải quyết vấn đề cho tôi.

defaultConfig {
        applicationId "com.example"
        minSdkVersion 21
        targetSdkVersion 29
        versionCode 23
        versionName "1.0"
        vectorDrawables.useSupportLibrary = true
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.