안드로이드를 위한 gradle 맛들이기

44
자자자자 자자자 자자자자자자 자자 GRADLE 자자 자자자자 1

Upload: donghwan-yu

Post on 11-Apr-2017

2.143 views

Category:

Software


0 download

TRANSCRIPT

Page 1: 안드로이드를 위한 Gradle 맛들이기

1

자바카페 유동환

안드로이드를 위한 GRADLE 빌드 맛들이기

Page 2: 안드로이드를 위한 Gradle 맛들이기

2

유동환을 소개합니다• LG 전자 선임연구원 • 유동의 브런치 https://brunch.co.kr/@yudong • 유동의 페북 https://www.facebook.com/koreacio

• < 안드로이드를 위한 Gradle> 집필 (2016)• <Professional Java Web Services> 번역 (2003)

• 10 년 500 권의 독서 달성(2006 년 ~ 2015 년 )

• 사내 독서습관클럽 운영자

Page 3: 안드로이드를 위한 Gradle 맛들이기

3

유동환을 소개합니다 #2• 안드로이드를 위한 Gradle 무료 강의• “ 문장쓰기 독서법”

브런치 조회수 10,000 (Daum 노출 )

Page 4: 안드로이드를 위한 Gradle 맛들이기

4

강의 목표1. Android Studio 를 활용하여 Gradle 빌드할 수 있다 .

2. IDE 뿐만 아니라 Console 에서도 빌드할 수 있다 .

3. Github 에 있는 Library 를 내 프로젝트에 추가할 수 있다 .

4. Module 의 개념을 알고 Multi project 를 구성할 수 있다 .

5. Android Gradle 의 구성 요소 와 신규 용어를 학습한다 .

build.gradle / gradle wrapper / module / AAR / assem-bleDebug Build variants / settings.gradle / Transitive dependency / task

Page 5: 안드로이드를 위한 Gradle 맛들이기

5

목차1. Gradle 이란 무엇인가 ? 2. Android Gradle 살펴보기 3. Dependency 추가하기4. 멀티 프로젝트 세팅

Page 6: 안드로이드를 위한 Gradle 맛들이기

6

1. Gradle 이란 무엇인가 ?• 범용 빌드 도구

• Java, Java web projects, C, C++, Android 등 • 폴리글랏 프로그래밍 (Facebook 는 20 여개의 언어를 동시 빌드 )

• Groovy 언어 기반 • Groovy 언어를 몰라도 스크립트 작성 가능 • DSL(Domain Specific Language)

• Ant 와 Maven 을 계승 • Ant 의 유연함 대부분의 Ant task 를 gradle 에서 실행 가능 • Maven 의 체계성을 혼합 폴더 구조가 복잡해집

• 명령창에서도 빌드할 수 있음 • 젠킨스 등 CI 와 연동 가능

Page 7: 안드로이드를 위한 Gradle 맛들이기

7

2. Android Gradle 살펴보기1. Android Build System 2. Android Gradle 의 구성요소 3. 처음 빌드해보기 4. Build.gradle 5. Settings.gradle

Page 8: 안드로이드를 위한 Gradle 맛들이기

8

2.1 Android Build System• 결국은 APK 를 만드는 방법이다 !

• 우리가 알아야 할 것• 컴파일• Signing (Debug / Release)• 멀티 APK 만들기

Page 9: 안드로이드를 위한 Gradle 맛들이기

9

2.2 Android Gradle 구성요소• 이클립스와는 다르다 ! 복합하다 ?

Page 10: 안드로이드를 위한 Gradle 맛들이기

10

2.2 Android Gradle 구성요소• Project 의 Build.gradle

• Android Gradle 플러그인 버전 지정 • Allprojects 항목

• 하위 모듈 공통적으로 해당하는 항목들

• App( 모듈 ) 의 Build.gradle• AndroidManifest.xml 재정의 하기

• Build tools / minSDK / targetSDK / • applicationId / versionCode / versionName

Page 11: 안드로이드를 위한 Gradle 맛들이기

11

2.2 Android Gradle 구성요소• Settings.gradle 멀티 프로젝트에 포함되는 하위 모듈 목록

• Gradle.properties 기타 환경 변수들

• Local.properties SDK Home 등

Page 12: 안드로이드를 위한 Gradle 맛들이기

12

2.3 처음 빌드 해보기• IDE 에서 빌드하기

>apk 생성 : /app/build/output/apk/

• Console 에서 빌드하기

Page 13: 안드로이드를 위한 Gradle 맛들이기

13

2.4 Project Build.gradle• buildscript 블록

• repository?• jcenter? AAR 저장소 • mavenCentral?

• allprojects 블록• repository

• task 선언도 가능

Page 14: 안드로이드를 위한 Gradle 맛들이기

14

2.4 Project Build.gradle• Jcenter 를 따라가보자 https://github.com/koush/AndroidAsync http://jcenter.bintray.com/com/koushikdutta/async/ androidasync/2.1.6/

