코딩

Gradle 빌드 속도 & 성능 최적화

Eastpark 2025. 1. 13. 20:22
728x90
반응형

이번 글에서는 Gradle 빌드 속도성능 최적화에 초점을 맞춰,

실제 빌드 시간을 단축하고 개발 생산성을 높이는 다양한 팁을 공유하고자 합니다.


1. Gradle 빌드 속도를 진단하는 방법

 

1.1 Gradle Console & Build Analyzer

Gradle Console

안드로이드 스튜디오(AS) 하단의 ‘Gradle Console’를 살펴보면, 어떤 태스크(Task)가 몇 초 걸렸는지 기본적인 정보를 확인할 수 있습니다.

Build Analyzer

AS 메뉴에서 ViewTool WindowsBuild로 이동하여 Build Analyzer를 열면, 어떤 플러그인이나 태스크가 빌드 시간을 가장 많이 소비하는지 시각적으로 파악할 수 있습니다.

 

1.2 Gradle Profiler

Gradle Profiler는 Gradle 빌드 과정을 프로파일링하여, 어떤 단계에서 병목이 발생하는지 더 상세히 알려주는 도구입니다.

1. Gradle Profiler GitHub에서 다운로드

2. 특정 시나리오(예: Clean 빌드, Incremental 빌드)를 명령어로 실행

3. 결과 보고서(HTML 등)에서 빌드 단계를 정밀 분석

# 예시: Gradle Profiler로 빌드 및 측정
gradle-profiler --project-dir /path/to/project \
  --scenario-file scenario.conf \
  --gradle-user-home /path/to/gradle-home

scenario.conf 파일에 어떤 빌드 태스크(assembleDebug 등)를 얼마만큼 반복할지 설정해둘 수 있습니다.

Profiler 결과로 빌드가 느려지는 원인(예: 특정 Annotation Processor)이 명확해질 수 있습니다.


2. 캐싱(Cache)와 병렬 빌드(Parallel Build)

 

2.1 Gradle 캐시 활용

Gradle은 기본적으로 로컬 캐시(Local cache)와 원격 캐시(Remote cache)를 사용할 수 있습니다.

로컬 캐시: 같은 태스크가 동일한 입력(Input)을 가졌다면, 이전 결과를 재사용해 빌드 시간을 단축합니다.

원격 캐시: CI 서버나 팀 공유 저장소에 빌드 아티팩트를 업로드해, 다른 개발자가 동일한 빌드를 할 때 캐싱 효과를 얻을 수 있습니다.

 

gradle.properties 설정 예시

org.gradle.caching=true

이 외에도 Gradle Enterprise를 사용하면, 원격 캐시와 빌드 스캔(Build Scan)을 더욱 손쉽게 적용할 수 있습니다.

 

2.2 병렬 빌드와 Configuration on Demand

병렬 빌드

org.gradle.parallel=true 옵션을 활성화하면, 독립적인 프로젝트(모듈)들을 병렬로 빌드할 수 있습니다.

멀티 코어 CPU 환경에서 빌드 시간이 확 줄어드는 효과가 있습니다.

Configuration on demand

org.gradle.configureondemand=true 옵션을 사용하면, 실제로 필요한 프로젝트만 구성(Configure)하여 불필요한 작업을 줄일 수 있습니다.

프로젝트 구조가 복잡할수록 효과가 커지지만, 일부 플러그인과 호환성 문제가 있을 수 있어 주의가 필요합니다.

# gradle.properties 예시
org.gradle.caching=true
org.gradle.parallel=true
org.gradle.configureondemand=true

3. Incremental Annotation Processing (KAPT)

 

3.1 Annotation Processing이 빌드를 느리게 하는 이유

안드로이드 개발에서 Room, Dagger/Hilt, DataBinding, Kotshi 등 다양한 Annotation Processor가 사용됩니다. 이들은 컴파일 단계에서 추가 코드를 생성하는데, 규모가 클수록 빌드 지연의 주요 원인이 됩니다.

 

3.2 Incremental & Isolating Processor 설정

일부 Annotation Processor는 Incremental Processing을 지원합니다.

즉, 변경된 부분만 다시 처리하여 전체 빌드 시간을 단축하는 방식입니다.

kapt { correctErrorTypes = true } 설정 외에, 애노테이션 라이브러리가 incremental 모드를 지원해야 효과가 큽니다.

 

예시: Room 라이브러리 설정

dependencies {
    kapt "androidx.room:room-compiler:2.5.2"
}

kapt {
    correctErrorTypes = true
}

Room 2.4.0+ 이상부터는 Incremental Annotation Processing을 지원해, KAPT 시간이 크게 줄어든다는 보고가 있습니다.

 

3.3 kapt 대신 KSP?

Kotlin Symbol Processing(KSP)는 KAPT보다 경량화된 방식을 사용하여, 빌드 시간을 더 단축할 수 있는 대안입니다.

많은 라이브러리가 KSP를 지원하기 시작했으므로, 가능하다면 KSP 전환을 고려해보는 것도 한 방법입니다.


4. ProGuard / R8 최적화

 

4.1 R8 난독화 설정

배포용 빌드(release Build Type) 시, R8가 코드를 최적화하고 난독화하여 APK 크기를 줄입니다.

그러나 이 과정이 빌드 시간에 영향을 줄 수 있습니다.

debug 빌드에서는 보통 R8(또는 ProGuard)을 사용하지 않도록 설정하는 것이 일반적입니다.

buildTypes {
    debug {
        minifyEnabled false // debug 모드에는 난독화 비활성화
    }
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

필요 시, 난독화 제외(Keep) 규칙을 적절히 관리해 불필요한 코드 최적화 과정을 줄일 수 있습니다.


5. 빌드 스크립트 최적화

 

5.1 불필요한 플러그인/라이브러리 제거

프로젝트가 오래될수록, 사용하지 않는 라이브러리나 플러그인이 남아있을 가능성이 큽니다.

dependencies 블록에서 실제로 사용되는지 확인 후, 제거할 수 있는 항목을 정리하면 빌드 시간이 단축됩니다.

plugins 블록도 마찬가지로, 필요 없는 플러그인은 비활성화합니다.

 

5.2 일관된 Gradle 버전 & Android Gradle Plugin(AGP) 버전

최신 버전을 사용하면 종종 빌드 성능이 개선된 사례가 있습니다.

다만, 라이브러리 간 호환성을 먼저 확인한 뒤 업그레이드해야 합니다.


마무리

 

Gradle 빌드 속도를 향상시키는 핵심 기법들을 살펴보았습니다.

1. Gradle Profiler로 문제 지점을 파악한다.

2. 캐싱, 병렬 빌드 옵션을 적절히 활용한다.

3. Incremental Annotation Processing(KAPT/KSP)을 통해 컴파일 오버헤드를 줄인다.

4. ProGuard/R8 설정을 합리적으로 관리한다.

5. 빌드 스크립트에서 사용하지 않는 플러그인·라이브러리를 제거하고, 버전을 일관성 있게 유지한다.

728x90
반응형