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