DEV Community

Sewon Ann
Sewon Ann

Posted on

과연 Android Gradle Plugin 4.1.0 에선 Desugaring 을 써도 되는걸까?

한줄 요약 : AGP(Android Gradle Plugin) 4.1.0 이상부턴 안심하고 java8 desugar 기능을 써도 될 것 같다.

Java8 Api Desugar

안드로이드는 특정 OS 이상에서만 java 8을 제대로 지원한다. 예를 들어 java.time 패키지의 javadoc 을 보면, 최소 지원 버전이 API 26 ( Android 8.0 오레오 ) 인 것을 확인할 수 있다. 이러한 불편함을 해소하기 위해 빌드 도구에 Java 8+ Api desugaring 지원 기능을 추가하였다. 구형 OS의 sdk에 없는 java 8 관련 코드를 앱 빌드에 심어줘서 앱 입장에선 OS 구분 없이 API를 사용할 수 있게된다.

Kotlin을 주력으로 쓰는 입장에서 다른 API는 별 흥미가 없지만, java.time 은 꽤 매력적이다. 기존엔 이 API를 쓰려면 ThreeTenABP 를 써야 하는데, desugaring의 은총을 입으면 별도 라이브러리 없이도 그냥 java.time 을 쓸 수 있게 된다.

AGP 4.0.0 의 버그

하지만 기존 AGP 4.0.0 버전에선 문제가 있었다. 마시멜로 이하 단말에서 특정 클래스에 접근할 때 NoClassDefFoundError 가 발생한다. 이 이슈는 구글 이슈 트래커 에 잘 정리되어 있다. 회사 프로젝트에서도 이 문제가 발생해서 들어내는 작업을 했었다.

그럼 이젠 문제가 해결되었을까 궁금했다. 위 이슈엔 친절히 문제가 발생하는 repo의 링크가 걸려있어 실험을 해 봤다.

AGP 4.1.0 실험

링크의 repo를 받아 그대로 빌드해서 실행해봤다. 예상대로 앱이 뜨자마자 크래시가 난다. 그럼 AGP 4.1.0 을 적용해보면 어떨까? 그런데 링크 repo의 기반 환경이 꽤 예전 것이라 AGP 4.1.0 을 바로 적용하기 어려워 삽질을 좀 한 끝에 아래 두 가지 환경에서 테스트 해 봤다.

  • kotlin 1.4.20 / gradle 6.7.1 / desugar 1.0.9 / AGP 4.1.0-alpha09 : 크래시 발생
  • kotlin 1.4.20 / gradle 6.7.1 / desugar 1.0.9 / AGP 4.1.0 : 실행 성공

결론

다른 부분은 desugaring 에 큰 영향을 미치지 않는다고 가정할 때, AGP 4.1.0 에선 해당 버그가 진짜로 수정되었다고 가정할 수 있다. java.time 쓰러 가즈아!

Top comments (0)