이번 글에서는 Gradle 빌드 속도와 성능 최적화에 초점을 맞춰,
실제 빌드 시간을 단축하고 개발 생산성을 높이는 다양한 팁을 공유하고자 합니다.
1. Gradle 빌드 속도를 진단하는 방법
1.1 Gradle Console & Build Analyzer
• Gradle Console
• 안드로이드 스튜디오(AS) 하단의 ‘Gradle Console’를 살펴보면, 어떤 태스크(Task)가 몇 초 걸렸는지 기본적인 정보를 확인할 수 있습니다.
• Build Analyzer
• AS 메뉴에서 View → Tool Windows → Build로 이동하여 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. 빌드 스크립트에서 사용하지 않는 플러그인·라이브러리를 제거하고, 버전을 일관성 있게 유지한다.
'코딩' 카테고리의 다른 글
고급 스크립팅 & 커스텀 플러그인 (0) | 2025.01.15 |
---|---|
CI/CD 파이프라인 연동 (2) | 2025.01.14 |
Build Variants & 멀티 모듈 구조 (0) | 2025.01.12 |
안드로이드 빌드 시스템과 Gradle 기초 (0) | 2025.01.10 |
Compose 애니메이션, 퍼포먼스 & 테스트 (0) | 2025.01.09 |