안드로이드를 위한 Gradle 맛들이기
-
Upload
donghwan-yu -
Category
Software
-
view
2.143 -
download
0
Transcript of 안드로이드를 위한 Gradle 맛들이기
1
자바카페 유동환
안드로이드를 위한 GRADLE 빌드 맛들이기
2
유동환을 소개합니다• LG 전자 선임연구원 • 유동의 브런치 https://brunch.co.kr/@yudong • 유동의 페북 https://www.facebook.com/koreacio
• < 안드로이드를 위한 Gradle> 집필 (2016)• <Professional Java Web Services> 번역 (2003)
• 10 년 500 권의 독서 달성(2006 년 ~ 2015 년 )
• 사내 독서습관클럽 운영자
3
유동환을 소개합니다 #2• 안드로이드를 위한 Gradle 무료 강의• “ 문장쓰기 독서법”
브런치 조회수 10,000 (Daum 노출 )
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
5
목차1. Gradle 이란 무엇인가 ? 2. Android Gradle 살펴보기 3. Dependency 추가하기4. 멀티 프로젝트 세팅
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 와 연동 가능
7
2. Android Gradle 살펴보기1. Android Build System 2. Android Gradle 의 구성요소 3. 처음 빌드해보기 4. Build.gradle 5. Settings.gradle
8
2.1 Android Build System• 결국은 APK 를 만드는 방법이다 !
• 우리가 알아야 할 것• 컴파일• Signing (Debug / Release)• 멀티 APK 만들기
9
2.2 Android Gradle 구성요소• 이클립스와는 다르다 ! 복합하다 ?
10
2.2 Android Gradle 구성요소• Project 의 Build.gradle
• Android Gradle 플러그인 버전 지정 • Allprojects 항목
• 하위 모듈 공통적으로 해당하는 항목들
• App( 모듈 ) 의 Build.gradle• AndroidManifest.xml 재정의 하기
• Build tools / minSDK / targetSDK / • applicationId / versionCode / versionName
11
2.2 Android Gradle 구성요소• Settings.gradle 멀티 프로젝트에 포함되는 하위 모듈 목록
• Gradle.properties 기타 환경 변수들
• Local.properties SDK Home 등
12
2.3 처음 빌드 해보기• IDE 에서 빌드하기
>apk 생성 : /app/build/output/apk/
• Console 에서 빌드하기
13
2.4 Project Build.gradle• buildscript 블록
• repository?• jcenter? AAR 저장소 • mavenCentral?
• allprojects 블록• repository
• task 선언도 가능
14
2.4 Project Build.gradle• Jcenter 를 따라가보자 https://github.com/koush/AndroidAsync http://jcenter.bintray.com/com/koushikdutta/async/ androidasync/2.1.6/
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
등등
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'
17
2.4 Plugin? • Gradle 의 기본 단위는 Task
• Plugin 은 Tasks 의 집합 Android, Web, POJO 등
• apply plugin: 'com.android.application‘ APK 파일 생성
• apply plugin: 'com.android.library‘ AAR 파일 생성
18
2.4 기타 Plugins
19
2.5 Settings.gradle • 프로젝트에 포함될 Module 목록
• 개수가 늘어날 수록 빌드 속도가 떨어짐 • 5~6 개면 일반 프로젝트는 충분
• 너무 많으면 주석처리
include ':app', ':mylibrary‘
콜론은 모듈을 의미함
20
3. Dependency 추가하기 • 더 이상 JAR 파일을 로컬에 복사하지 않는다 .
• 심지어는 gradle 도 다운받지 않는다 • Gradle wrapper(gradlew) 가 알아서 최신 버전을 다운
받는다
• Group / artifact ID / version 만 지정하면 끝 !
• Transitive Dependency 이해하기
21
3.1 오픈소스 Library 추가• Github 에 많은 오픈소스 library 가 gradle 을
지원한다
• AndroidAsync: https://github.com/koush/AndroidAsync
• ButterKnife: https://github.com/JakeWharton/butterknife
22
3.2 실제로 추가해보자• App 모듈의 Build.gradle 을 수정한다 .
dependencies { … compile 'com.koushikdutta.async:androidasync:2.1.5‘}
• IDE 에서 Sync Now 실행
23
3.2 실제로 추가해보자• Console 에서 실행해보기
dependencies { … compile 'com.koushikdutta.async:androidasync:2.1.5‘}
24
3.2 실제로 추가해보자• 실제 파일 확인
25
3.3 왜 ? 진작 만들지 못했을까 ? • Dependency 관리의 어려움
• 모든 컴포넌트는 모든 컴포넌트를 참조할 수 있다 !
gradlew :app:dependencies 실행
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
27
3.5 다양한 방식의 Dependency• Gradle 은 다양한 Include 방식을 제공함
사례 ) Omni Notes: https://github.com/federicoiosue/Omni-Notes
compiledebugCompileandroidTestCompilereleaseCompileprovidedCompile 등
28
3.6 Omni Notes 사례• androidTestCompile• fileTree• @aar
• Android Archive• exclude
• group• name• version
• debugCompile• 디버그 모드 전용
• releaseCompile• 릴리즈 모드 전용
29
3.7 주의사항• Gradle 을 의존성의 순서를 지정할 수 없다 . 순서가 문제가 되는 경우는 ? ( 일단 Gradle 을 믿어보자 )
• 정확한 버전을 명시하자 + 를 남발하지는 말자
• 되도록이면 최신 버전을 쓰자
30
3.8 Gradle dependencies 해보자• ./gradlew :app:denpendencies 해보면 생각보다
많은 정보를 얻을 수 있다 .
31
4. Multi Project 구성• App Module 과 Library Module 로 분리 개발
• Library Module 소스 참조 방식
• Library AAR 참조 방식
32
4.1 Library Project 생성하기• Module
• App Module APK 생성 • Library Module AAR 생성
• Android Studio > File > New > New Module
• Build.gradle 이 생성됨
• Settings.gradle 에 추가됨
33
4.2 App 모듈에서 추가하기• App 의 Build.gradle 변경
• 1) 소스 참조 방식
dependencies { compile project(‘:mylibrary’) }
34
4.2 App 모듈에서 추가하기• App 의 Build.gradle 변경
• 2) AAR 직접 참조 방식repositories {
jcenter() flatDir { dirs 'libs' } }
dependencies { compile 'com.example.mylibrary:mylibrary-debug:1.0@aar' }
35
4.3 Library 모듈 호출하기• :mylibrary 에는 LibraryMain.java 에 Activity
존재함
36
4 장 심화학습여기에서는 다루지 않지만 좀더 알아봐야 할 것들
1. Local Repository 만들기 : 생성된 AAR 을 libs 폴더가 아닌 jCentral() 같은 저장소를 로컬에 만들어서 참조하는 방법
2. Build Variants 다루기 : Build type(debug / release) 뿐만 아니라 Full version / Demo version 같은 product flavors 적용
37
5. 기타 유용한 팁• Apk 생성할 때 버전명 기입하기
• Console 에서 task 이름을 부분 입력하여 실행하기
• Gradle daemon 활용하기
• 생성된 APK 를 특정 folder 에 복사하기
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")) } }
39
5.2 Task 축약 이름 실행• Console 에서 .. > ./gradlew :app:asD assembleDebug 실행 > ./gradlew :app:cl clean 실행
• 축약형이 동일하면 오류 발생 > ./gradlew :app:aD 오류 발생
40
5.3 Gradle Daemon 활용• Gradle 을 JVM 기반의 빌드 도구이므로 매번 실행하지 않고 그 다음에 daemon 재활용
> ./gradlew --daemon :app:aD 두번째부터 ..
• 실행시간• 1st : 58.4 초 2nd: 2.8 초
※ daemon 메모리 사용량 증가됨
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)'}
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 등
43
감사합니다 ^^
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 파일 만들기