Android
Android 용 Java
수색…
소개
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
사용했습니다.선택 사항 :
기본 메소드는 기본 메소드를 정적 클래스 (인터페이스 이름 + "$")로 정적 메소드로 복사하고, 인터페이스의 기본 메소드를 추상 메소드로 대체하고, 해당 메소드를 구현하는 모든 클래스에 필요한 메소드 구현을 추가하여 백 포트됩니다 .
정적 메서드를 동반 클래스 (인터페이스 이름 + "$")로 이동하고 모든 메서드 호출을 변경하여 새 메서드 위치를 호출하여 인터페이스의 정적 메서드를 백 포트합니다.
알려진 제한 사항 :
자바 8 API를 백 포트하지 않는다.
인터페이스에 대한 기본 메소드 및 정적 메소드를 백 포트하는 데에는 모든 백 포트 된 인터페이스와이를 구현하는 모든 클래스 또는 Retortambda를 한 번만 실행하여 정적 메소드를 함께 백 포트해야합니다. 즉, 항상 깨끗한 빌드를 수행해야합니다. 또한 기본 방법을 백 포트하는 것은 모듈 또는 종속성 경계에서 작동하지 않습니다.
향후 JDK 8 빌드가 각
invokedynamic
호출에 대해 새로운 클래스 생성을 중단하면 중단 될 수 있습니다. Retrolambda는java.lang.invoke.LambdaMetafactory
가 동적으로 생성하는 바이트 코드를 캡처하도록 작동하므로 해당 메커니즘에 대한 최적화가 Retrolambda를 손상시킬 수 있습니다.
Retrolambda gradle 플러그인 은 자동으로 Retrolambda로 안드로이드 프로젝트를 만듭니다. 최신 버전은 출시 페이지 에서 찾을 수 있습니다.
용법:
- jdk8 다운로드 및 설치
-
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'
}