본문 바로가기
programing/Android

Gradle

by RedWiz 2018. 3. 26.

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)'

}