수색…


소개

Android는 모든 Java 7 언어 기능과 플랫폼 버전에 따라 다른 Java 8 언어 기능의 하위 세트를 지원합니다. 이 페이지는 사용할 수있는 새로운 언어 기능, 사용하기 위해 프로젝트를 올바르게 구성하는 방법 및 발생할 수있는 알려진 문제점에 대해 설명합니다.

Retrolambda로 Java 8 기능 서브 세트

Retrolambda를 사용하면 Java 7, 6 또는 5에서 람다 식, 메소드 참조 및 try-with-resources 문으로 Java 8 코드를 실행할 수 있습니다. Java 8 컴파일 된 바이트 코드를 변환하여 이전 Java 런타임에서 실행할 수 있습니다.

백 포트 된 언어 기능 :

  • 람다 식은 익명의 내부 클래스로 변환하여 백 포트됩니다. 여기에는 반복적 인 객체 할당을 피하기 위해 무국적 람다 식에 싱글 톤 인스턴스를 사용하는 최적화가 포함됩니다. 메서드 참조는 기본적으로 람다 식의 구문 설탕이며 동일한 방식으로 백 포트됩니다.

  • Throwable.addSuppressed 대한 호출을 제거하여 리소스 사용 시험 문을 백 포트합니다. 대상 바이트 코드 버전이 Java 7 미만인 경우 억제 된 예외가 삼키기 대신 기록되도록하려면 기능 요청을 작성하십시오. 구성 가능.

  • Objects.requireNonNull 호출은 대상 바이트 코드 버전이 Java 7 미만인 경우 Object.getClass 대한 호출로 대체됩니다. JDK 9에서 생성 된 합성 null 검사는 Objects.requireNonNull 사용하지만 이전 JDK 버전에서는 Object.getClass 사용했습니다.

  • 선택 사항 :

    1. 기본 메소드는 기본 메소드를 정적 클래스 (인터페이스 이름 + "$")로 정적 메소드로 복사하고, 인터페이스의 기본 메소드를 추상 메소드로 대체하고, 해당 메소드를 구현하는 모든 클래스에 필요한 메소드 구현을 추가하여 백 포트됩니다 .

    2. 정적 메서드를 동반 클래스 (인터페이스 이름 + "$")로 이동하고 모든 메서드 호출을 변경하여 새 메서드 위치를 호출하여 인터페이스의 정적 메서드를 백 포트합니다.

알려진 제한 사항 :

  • 자바 8 API를 백 포트하지 않는다.

  • 인터페이스에 대한 기본 메소드 및 정적 메소드를 백 포트하는 데에는 모든 백 포트 된 인터페이스와이를 구현하는 모든 클래스 또는 Retortambda를 한 번만 실행하여 정적 메소드를 함께 백 포트해야합니다. 즉, 항상 깨끗한 빌드를 수행해야합니다. 또한 기본 방법을 백 포트하는 것은 모듈 또는 종속성 경계에서 작동하지 않습니다.

  • 향후 JDK 8 빌드가 각 invokedynamic 호출에 대해 새로운 클래스 생성을 중단하면 중단 될 수 있습니다. Retrolambda는 java.lang.invoke.LambdaMetafactory 가 동적으로 생성하는 바이트 코드를 캡처하도록 작동하므로 해당 메커니즘에 대한 최적화가 Retrolambda를 손상시킬 수 있습니다.

Retrolambda gradle 플러그인 은 자동으로 Retrolambda로 안드로이드 프로젝트를 만듭니다. 최신 버전은 출시 페이지 에서 찾을 수 있습니다.

용법:

  1. jdk8 다운로드 및 설치
  2. build.gradle 다음을 추가하십시오.
buildscript {
  repositories {
     mavenCentral()
  }

  dependencies {
     classpath 'me.tatarka:gradle-retrolambda:<latest version>'
  }
}

// Required because retrolambda is on maven central
repositories {
  mavenCentral()
}

apply plugin: 'com.android.application' //or apply plugin: 'java'
apply plugin: 'me.tatarka.retrolambda'

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

알려진 문제점 :

  • Lint는 lambdas가있는 java 파일에서 실패합니다. 안드로이드의 보푸라기는 자바 8 구문을 이해하지 못하고 조용히 또는 큰소리로 실패합니다. 문제를 해결하는 실험용 포크가 있습니다.

  • Google Play 서비스를 사용하면 Retrolambda가 실패합니다. 버전 5.0.77에는 Retrolambda와 호환되지 않는 바이트 코드가 들어 있습니다. 이것은 최신 버전의 재생 서비스에서 수정해야합니다 (업데이트 할 수있는 경우). 이 문제를 해결하려면 4.4.52와 같은 이전 버전을 사용하거나 jvm args에 -noverify 를 추가하십시오.

retrolambda {
  jvmArgs '-noverify'
}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow