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

Weitere ähnliche Inhalte

Was ist angesagt?

스프링 프로젝트 시작하기
스프링 프로젝트 시작하기스프링 프로젝트 시작하기
스프링 프로젝트 시작하기Ashal aka JOKER
 
그루비로 안드로이드 앱 개발하기
그루비로 안드로이드 앱 개발하기그루비로 안드로이드 앱 개발하기
그루비로 안드로이드 앱 개발하기Sangkyoon Nam
 
[오픈소스컨설팅]Gradle Basic - How to use Gradle in Java Project
[오픈소스컨설팅]Gradle Basic - How to use Gradle in Java Project[오픈소스컨설팅]Gradle Basic - How to use Gradle in Java Project
[오픈소스컨설팅]Gradle Basic - How to use Gradle in Java ProjectJi-Woong Choi
 
[세미나] 20160520 Gradle
[세미나] 20160520 Gradle[세미나] 20160520 Gradle
[세미나] 20160520 GradleSanghoon Yoon
 
Spring Boot + React + Gradle in VSCode
Spring Boot + React + Gradle in VSCodeSpring Boot + React + Gradle in VSCode
Spring Boot + React + Gradle in VSCodedpTablo
 
[TECHCON 2019: MOBILE - Android]4.쪼개지고 나누어지는 안드로이드
[TECHCON 2019: MOBILE - Android]4.쪼개지고 나누어지는 안드로이드[TECHCON 2019: MOBILE - Android]4.쪼개지고 나누어지는 안드로이드
[TECHCON 2019: MOBILE - Android]4.쪼개지고 나누어지는 안드로이드NAVER Engineering
 
Modern Android App Development
Modern Android App DevelopmentModern Android App Development
Modern Android App DevelopmentChi Hwan Choi
 
안드로이드 빌드 with Gradle
안드로이드 빌드 with Gradle안드로이드 빌드 with Gradle
안드로이드 빌드 with Gradlehaesunglee5
 
이클립스 플랫폼
이클립스 플랫폼이클립스 플랫폼
이클립스 플랫폼Kenu, GwangNam Heo
 
Welcome to Android Studio
Welcome to Android StudioWelcome to Android Studio
Welcome to Android StudioWonKyun Lim
 
Cloud ide를 이용한_모바일_개발의_가능성과_전망
Cloud ide를 이용한_모바일_개발의_가능성과_전망Cloud ide를 이용한_모바일_개발의_가능성과_전망
Cloud ide를 이용한_모바일_개발의_가능성과_전망Sung-tae Ryu
 
Angular Seminar [한빛미디어 리얼타임 세미나]
Angular Seminar [한빛미디어 리얼타임 세미나]Angular Seminar [한빛미디어 리얼타임 세미나]
Angular Seminar [한빛미디어 리얼타임 세미나]Woojin Joe
 
깃헙으로 코드리뷰 하기
깃헙으로 코드리뷰 하기깃헙으로 코드리뷰 하기
깃헙으로 코드리뷰 하기Ohgyun Ahn
 
Jenkins with Unity3d & Android
Jenkins with Unity3d & Android Jenkins with Unity3d & Android
Jenkins with Unity3d & Android 종국 임
 
Logcat과 함께 하는 모바일 웹 디버깅
Logcat과 함께 하는 모바일 웹 디버깅Logcat과 함께 하는 모바일 웹 디버깅
Logcat과 함께 하는 모바일 웹 디버깅JinKwon Lee
 
[TECHCON 2019: MOBILE - Android]7.20분만에 만들어보는 라이브 방송 앱
[TECHCON 2019: MOBILE - Android]7.20분만에 만들어보는 라이브 방송 앱[TECHCON 2019: MOBILE - Android]7.20분만에 만들어보는 라이브 방송 앱
[TECHCON 2019: MOBILE - Android]7.20분만에 만들어보는 라이브 방송 앱NAVER Engineering
 
최전방 생존법 - 프론트엔드 개발자로 살아가기
최전방 생존법 - 프론트엔드 개발자로 살아가기최전방 생존법 - 프론트엔드 개발자로 살아가기
최전방 생존법 - 프론트엔드 개발자로 살아가기Hyeonjin Cho
 

Was ist angesagt? (20)

스프링 프로젝트 시작하기
스프링 프로젝트 시작하기스프링 프로젝트 시작하기
스프링 프로젝트 시작하기
 
그루비로 안드로이드 앱 개발하기
그루비로 안드로이드 앱 개발하기그루비로 안드로이드 앱 개발하기
그루비로 안드로이드 앱 개발하기
 
