본문 바로가기

안드로이드/트러블 슈팅

[안드로이드 트러블 슈팅] 빌드 시간 600초에서 30초로 단축한 사례


안녕하세요. 이번 포스팅에서는 안드로이드 빌드 시간을 약 600초에서 30초로 단축하는 데 성공한 트러블 슈팅 사례를 공유하겠습니다. 아래 사진은 안드로이드 스튜디오에서 확인할 수 있는 Build Analyzer입니다.

안드로이드 빌드 시간이 약 600초에서 30초로 줄어든 모습
안드로이드 빌드 시간이 약 600초에서 30초로 줄어든 모습

1. 문제 상황

안드로이드 실무에서 장기 프로젝트를 진행하면서 화면이 50~60개에 이르는 앱을 만들었습니다. 하지만, 프로젝트의 규모에 비례해서 빌드 시간이 점점 증가했고, 결국 약 600초까지 걸리는 상황에 이르렀습니다. 이는 개발자 경험을 크게 저하시켜서 신속한 개발과 문제 해결에 많은 어려움을 겪게 되었습니다.

2. 발생한 문제

프로젝트의 낮은 Gradle 및 코틀린 버전이 이 문제의 주된 원인으로 밝혀졌습니다. 이 프로젝트는 5~6년 전에 생성되었기 때문에 개발 환경 구성 플러그인들의 버전이 오래되었고, 버전 업데이트 시 발생하는 빌드 에러로 인해 지속적으로 오래된 버전을 사용하고 있었기 때문입니다.

3. 해결 방법

저는 다음과 같은 5가지 작업을 진행해서 빌드 시간을 대폭 줄일 수 있었습니다.

3-1. Kotlin-Gradle-Plugin

Kotlin-Gradle-Plugin 버전을 1.6.0에서 1.6.21로 업데이트했습니다. 높은 AGP 버전을 사용하기 위해 코틀린을 최신 버전으로 업데이트하고자 했으나 'kotlin-android-extensions' 플러그인을 사용으로 인해 1.6.21 버전으로 제한되었습니다.

3-2. Android-Gradle-Plugin

Android-Gradle-Plugin 버전을 2.3.2에서 7.0.2로 변경로 업데이트했습니다. 8.0.0 이상의 버전이 존재했지만 코틀린 버전 호환성으로 인해 7.0.2를 선택했습니다. Gradle 버전을 올리면서 새로운 기능을 사용할 수 있었는데, '1-4 gradle.properties'에서 확인할 수 있습니다..

3-3. build.gradle (앱)

디버그 빌드는 프로덕트 빌드가 아니기 때문에 불필요한 생성 파일을 줄이기 위해서 buildTypes 내의 debug에 아래의 코드를 추가했습니다.

  • ext.alwaysUpdateBuildId = false
    ext.alwaysUpdateBuildId = false 옵션은 빌드 ID를 매번 업데이트하지 않도록 설정해서 빌드 시간을 단축하는 옵션입니다.
  • splits.abi.enable = false 및 splits.density.enable = false
    디버그 빌드를 수행할 경우에는 기능을 확인하는 것이 중요하므로 ABI 및 다양한 해상도에 대한 빌드를 생략했습니다.

3-4. gradle.properties

gradle.properties 파일은 gralde을 사용한 프로젝트에서 빌드 환경을 설정하는 데 사용되는 파일입니다. 이 파일을 통해 빌드 프로세스에 대한 다양한 옵션을 지정할 수 있으며, 빌드 속도 향상, 메모리 최적화, 디버깅 등에 활용됩니다. 저는 gradle.properties에서 아래의 6가지 속성을 추가했습니다. 

  • org.gradle.jvmargs=-Xmx6g -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 -XX:+UseParallelGC -XX:MaxMetaspaceSize=1g --add-opens java.base/java.io=ALL-UNNAMED
  • org.gradle.configureondemand=true
  • org.gradle.configuration-cache=true (gradle 6 이상부터 사용 가능)
  • android.enableBuildScriptClasspathCheck=false
  • android.defaults.buildfeatures.buildconfig=true
  • android.nonTransitiveRClass=false
  • android.nonFinalResIds=false

3-5. Gradle에서 Offline 모드 설정

Gradle은 추가한 종속성(라이브러리, 플러그인)들에 대해서 매번 최신 버전을 확인하러 가는데 Offline 모드를 활성화하면  이러한 과정을 생략해서 빌드시간이 단축됩니다. 단, 신규 종속성이 생기면 Offline모드를 해제해야 하는데, Offline 모드를 해제하지 않고 신규 종속성을 추가 및 빌드를 하면 로그에서 Offline 모드를 해제하라고 나옵니다.

4. 안드로이드 빌드 시간 트러블 슈팅 정리

위에 소개한 5가지 방법으로 안드로이드에서 빌드 시간이 비정상적으로 길었던 트러블 슈팅을 진행할 수 있었습니다. 이러한 변경사항들은 프로젝트 빌드 시간을 크게 단축시켰으며, 개발 과정에서 개발자 경험을 향상할 수 있었습니다. 장기 프로젝트를 진행하면 개발 환경도 지속적으로 관리하는 것이 중요하다는 점을 다시 한번 깨닫는 계기가 되었고, 이 글을 보신 분들께 도움이 됐으면 좋겠습니다.