[Android] AAR과 Desugaring.

구근우·2021년 9월 4일
4

Android

목록 보기
1/3

Desugared AAR을 만들 수 있을까?

높은 Android API Level 범용성을 유지해야 하는 SDK에서 Java 8 API를 사용하기 위해 Desugaring 을 적용할 수 있는지 알아보자.

Syntax Sugar

프로그래밍 언어의 문법을 더 쉽게 읽거나 표현할 수 있게 도와주는 것을 syntax sugar 라고 한다. Java 8 의 Stream API 등이 syntax sugar 의 한 예시이다.

하지만 Android 개발 시 Stream API를 사용하려고 하면, API level 24 이상부터 해당 API 를 사용할 수 있다는 경고가 보인다.

 Error: Call requires API level 24 (current min is 23): java.util.stream.Stream#of [NewApi]
          Stream<Integer> integerStream = Stream.of(1, 2, 3);
                                                 ~~

API level 24 부터 기기에 Java 8 API 가 추가되기 시작했다. 따라서 그 이전의 기기에서는 Java 8 API를 실행할 수 없기 때문에 위 경고가 나타나는 것이다.

Desugaring

그러나 API level 24 이전의 기기에서도 Java 8 API 를 사용할 수 있도록 하는 방법이 있는데, 그것이 바로 Desugaring 이다. syntax sugar 가 적용된 코드를 컴파일 과정에서 낮은 API의 기기에서도 해석할 수 있게 해주는 것이라 Desugaring 이라고 한다. 안드로이드 공식 문서에는 아래와 같이 안내되어 있다.

Android Gradle 플러그인 4.0.0 이상을 사용하여 앱을 빌드하면 이 플러그인은 앱의 최소 API 수준 없이도 다양한 자바 8 언어 API를 사용할 수 있도록 지원을 확대합니다.
플러그인 4.0.0 이상에서 자바 언어 API도 디슈가링하도록 디슈가링 엔진을 확장하기 때문에 이전 플랫폼 버전을 위한 이 같은 추가 지원이 가능합니다. 따라서 최신 Android 출시(java.util.streams 등)에서만 사용할 수 있었던 표준 언어 API를 Android 이전 버전을 지원하는 앱에 포함할 수 있습니다.

Process

Fig 1. desugaring process

출처 - https://developer.android.com/studio/write/java8-support

위 그림을 보면 D8/R8 컴파일러를 통해 .dex 파일에 desugaring 이 적용되는 것을 확인할 수 있다. 하지만 AAR 파일에는 .dex 파일이 아닌 .class 파일이 포함되어 있다. 즉 .dex 파일을 만들기 전에 desugaring 작업이 일어나기 때문에, .class 파일을 포함하는 AAR 파일 빌드 시에는 desugaring 이 적용되지 않는다.

결론

AAR 파일 빌드 과정에는 D8/R8 컴파일러를 통한 desugaring이 적용되지 않는다.

그래서 SDK 개발 시 Java 8 API를 편하게 사용하기엔 아직 무리가 있다. 고객사 앱이 어떤 API level 을 타겟팅하는지 알 수 없고, 또 고객사에게 desugaring을 요구할 수 없기 때문이다. 시장에서 API level 24 (Nougat) 이전 기기 비율이 많이 낮아진 후에는 SDK에서 맘 편히 Java 8 API 를 사용할 수 있을 것이다.

profile
Android SDK Developer

0개의 댓글