[오픈소스컨설팅]Gradle Basic - How to use Gradle in Java Project
[오픈소스컨설팅]Gradle Basic - How to use Gradle in Java Project[오픈소스컨설팅]Gradle Basic - How to use Gradle in Java Project
[오픈소스컨설팅]Gradle Basic - How to use Gradle in Java Project
 
[세미나] 20160520 Gradle
[세미나] 20160520 Gradle[세미나] 20160520 Gradle
[세미나] 20160520 Gradle
 
Spring Boot + React + Gradle in VSCode
Spring Boot + React + Gradle in VSCodeSpring Boot + React + Gradle in VSCode
Spring Boot + React + Gradle in VSCode
 
[TECHCON 2019: MOBILE - Android]4.쪼개지고 나누어지는 안드로이드
[TECHCON 2019: MOBILE - Android]4.쪼개지고 나누어지는 안드로이드[TECHCON 2019: MOBILE - Android]4.쪼개지고 나누어지는 안드로이드
[TECHCON 2019: MOBILE - Android]4.쪼개지고 나누어지는 안드로이드
 
Modern Android App Development
Modern Android App DevelopmentModern Android App Development
Modern Android App Development
 
안드로이드 빌드 with Gradle
안드로이드 빌드 with Gradle안드로이드 빌드 with Gradle
안드로이드 빌드 with Gradle
 
Gradle 소개
Gradle 소개Gradle 소개
Gradle 소개
 
이클립스 플랫폼
이클립스 플랫폼이클립스 플랫폼
이클립스 플랫폼
 
Welcome to Android Studio
Welcome to Android StudioWelcome to Android Studio
Welcome to Android Studio
 
Cloud ide를 이용한_모바일_개발의_가능성과_전망
Cloud ide를 이용한_모바일_개발의_가능성과_전망Cloud ide를 이용한_모바일_개발의_가능성과_전망
Cloud ide를 이용한_모바일_개발의_가능성과_전망
 
Angular Seminar [한빛미디어 리얼타임 세미나]
Angular Seminar [한빛미디어 리얼타임 세미나]Angular Seminar [한빛미디어 리얼타임 세미나]
Angular Seminar [한빛미디어 리얼타임 세미나]
 
Goorm소개
Goorm소개Goorm소개
Goorm소개
 
깃헙으로 코드리뷰 하기
깃헙으로 코드리뷰 하기깃헙으로 코드리뷰 하기
깃헙으로 코드리뷰 하기
 
Android QA Process
Android QA ProcessAndroid QA Process
Android QA Process
 
Jenkins with Unity3d & Android
Jenkins with Unity3d & Android Jenkins with Unity3d & Android
Jenkins with Unity3d & Android
 
Logcat과 함께 하는 모바일 웹 디버깅
Logcat과 함께 하는 모바일 웹 디버깅Logcat과 함께 하는 모바일 웹 디버깅
Logcat과 함께 하는 모바일 웹 디버깅
 
[TECHCON 2019: MOBILE - Android]7.20분만에 만들어보는 라이브 방송 앱
[TECHCON 2019: MOBILE - Android]7.20분만에 만들어보는 라이브 방송 앱[TECHCON 2019: MOBILE - Android]7.20분만에 만들어보는 라이브 방송 앱
[TECHCON 2019: MOBILE - Android]7.20분만에 만들어보는 라이브 방송 앱
 
최전방 생존법 - 프론트엔드 개발자로 살아가기
최전방 생존법 - 프론트엔드 개발자로 살아가기최전방 생존법 - 프론트엔드 개발자로 살아가기
최전방 생존법 - 프론트엔드 개발자로 살아가기
 

Ähnlich wie 안드로이드를 위한 Gradle 맛들이기

Gradle Kotlin 컨벤션 플러그인으로 효율적으로 멀티 모듈 관리하기
Gradle Kotlin 컨벤션 플러그인으로 효율적으로 멀티 모듈 관리하기Gradle Kotlin 컨벤션 플러그인으로 효율적으로 멀티 모듈 관리하기
Gradle Kotlin 컨벤션 플러그인으로 효율적으로 멀티 모듈 관리하기YoungjikYoon
 
[170403 2주차]C언어 A반
[170403 2주차]C언어 A반[170403 2주차]C언어 A반
[170403 2주차]C언어 A반arundine
 
DevOps - CI/CD 알아보기
DevOps - CI/CD 알아보기DevOps - CI/CD 알아보기
DevOps - CI/CD 알아보기SeungYong Baek
 
Docker 로 Linux 없이 Linux 환경에서 개발하기
Docker 로 Linux 없이 Linux 환경에서 개발하기Docker 로 Linux 없이 Linux 환경에서 개발하기
Docker 로 Linux 없이 Linux 환경에서 개발하기iFunFactory Inc.
 
Spring boot 5장 cli
Spring boot 5장 cliSpring boot 5장 cli
Spring boot 5장 cliChoonghyun Yang
 
웹 IDE 비교
웹 IDE 비교웹 IDE 비교
웹 IDE 비교Junyoung Lee
 
빠르고 지속적으로 전달하기: Continuous Delivery for Android
빠르고 지속적으로 전달하기: Continuous Delivery for Android빠르고 지속적으로 전달하기: Continuous Delivery for Android
빠르고 지속적으로 전달하기: Continuous Delivery for AndroidSangkyoon Nam
 
Single-page Application
Single-page ApplicationSingle-page Application
Single-page ApplicationSangmin Yoon
 
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍Chris Ohk
 
01.개발환경 교육교재
01.개발환경 교육교재01.개발환경 교육교재
01.개발환경 교육교재Hankyo
 
Project anarchy로 3 d 게임 만들기 part_1
Project anarchy로 3 d 게임 만들기 part_1Project anarchy로 3 d 게임 만들기 part_1
Project anarchy로 3 d 게임 만들기 part_1Dong Chan Shin
 
생산성을 높여주는 iOS 개발 방법들.pdf
생산성을 높여주는 iOS 개발 방법들.pdf생산성을 높여주는 iOS 개발 방법들.pdf
생산성을 높여주는 iOS 개발 방법들.pdfssuserb942d2
 
청강대 특강 - 프로젝트 제대로 해보기
청강대 특강 - 프로젝트 제대로 해보기청강대 특강 - 프로젝트 제대로 해보기
청강대 특강 - 프로젝트 제대로 해보기Chris Ohk
 
Java, android 스터티5
Java, android 스터티5Java, android 스터티5
Java, android 스터티5Heejun Kim
 
GKAC 2015 Apr. - 테스트 코드에서 코드 커버리지까지
GKAC 2015 Apr. - 테스트 코드에서 코드 커버리지까지GKAC 2015 Apr. - 테스트 코드에서 코드 커버리지까지
GKAC 2015 Apr. - 테스트 코드에서 코드 커버리지까지GDG Korea
 
CI in the Mobile World (한글번역)
CI in the Mobile World (한글번역)CI in the Mobile World (한글번역)
CI in the Mobile World (한글번역)DONGSU KIM
 
develop android app using intellij
develop android app using intellijdevelop android app using intellij
develop android app using intellijSewon Ann
 
[오픈소스컨설팅] Docker를 활용한 Gitlab CI/CD 구성 테스트
[오픈소스컨설팅] Docker를 활용한 Gitlab CI/CD 구성 테스트[오픈소스컨설팅] Docker를 활용한 Gitlab CI/CD 구성 테스트
[오픈소스컨설팅] Docker를 활용한 Gitlab CI/CD 구성 테스트Ji-Woong Choi
 
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019devCAT Studio, NEXON
 
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기Sumin Byeon
 

Ähnlich wie 안드로이드를 위한 Gradle 맛들이기 (20)

Gradle Kotlin 컨벤션 플러그인으로 효율적으로 멀티 모듈 관리하기
Gradle Kotlin 컨벤션 플러그인으로 효율적으로 멀티 모듈 관리하기Gradle Kotlin 컨벤션 플러그인으로 효율적으로 멀티 모듈 관리하기
Gradle Kotlin 컨벤션 플러그인으로 효율적으로 멀티 모듈 관리하기
 
[170403 2주차]C언어 A반
[170403 2주차]C언어 A반[170403 2주차]C언어 A반
[170403 2주차]C언어 A반
 
DevOps - CI/CD 알아보기
DevOps - CI/CD 알아보기DevOps - CI/CD 알아보기
DevOps - CI/CD 알아보기
 
Docker 로 Linux 없이 Linux 환경에서 개발하기
Docker 로 Linux 없이 Linux 환경에서 개발하기Docker 로 Linux 없이 Linux 환경에서 개발하기
Docker 로 Linux 없이 Linux 환경에서 개발하기
 
Spring boot 5장 cli
Spring boot 5장 cliSpring boot 5장 cli
Spring boot 5장 cli
 
웹 IDE 비교
웹 IDE 비교웹 IDE 비교
웹 IDE 비교
 
