DEV Community

Sewon Ann
Sewon Ann

Posted on

1

과연 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 쓰러 가즈아!

Sentry mobile image

Is your mobile app slow? Improve performance with these key strategies.

Improve performance with key strategies like TTID/TTFD & app start analysis.

Read the blog post

Top comments (0)

Qodo Takeover

Introducing Qodo Gen 1.0: Transform Your Workflow with Agentic AI

Rather than just generating snippets, our agents understand your entire project context, can make decisions, use tools, and carry out tasks autonomously.

Read full post