1. Gradle
- 범용 빌드 도구
> Java, Java web projects, C, C++, Android 등
> polyglot programming (여러 언어를 동시에 빌드)
- Groovy 언어 기반
> Groovy대신 DSL(Domain Specific Language)로 스크립트 작성 가능
- Ant와 Maven 계승
> Ant의 유연함 -> 대부분의 Ant task를 gradle에서 실행가능
> Maven의 체계성을 혼합 -> 폴더 구조가 복잡해짐
- 명령창에서도 빌드 가능
> 젠킨스 등 CI(Continuous Integration : 지속적 통합)와 연동 가능
2. 구성요소
- Project의 Build.gradle
> Android Gradle 플러그인 버전 지정
> Allprojects 항목
: 하위 모듈에 공통적으로 해당하는 항목
- App의 Build.gradle
> AndroidManifest.xml 재정의
: Build tools / minSDK / targetSDK / applicationId / versionCode / versionName
- Setting.gradle
> 멀티 프로젝트에 포함되는 하위 모듈 목록
> 프로젝트에 포함될 Module 목록
> 개수가 늘어날 수록 빌드 속도가 떨어짐(일반적으로 5~6개면 충분)
> 너무 많으면 주석처리
> ':'(콜론)은 모듈을 의미
- Gradle.properties
> 기타 환환경 변수들
- Local.properties
> SDK Home 등
3. ARR
- Android Archive package
- 안드로이드 Library용 압축 파일
- Java에서 사용되는 lib용으로 자주 사용되는 확장자는 Jar이지만
안드로이드 스튜디오 프로젝트에서는 aar파일을 사용한다.
4. Plugin
- Gradle의 기본 단위는 Task
- Plugin은 Tasks의 집합
- APK 파일 생성
apply plugin : 'com.android.application'
- ARR 파일 생성
apply plugin : 'com.android.library'
5. Dependency
- 더이상 JAR 파일을 로컬에 복사하지 않음
- gradle도 다운받지 않음
> Gradle wrapper(gradlew)가 알아서 최신 버전을 다운 받음
- Group / artifact ID / version만 지정하면 됨
- Transitive Dependency
- Gradle Dependency 정보
./gradlew :app:dependencies
- Gradle은 의존성 관리를 자동으로 해줌
> Maven, Apache IVY의 후손
- 다양한 방식의 Dependency
> compile
> debugCompile
> androidTestCompile
> releaseCompile
> providedCompile
- 주의 사항
> Gradle은 의존성 순서를 지정할 수 없다
> 정확한 버전을 명시해야 한다. (+를 남발하지는 말아야 한다.)
> 되도록이면 최신 버전을 써야함
6. Multi Project 구성
* App Module과 Library Module로 분리 개발
* Library Module 소스 참조 방식
* Library AAR 참조 방식
- Library Project 생성하기
> Module
1) App Module -> APK 생성
2) Library Module -> AAR 생성
- Android Studio > File > New Module
- Build.gradle이 생성
- Settings.gradle에 추가됨
include ':app', ':mylibrary'
- App의 Bulid.gradle 변경
1) 소스 참조 방식
dependencies{
compile project(':mylibrary')
}
2) ARR 직접 참조 방식
repositories {
jcenter()
flatDir {
dirs 'libs'
}}
dependencies {
compiles 'com.example.mylibrary:mylibrary-debug:1.0@arr'
}
(:mylibrary에는 LibraryMain.java에 Activity가 존재함)
7. 심화
- Local Repository 생성
> 생성된 AAR을 libs 폴더가 아닌 jCentral() 같은 저장소를 로컬에 만들어서 참조하는 방법
- Build Variants 다루기
> Build type(debug / release) 뿐만 아닐니라 Full version / Demo version 같은 product flavors 적용
8. 기타
- apk 생성할 때 버전명 기입
> App(Module)의 Build.gradle 수정
buildTypes{
applicationVariants.all { variant->
variant.outputs.each { output->
output.outputFile = new File(
output.outputFile.parent,
output.outputFile.name.replace(".apk",
"-${variant.versionName}.apk"))
}
}
- Console에서 task 이름을 부분 입력하여 실행
Console 에서
> ./gradlew :app:asD -> assembleDebug 실행
> ./gradlew :app:cl -> clean 실행
축약형이 동일하면 오류 발생
> ./gradlew :app:aD -> 오류 발생
- Gradle daemon 활용
> Gradle을 JVM 기반의 빌드 도구 이므로 매번 실행하지 않고 그 다음에 daemon 재활용
> ./gradlew --daemon :app:aD -> 두번째 부터
- 생성된 apk를 특정 폴더에 복사
task publish(dependsOn: 'assembleRelease') << {
println '>>>publish APK'
copy {
from ('build/outputs/apk') {
include '*release*.apk'
}
into 'release'
}
println '>>>publish APK(END)'
}