빠르고 지속적으로 전달하기: Continuous Delivery for Android
빠르고 지속적으로 전달하기: Continuous Delivery for Android빠르고 지속적으로 전달하기: Continuous Delivery for Android
빠르고 지속적으로 전달하기: Continuous Delivery for Android
 
Single-page Application
Single-page ApplicationSingle-page Application
Single-page Application
 
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
 
01.개발환경 교육교재
01.개발환경 교육교재01.개발환경 교육교재
01.개발환경 교육교재
 
Project anarchy로 3 d 게임 만들기 part_1
Project anarchy로 3 d 게임 만들기 part_1Project anarchy로 3 d 게임 만들기 part_1
Project anarchy로 3 d 게임 만들기 part_1
 
생산성을 높여주는 iOS 개발 방법들.pdf
생산성을 높여주는 iOS 개발 방법들.pdf생산성을 높여주는 iOS 개발 방법들.pdf
생산성을 높여주는 iOS 개발 방법들.pdf
 
청강대 특강 - 프로젝트 제대로 해보기
청강대 특강 - 프로젝트 제대로 해보기청강대 특강 - 프로젝트 제대로 해보기
청강대 특강 - 프로젝트 제대로 해보기
 
Java, android 스터티5
Java, android 스터티5Java, android 스터티5
Java, android 스터티5
 
GKAC 2015 Apr. - 테스트 코드에서 코드 커버리지까지
GKAC 2015 Apr. - 테스트 코드에서 코드 커버리지까지GKAC 2015 Apr. - 테스트 코드에서 코드 커버리지까지
GKAC 2015 Apr. - 테스트 코드에서 코드 커버리지까지
 
CI in the Mobile World (한글번역)
CI in the Mobile World (한글번역)CI in the Mobile World (한글번역)
CI in the Mobile World (한글번역)
 
develop android app using intellij
develop android app using intellijdevelop android app using intellij
develop android app using intellij
 
[오픈소스컨설팅] Docker를 활용한 Gitlab CI/CD 구성 테스트
[오픈소스컨설팅] Docker를 활용한 Gitlab CI/CD 구성 테스트[오픈소스컨설팅] Docker를 활용한 Gitlab CI/CD 구성 테스트
[오픈소스컨설팅] Docker를 활용한 Gitlab CI/CD 구성 테스트
 
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
 
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
 

Mehr von DongHwan Yu

책쓰기에서 글쓰기까지
책쓰기에서 글쓰기까지책쓰기에서 글쓰기까지
책쓰기에서 글쓰기까지DongHwan Yu
 
7개의 키워드로 만나는 책쓰기
7개의 키워드로 만나는 책쓰기7개의 키워드로 만나는 책쓰기
7개의 키워드로 만나는 책쓰기DongHwan Yu
 
첫번째 SW 책쓰기
첫번째 SW 책쓰기첫번째 SW 책쓰기
첫번째 SW 책쓰기DongHwan Yu
 
반응형프로그래밍입문 2회 20161010
반응형프로그래밍입문 2회 20161010반응형프로그래밍입문 2회 20161010
반응형프로그래밍입문 2회 20161010DongHwan Yu
 
반응형프로그래밍입문 1회 20161003
반응형프로그래밍입문 1회 20161003반응형프로그래밍입문 1회 20161003
반응형프로그래밍입문 1회 20161003DongHwan Yu
 
프로그래머와책,경력관리 20160709
프로그래머와책,경력관리 20160709프로그래머와책,경력관리 20160709
프로그래머와책,경력관리 20160709DongHwan Yu
 

Mehr von DongHwan Yu (6)

책쓰기에서 글쓰기까지
책쓰기에서 글쓰기까지책쓰기에서 글쓰기까지
책쓰기에서 글쓰기까지
 
7개의 키워드로 만나는 책쓰기
7개의 키워드로 만나는 책쓰기7개의 키워드로 만나는 책쓰기
7개의 키워드로 만나는 책쓰기
 
첫번째 SW 책쓰기
첫번째 SW 책쓰기첫번째 SW 책쓰기
첫번째 SW 책쓰기
 
반응형프로그래밍입문 2회 20161010
반응형프로그래밍입문 2회 20161010반응형프로그래밍입문 2회 20161010
반응형프로그래밍입문 2회 20161010
 
반응형프로그래밍입문 1회 20161003
반응형프로그래밍입문 1회 20161003반응형프로그래밍입문 1회 20161003
반응형프로그래밍입문 1회 20161003
 
프로그래머와책,경력관리 20160709
프로그래머와책,경력관리 20160709프로그래머와책,경력관리 20160709
프로그래머와책,경력관리 20160709
 

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

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