Page 15: 안드로이드를 위한 Gradle 맛들이기

15

2.4 App Build.gradle• AndroidManifest.xml 을 재정의

1. 단순 덮어쓰기 깔끔하게 2. 동적으로 재정의

• APK 파일명 지정하기

• 의존성 정의• 동적 다운로드

• Jar 파일을 다운로드 할 필요가 없다 ( 자동으로 ~) • AAR?

• Jar + Android Resources • Jar 파일은 안드로이드 리소스 ( 화면 / strings 등 ) 을 가질 수 없다 .

주요 업데이트 항목 :• compileSDK• Build tools ver-

sion• applicationId • minSDK• targetSDK• versionCode• versionName

등등

Page 16: 안드로이드를 위한 Gradle 맛들이기

16

2.4 AAR = Android Archivehttp://tools.android.com/tech-docs/new-build-system/aar-format• The file extension is .aar, and the maven artifact type should

be aar as well, but the file itself a simple zip file with the fol-lowing entries:

• /AndroidManifest.xml (mandatory)• /classes.jar (mandatory)• /res/ (mandatory)• /R.txt (mandatory)• /assets/ (optional)• /libs/*.jar (optional)• /jni/<abi>/*.so (optional)• /proguard.txt (optional)• /lint.jar (optional)

apply plugin: 'com.android.library'

Page 17: 안드로이드를 위한 Gradle 맛들이기

17

2.4 Plugin? • Gradle 의 기본 단위는 Task

• Plugin 은 Tasks 의 집합 Android, Web, POJO 등

• apply plugin: 'com.android.application‘ APK 파일 생성

• apply plugin: 'com.android.library‘ AAR 파일 생성

Page 18: 안드로이드를 위한 Gradle 맛들이기

18

2.4 기타 Plugins

Page 19: 안드로이드를 위한 Gradle 맛들이기

19

2.5 Settings.gradle • 프로젝트에 포함될 Module 목록

• 개수가 늘어날 수록 빌드 속도가 떨어짐 • 5~6 개면 일반 프로젝트는 충분

• 너무 많으면 주석처리

include ':app', ':mylibrary‘

콜론은 모듈을 의미함

Page 20: 안드로이드를 위한 Gradle 맛들이기

20

3. Dependency 추가하기 • 더 이상 JAR 파일을 로컬에 복사하지 않는다 .

• 심지어는 gradle 도 다운받지 않는다 • Gradle wrapper(gradlew) 가 알아서 최신 버전을 다운

받는다

• Group / artifact ID / version 만 지정하면 끝 !

• Transitive Dependency 이해하기

Page 21: 안드로이드를 위한 Gradle 맛들이기

21

3.1 오픈소스 Library 추가• Github 에 많은 오픈소스 library 가 gradle 을

지원한다

• AndroidAsync: https://github.com/koush/AndroidAsync

• ButterKnife: https://github.com/JakeWharton/butterknife

Page 22: 안드로이드를 위한 Gradle 맛들이기

22

3.2 실제로 추가해보자• App 모듈의 Build.gradle 을 수정한다 .

dependencies { … compile 'com.koushikdutta.async:androidasync:2.1.5‘}

• IDE 에서 Sync Now 실행

Page 23: 안드로이드를 위한 Gradle 맛들이기

23

3.2 실제로 추가해보자• Console 에서 실행해보기

dependencies { … compile 'com.koushikdutta.async:androidasync:2.1.5‘}

Page 24: 안드로이드를 위한 Gradle 맛들이기

24

3.2 실제로 추가해보자• 실제 파일 확인

Page 25: 안드로이드를 위한 Gradle 맛들이기

25

3.3 왜 ? 진작 만들지 못했을까 ? • Dependency 관리의 어려움

• 모든 컴포넌트는 모든 컴포넌트를 참조할 수 있다 !

gradlew :app:dependencies 실행

Page 26: 안드로이드를 위한 Gradle 맛들이기

26

3.4 Transitive Dependency 해결• Gradle 은 의존성 관리를 자동으로 해줌

Maven, Apache IVY 의 후손

• 사례 ) Hibernate core library

발췌 : Gradle In Action, 107page

Hibernate-core-3.6.3-

final.jar

Hibernate-commons-annotations-3.2.0-fi-

nal.jarSlf4j-1.5.8.jar

Slf4j-1.6.1.jar

…Version Con-flict

Page 27: 안드로이드를 위한 Gradle 맛들이기

27

3.5 다양한 방식의 Dependency• Gradle 은 다양한 Include 방식을 제공함

사례 ) Omni Notes: https://github.com/federicoiosue/Omni-Notes

compiledebugCompileandroidTestCompilereleaseCompileprovidedCompile 등

Page 28: 안드로이드를 위한 Gradle 맛들이기

28

3.6 Omni Notes 사례• androidTestCompile• fileTree• @aar

• Android Archive• exclude

• group• name• version

• debugCompile• 디버그 모드 전용

• releaseCompile• 릴리즈 모드 전용

Page 29: 안드로이드를 위한 Gradle 맛들이기

29

3.7 주의사항• Gradle 을 의존성의 순서를 지정할 수 없다 . 순서가 문제가 되는 경우는 ? ( 일단 Gradle 을 믿어보자 )

• 정확한 버전을 명시하자 + 를 남발하지는 말자

• 되도록이면 최신 버전을 쓰자

Page 30: 안드로이드를 위한 Gradle 맛들이기

30

3.8 Gradle dependencies 해보자• ./gradlew :app:denpendencies 해보면 생각보다

많은 정보를 얻을 수 있다 .

Page 31: 안드로이드를 위한 Gradle 맛들이기

31

4. Multi Project 구성• App Module 과 Library Module 로 분리 개발

• Library Module 소스 참조 방식

• Library AAR 참조 방식

Page 32: 안드로이드를 위한 Gradle 맛들이기

32

4.1 Library Project 생성하기• Module

• App Module APK 생성 • Library Module AAR 생성

• Android Studio > File > New > New Module

• Build.gradle 이 생성됨

• Settings.gradle 에 추가됨

Page 33: 안드로이드를 위한 Gradle 맛들이기

33

4.2 App 모듈에서 추가하기• App 의 Build.gradle 변경

• 1) 소스 참조 방식

dependencies { compile project(‘:mylibrary’) }

Page 34: 안드로이드를 위한 Gradle 맛들이기

34

4.2 App 모듈에서 추가하기• App 의 Build.gradle 변경

• 2) AAR 직접 참조 방식repositories {

jcenter() flatDir { dirs 'libs' } }

dependencies { compile 'com.example.mylibrary:mylibrary-debug:1.0@aar' }

Page 35: 안드로이드를 위한 Gradle 맛들이기

35

4.3 Library 모듈 호출하기• :mylibrary 에는 LibraryMain.java 에 Activity

존재함

Page 36: 안드로이드를 위한 Gradle 맛들이기

36

4 장 심화학습여기에서는 다루지 않지만 좀더 알아봐야 할 것들

1. Local Repository 만들기 : 생성된 AAR 을 libs 폴더가 아닌 jCentral() 같은 저장소를 로컬에 만들어서 참조하는 방법

2. Build Variants 다루기 : Build type(debug / release) 뿐만 아니라 Full version / Demo version 같은 product flavors 적용

Page 37: 안드로이드를 위한 Gradle 맛들이기

37

5. 기타 유용한 팁• Apk 생성할 때 버전명 기입하기

• Console 에서 task 이름을 부분 입력하여 실행하기

• Gradle daemon 활용하기

• 생성된 APK 를 특정 folder 에 복사하기

Page 38: 안드로이드를 위한 Gradle 맛들이기

38

5.1 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")) } }

Page 39: 안드로이드를 위한 Gradle 맛들이기

39

5.2 Task 축약 이름 실행• Console 에서 .. > ./gradlew :app:asD assembleDebug 실행 > ./gradlew :app:cl clean 실행

• 축약형이 동일하면 오류 발생 > ./gradlew :app:aD 오류 발생

Page 40: 안드로이드를 위한 Gradle 맛들이기

40

5.3 Gradle Daemon 활용• Gradle 을 JVM 기반의 빌드 도구이므로 매번 실행하지 않고 그 다음에 daemon 재활용

> ./gradlew --daemon :app:aD 두번째부터 ..

• 실행시간• 1st : 58.4 초 2nd: 2.8 초

※ daemon 메모리 사용량 증가됨

Page 41: 안드로이드를 위한 Gradle 맛들이기

41

5.4 생성된 APK 복사• 생성된 APK 를 특정 folder 로 복사• Module 의 build.gradle 수정

task publish(dependsOn: 'assembleRelease') << { println '>>>publish APK' copy { from ('build/outputs/apk') { include '*release*.apk' } into 'release' } println '>>>publish APK(END)'}

Page 42: 안드로이드를 위한 Gradle 맛들이기

42

결론 . Android Gradle 왜 쓰지 ?1. Android Studio 와 찰떡궁합

2. Module 중심의 개발• AAR 을 통한 다른 부서와 협업 강화 (not JAR / source)

3. One source , Multi APK 의 실현 1. Demo version 2. Lite version 3. Full version 4. For x86 , arm, mips 등

Page 43: 안드로이드를 위한 Gradle 맛들이기

43

감사합니다 ^^

Page 44: 안드로이드를 위한 Gradle 맛들이기

44

참고문서• 엔터프라이즈 빌드 자동화를 위한 Gradle• Gradle 철저 입문 • Gradle Plugin User Guide – Android Tools Projects

• Gradle in Action • Building and Testing with Gradle

• Reference a local .aar in your Android project• Android Studio AAR 파일 만들기