Android Studio 3.0 – Java 8 language feature

2017년 3월 15일, Android Studio 내부에서 Java 8 language feature을 활성화하기 위해 사용하던 Jack compiler 가 Deprecated 되었다.

처음엔 Jack toolchain 을 통해 Java 8 지원 추가를 테스트하였으나, 시간이 지남에 따라 Annotation processors(어노테이션 처리기), Bytecode analyzers and rewriters(바이트 코드 분석, 작성기) 들이 Jack로 전환하는 비용이 높아서 앞으로 Java 8 언어 기능들이 안드로이드 빌드 시스템에서 기본적으로 지원되게 할 예정이라고 한다.

물론 Jack 대신 Retrolambda를 쓰고 있었기에 문제 없었다. 그리고 안드로이드 스튜디오 3.0 Preview가 나오면서 위에 밝혀진 ‘Java 8 언어 기능에 대한 안드로이드 빌드 시스템 내부 지원’ 이 Desugar 란 이름으로 돌아왔다.

Desugar 구조

Desugar 의 구조는 아래와 같다. (출처: Android Developer, Use Java 8 language features)

desugar structure

 

.java 가 javac 를 통해 컴파일 되면 class가 나오는데, 이 class를 기반으로 desugar 작업을 통하여 나온 결과물을 dex 화 시키는 것이다.

즉 desugar를 말로 표현하자면 javac – dex 사이에 Java 8 언어 기능을 사용한 코드를 하위 호환에 맞게 변환시키는 과정이다.

물론 기존과 같이 SDK 버전(minSdkVersion)에 따라 작동 범위 차이는 있다.

Java 8 Language Feature, API

Java 8 언어 기능 / API호환되는 minSdkVersion
람다식모두 지원됨. 하지만 람다에 잡히는 모든 값이 serializable 해야함
메서드 참조모두 지원됨.
형식 주석모두 지원됨. 하지만 타입 어노테이션에 대한 정보는 컴파일 시간에 활성화된다. (런타임 상 정보는 나오지 않음) ElementType.TYPE_USE, ElementType.TYPE_PARAMETER 외의 TYPE들은 24 이상부터 사용 가능
기본, 정적 인터페이스모두 지원됨
반복 가능한 주석모두 지원됨
annotation.Repeatable24 이상
AnnotatedElement.getAnnotationByType(Class)24 이상
스트림24 이상
Functional Interface24 이상
Method.isDefault()24 이상
Function util24 이상

desugar 가 도입되면서 그레들 플러그인에도 변경점이 생겼는데, 바로 Retrolambda 와 Jack, DexGuard를 사용중일 경우 desugar를 도입하도록 경고를 표시하는 점이다.

warning of using desugar

아직까지는 위 3개를 사용중이면 위 3개가 우선적으로 작동하지만 좀 더 desugar가 안정화 되면 마이그레이션 할 예정이다.

결국은 Java8를 컴파일 옵션으로 두는 프로젝트면 기본적으로 활성화되게 되어, 별도 플러그인이 필요없어진 셈이다.

만일 비활성화 하고 싶다면 gradle.properties 파일에 android.enableDesugar=false 를 두면 되는거같다.