132 안드로이드를위한 Gradle 안드로이드스튜디오를이용한빌드자동화 유동환지음
132 안드로이드를위한 Gradle 안드로이드스튜디오를이용한빌드자동화 유동환지음
표지사진김은숙이책의표지는김은숙님이보내주신풍경사진을담았습니다. 리얼타임은독자의시선을담은풍경사진을책표지로보여주고자합니다. 사진보내기 ebookwriter@hanbit.co.kr 안드로이드를위한 Gradle 안드로이드스튜디오를이용한빌드자동화 초판발행 2016 년 6 월 16 일 지은이유동환 / 펴낸이김태헌펴낸곳한빛미디어 ( 주 ) / 주소서울시마포구양화로7길 83 한빛미디어 ( 주 ) IT출판부전화 02-325-5544 / 팩스 02-336-7124 등록 1999년 9월 30일제10-1779호 ISBN 978-89-6848-824-5 95000 / 정가 10,000원 총괄전태호 / 책임편집김창수 / 기획 편집정지연디자인표지강은영, 내지여동일, 조판최송실마케팅박상용, 송경석, 변지영 / 영업김형진, 김진불, 조유미 이책에대한의견이나오탈자및잘못된내용에대한수정정보는한빛미디어 ( 주 ) 의홈페이지나아래이메일로알려주십시오. 한빛미디어홈페이지 www.hanbit.co.kr / 이메일 ask@hanbit.co.kr Published by HANBIT Media, Inc. Printed in Korea Copyright c 2016 유동환 & HANBIT Media, Inc. 이책의저작권은유동환과한빛미디어 ( 주 ) 에있습니다. 저작권법에의해보호를받는저작물이므로무단복제및무단전재를금합니다. 지금하지않으면할수없는일이있습니다. 책으로펴내고싶은아이디어나원고를메일 (ebookwriter@hanbit.co.kr) 로보내주세요. 한빛미디어 ( 주 ) 는여러분의소중한경험과지식을기다리고있습니다.
저자소개 지은이 _ 유동환 생각을즐기는프로그래머. 유동의브런치 (https://brunch.co.kr/@yudong) 를운영중이며 LG전자에서안드로이드앱을개발하고있습니다. 최근에는 IoT 관련프로젝트를하며바쁜날들을보내고있습니다. 스무살때부터자바카페와 JCO ( 한국자바개발협의회 ) 커뮤니티에서수년간활동하며소심했던성격도고치고누군가에도움이되는사람이되려고노력중입니다. 사내에서는독서습관클럽을만들어운영한지일년이되어가고있습니다. 연세대학교정보대학원에서경영정보학을전공하였고 Professional Java Web Services ( 정보문화사, 2002) 를공역하였습니다.
저자서문 2014년어느날새로운개발팀에들어가보니낯선개발환경이눈에들어왔습니다. 첫번째는이클립스가아니라안드로이드스튜디오 Android Studio 라는인텔리제이 IntelliJ 기반의 IDE였고, 두번째는빌드도구인 Gradle이었습니다. 다른팀에서사용하지않는생소한도구때문에처음 3개월간매우불편하였지만이내익숙해졌고, 이후새로운앱을개발하면서 Gradle 덕분에십여개의다른개발팀과협업을원활하게진행하였습니다. 이런추억을되돌아보니프로그래밍언어뿐만아니라지속해서새로운개발도구를도입해야개발생산성이향상될수있음을배웠습니다. 이책은안드로이드개발자가활용하는 Gradle에대해다룹니다. 그동안 Gradle에관한책은몇권있었지만, 안드로이드개발자가바로따라해보기는어려웠습니다. 그래서필자가실무에서겪은내용을알기쉽게풀어내려고최대한노력하였습니다. 예를들어, 부서에신입사원이들어온다면어떤순서로 Gradle을설명할수있을까하고여러번자신에게되물으면서만든산출물입니다. 처음집필할때는안드로이드스튜디오가 1.4 버전이었는데, 이제는 2.0 버전을넘어 2.1.2 버전까지나왔습니다. 그동안많은변화가있었지만 2.0 버전부터는안정버전이라고생각해도무방합니다. 이작은책을쓰는데도많은사람의도움을잊을수없습니다. 매주일요일함께글쓰고피드백을해준친구유현석과자바카페강사준비팀 3기멤버들, 그리고투박했던초고를매끄럽게다듬어주신한빛미디어여러분 ( 특히정지연님 ), 마지막으로사랑하는아내지영에게감사의말을전합니다.
대상독자및참고사항 초급초중급중급중고급고급 이책은안드로이드개발경험이있는개발자중에서안드로이드스튜디오와 Gradle 의기본적인내용을빠르게학습하고자하는독자를대상으로합니다. 간단한안드로이드앱을만들어본경험이있다면누구든이책을이해하는데문제가없습니다. 책에있는예제는 Hello World와간단한버튼이있는 UI 정도입니다. Gradle의백미는멀티프로젝트의활용입니다. 현재이클립스로진행중인개발프로젝트가있다면단지 Gradle로동일하게변환하는데만족하지말고독립적인기능을별도모듈로구성하여멀티프로젝트로구성해보기를추천합니다. Gradle 내부를이해하는데큰도움이됩니다. 안드로이드스튜디오버전은 2.0을기반으로하고있습니다. 그이전버전에서는책에서언급한내용이동일하게동작하지않을수있습니다.
차례 chapter 1 안드로이드스튜디오와 Gradle 009 1.1 안드로이드스튜디오 009 1.1.1 안드로이드스튜디오의기능 010 1.1.2 안드로이드스튜디오의장점 012 1.2 Gradle 014 1.3 안드로이드를위한 Gradle의특징 016 chapter 2 첫 Gradle 프로젝트생성하기 019 2.1 Hello World 프로젝트생성 019 2.2 프로젝트 build.gradle 025 2.3 모듈 build.gradle 026 chapter 3 Gradle 태스크와생명주기 029 3.1 프로젝트빌드하고실행하기 029 3.2 Gradle 태스크개념잡기 034 3.2.1 태스크에서로그출력하기 034 3.2.2 태스크에그룹지정하기 036 3.2.3 태스크에설명지정하기 038 3.2.4 태스크에의존성지정하기 039 3.3 Gralde의생명주기 040
chapter 4 외부라이브러리추가 043 4.1 가장기본적인방법 044 4.2 그외다양한방법 045 4.2.1 다른모듈의소스코드참조하기 045 4.2.2 디버그모드와릴리스모드에맞게참조하기 046 4.2.3 안드로이드유닛테스트참조하기 047 4.2.4 공개라이브러리참조하기 - JAR 파일 047 4.2.5 공개라이브러리참조하기 - AAR 파일 048 4.2.6 로컬에있는 AAR 파일참조하기 049 4.2.7.so(JNI) 파일참조하기 050 4.3 Omni Notes 사례 050 chapter 5 멀티프로젝트활용 055 5.1 Android 뷰와 Project 뷰 055 5.2 안드로이드라이브러리모듈만들기 058 5.3 로컬저장소만들기 061 5.3.1 로컬저장소는언제필요한가 061 5.3.2 로컬저장소만드는방법 062 chapter 6 테스트 067 6.1 로컬유닛테스트 068 6.2 안드로이드테스트 071 6.3 Espresso 연동하기 074 6.4 로컬유닛테스트의제약사항 077
chapter 7 빌드변형 079 7.1 빌드타입 079 7.2 앱서명첨부하기 081 7.3 제품특성 083 7.3.1 제품특성생성하기 083 7.3.2 제품특성확인하기 084 7.3.3 제품특성제대로활용하기 086 7.3.4 제품특성으로특정기능활성화하기 092 chapter 8 고급활용 095 8.1 확장플러그인 095 8.1.1 CheckStyle 플러그인 096 8.1.2 Retrolambda 플러그인 099 8.1.3 람다표현식사용해보기 100 8.2 리소스줄이기 101 8.3 기타유용한팁 102 8.3.1 APK 생성시버전명자동기입하기 102 8.3.2 생성된 APK를특정폴더로복사하기 103 부록 A Git 콘솔에서 Gradle 활용하기 105 A.1 최신소스코드받아바로빌드하기 105 A.2 클린하고다시빌드하기 107 A.3 빌드하여타깃에바로 APK 설치하기 108 A.4 라이브러리의존성확인하기 109
chapter 1 안드로이드스튜디오와 Gradle 1장에서는안드로이드스튜디오라는 IDE( 통합개발환경 ) 와빌드도구인 Gradle을소개합니다. 안드로이드환경에서의 Gradle은 IDE를제외하면설명하기힘들정도로밀접하게연관되어있습니다. 또한, 기존이클립스개발환경과비교해도많은것이달라졌습니다. 안드로이드스튜디오가 Gradle과관련하여어떤편의기능을제공하는지알아보고, Gradle의개념과주요특징, 이클립스와비교하여폴더구조가어떻게달라졌는지를살펴보겠습니다. 1.1 안드로이드스튜디오 2015년구글은기존의이클립스 ADT Android Development Toolkit 지원을중단하고안드로이드스튜디오를공식 IDE로선언하였습니다 (2016년현재 ADT는구글사이트에서다운로드할수없습니다 ). 안드로이드스튜디오는 JetBrain사의인텔리제이기반 IDE로, 강력한검색기능과다양한플러그인을지원합니다. 필자는 2014년새로운개발팀에합류하면서안드로이드스튜디오 1.0을처음사용해볼수있었습니다. 그전까지는이클립스를사용하고있었는데, 말그대로너무달랐습니다. IDE의전체외관과단축키, Gradle이라는새로운빌드도구까지모든것이달라서익숙해지는데 3개월은걸렸습니다. 이제는너무잘사용하고있고이클립스로다시돌아갈일은없을것같습니다. 1 안드로이드스튜디오와 Gradle - 009
안드로이드스튜디오의최신버전은 2.1.2입니다. 그동안구글에서지속적으로업데이트해왔지만, Windows 용 1.2 버전까지는속도도느리고메모리도많이사용한것이사실입니다. 1.3 버전부터드라큘라 Dracula Theme 도지원하고안정성도대폭향상되어그야말로안드로이드스튜디오시대가열렸다고할수있습니다. 이책에서는 Android Studio 2.0을기준으로특징을간단히설명하겠습니다. 1.1.1 안드로이드스튜디오의기능가장먼저눈에띄는것은 IDE의좌우와하단의다양한기능버튼으로, 이클립스보다더많은것을지원하고있습니다. 여기서는현업개발자가자주사용하는기능들을정리해보겠습니다. 그림 1-1 안드로이드스튜디오기본화면 좌측 1. Project 프로젝트에포함된파일들을다양한관점에서요약하여보여줍니다. 안드로이드개발자에게는 Android 가가장편리하며, 실제파일구조를보기 010 -
위해서는 Project로변경합니다. 이클립스가익숙한개발자는 Project로시작하고점차 Android를활용하면됩니다. 2. Captures 필요한스크린샷을캡처하는기능으로, 실제타깃을연결하여개발하는경우유용합니다. 이클립스와달리캡처한이미지를 IDE에서바로볼수있어편리합니다. 3. Build Variants 모듈별빌드변형 Build Variants 이표시됩니다. 이는중급이상의내용으로 7장에서상세하게다루겠습니다. 하단 1. Terminal 내장된명령창입니다. 보통 IDE만으로충분히빌드할수있지만, 실무에서는 Terminal 혹은 git console을함께띄워놓고빌드하는것이일반적입니다. 콘솔에서 IDE 없이빌드하는방법을반드시익혀야합니다. 2. Android Monitor 기존에는 Android Logcat 이라는이름이었습니다. 이클립스와는달리여러대의타깃이연결되어있어도각각편리하게로그와메모리현황등을볼수있으며, 기능이점점늘어날예정입니다 ( 더자세한내용은안드로이드스튜디오관련서적에서참고하시기바랍니다 ). 3. TODO 이클립스와마찬가지로 //TODO, //FIXME 등의목록을볼수있습니다. 4. Event Log 실행상태를표시하는창입니다. 앱실행또는 test 실행시함께띄워놓고보면좋습니다. 5. Gradle Console Gradle 태스크 Task 실행결과를표시하는곳입니다. Gradle이익숙해질때까지는자주살펴봐야하는곳입니다. 우측 1. Gradle 프로젝트와각모듈에포함된 Gradle 태스크를표시합니다. 태스크 는 android, build, install 과같이항목별로구별되어있습니다. 1 안드로이드스튜디오와 Gradle - 011
2. Android Model Android Studio 1.4 에서새로포함된내용입니다. Gradle 의전체내용을카테고리별로요약하여표시합니다. build tools 버 전이나타깃 SDK 버전등을알아볼수있습니다. 1.1.2 안드로이드스튜디오의장점사용자입장에서체험한안드로이드스튜디오의눈에띄는특징은다음과같습니다. 1. 어디서나검색기능안드로이드스튜디오의검색을한마디로표현하면 [Shift + Shift] 입니다. 어떤파일을찾을때 Shift 키를두번누르면 ( 더블시프트 ) 다음과같이검색창이뜨고그아래에는최근에검색한파일과검색결과가표시됩니다. 필요한내용을빠르게찾아주는마성의기능입니다. 이클립스를오랫동안활용하여안드로이드스튜디오에익숙하지않으신분들은자주사용해보기바랍니다. 이클립스를실행했을때도무의식적으로더블시프트를누르는자신을발견할수있습니다. 그림 1-2 안드로이드스튜디오내검색 012 -
2. 강력한 Code Assistant Code Assistant는코드를작성할때유사한변수나메서드를추천해주는기능입니다. 이클립스의경우정확하게철자가맞을때만코드를추천했는데, 안드로이드스튜디오는일부만입력해도추천의정확도가높습니다. 이클립스는고정된검색기법을가지고있지만, 안드로이드스튜디오의 Code Assistant는매우유연합니다. 3. Gradle과완벽한통합이클립스의빌드도구는 Ant인데, 일반적인개발자에게는그활용여부가감춰져있습니다. IDE에서 Ant 태스크를실행하여빌드와앱서명 singing 등의업무를할수있다는장점도있지만, 감춰져있는만큼빌드스크립트를변경하는경우 IDE 와밀접하게통합되어있지않아불편합니다. 안드로이드스튜디오는빌드도구인 Gradle과전면적으로통합되어있습니다. [ 그림 1-1] 에서도보듯이소스코드와함께 Gradle의필수요소인 build.gradle 과 settings.gradle 파일등이별도카테고리에구별되어있고, 기본화면의좌우와하단에도 Gradle 관련사항을편리하게열람할수있는다양한기능이내장되어있습니다. 마치 Gradle을알아야안드로이드개발을할수있다는느낌을줄정도입니다. 이에관한자세한내용은뒤에서살펴보겠습니다. 4. 편리한단축키안드로이드스튜디오의단축키는이클립스의단축키보다누르기편합니다. 안드로이드스튜디오는 F3과같은키보드상단의기능키의활용을최소화하여소스코드를입력하는도중에흐름을끊기지않고단축키를누를수있습니다. 안드로이드스튜디오에서자주사용하는단축키목록은다음과같습니다. Shift + Shift 어디서나검색기능 Ctrl + B 선언부로이동 1 안드로이드스튜디오와 Gradle - 013
Ctrl + Alt+ B 구현부로이동 Alt + F7 함수가어디서사용되었는지검색 Shift + F6 이름바꾸기 Ctrl + Alt + <LEFT>/<RIGHT> 이전 ( 이후 ) 에사용했던커서로이동 Alt + <LEFT>/<RIGHT> 탭좌우로이동 지금까지안드로이드스튜디오에대해간단히알아보았습니다. Gradle은안드로이드스튜디오라는 IDE와밀접하게통합되어있으므로 IDE를잘아는것이무엇보다중요합니다. 가능한이클립스의기억은최대한잊고안드로이드스튜디오스타일에익숙해지기를바랍니다. 1.2 Gradle Gradle 은 Gradle 사에서만든범용빌드도구입니다. 안드로이드에서빌드란 간단하게말하면 JAR Java Archive 파일, AAR Android Archieve KAndroid Application 파일, AP Package 파일을만드는방법입니다. Gradle 은안드로이드앱뿐만아니라 Java, C/C++, Groovy 등의범용언어를모두지원합니다. 한마디로 Gradle 을한번 배워두면다른언어로개발하더라도빌드스크립트를처음부터다시작성할필요 없이재사용할수있습니다. Gradle 홈페이지에서소개한 Gradle 의주요특징은다음과같습니다. 01 Polyglot Build 1. 폴리글랏빌드 링크드인 Linkedin 은 60 개의서로다른언어 (Java, Scala, Phython, C/C++ 등 ) 를 Gradle 을사용하여빌드하고관리한다고합니다. Gradle 에서는각언어를플 러그인으로구별하는데, 예를들어, 일반 Java 는 java, Java 웹프로젝트는 war, 안드로이드앱은 com.android.application 플러그인을사용하면됩니다. 01 http://gradle.org/whygradle-build-automation/ 014 -
Tool Integration 2. 도구통합 Gradle 은이클립스, 안드로이드스튜디오, IntelliJ 와같은 IDE 에서편리하게 사용할수있도록창 Window 를제공하고있고 CI Continuous Integration 도구인젠킨스 Jenkins 와도함께활용할수있습니다. 예를들어, 소스코드가 Git 에업로드되면서 버에서 CheckStyle, FindBugs 등의플러그인을활용하여소스코드가잠재적 으로가진문제를검출하여개발자에게통보하거나위험한코드를 merge 할수 없도록강제할수있습니다. 3. 외부라이브러리관리자동화 Gradle의또다른장점중하나는개발자가더는외부라이브러리를관리하지않아도된다는점입니다. 이클립스에서개발하는경우 libs 폴더에원하는외부라이브러리파일을직접복사하였지만, Gradle에서는단순히외부저장소위치와라이브러리의그룹, 이름, 버전등을지정해주면알아서다운로드하고빌드에포함시킵니다. 4. 고성능빌드 Gradle은점진적인빌드 Incremental builds, 빌드캐싱 build caching, 병렬빌드 parallelization 기능을지원하여고성능빌드를추구합니다. 하지만실제로윈도우환경에서안드로이드앱을빌드해보면 Gradle의메모리사용량이많고빌드시 CPU 점유율이높습니다. 실무에서권장하는사양은메모리 8GB와 SSD 장착입니다. 메모리 4GB에서는모듈의개수가늘어나면 Out of Memory 오류가종종발생하기도합니다. 이부분은향후개선될것으로생각합니다. 1 안드로이드스튜디오와 Gradle - 015
1.3 안드로이드를위한 Gradle 의특징 구글은 2014년구글 I/O에서새로운빌드시스템을발표하였습니다. 그목표는다음과같습니다. 02 코드와리소스를재활용하기쉽게한다. 다양한변형 variants 을만들수있고앱의특성 flavors 에따라단일소스에서여러 APK를만들수있게한다. 빌드절차를쉽게설정하고확장하고커스터마이즈할수있게한다. IDE와의밀접한통합을추구한다. Gradle은안드로이드의새로운빌드시스템의핵심입니다. 앞의목표를달성하기위해안드로이드애플리케이션의폴더구조가그전보다복잡하게변경되었습니다. 안드로이드스튜디오와이클립스에서각각 Hello World 프로젝트를생성하여프로젝트구조를비교하면다음과같습니다. 그림 1-3 안드로이드스튜디오프로젝트구조 vs 이클립스프로젝트구조 안드로이드스튜디오 이클립스 02 http://tools.android.com/tech-docs/new-build-system/user-guide 016 -
첫째, Gradle은멀티프로젝트구조입니다. 안드로이드스튜디오에서프로젝트를새로생성하면단일프로젝트가아니라멀티프로젝트로생성됩니다 ( 개발자가원하면싱글프로젝트구조로변경할수있지만권장하지는않습니다 ). [ 그림 1-3] 의왼쪽을보면 app 이라는폴더가있습니다. 이를 Gradle에서는모듈 Module 이라고부릅니다. 이클립스의프로젝트는 src 폴더를한개만가질수있다면, Gradle에서는 app 모듈뿐만아니라새로운모듈을추가하여모듈별로 src 폴더를포함하게됩니다. 둘째, src 폴더의구조가다릅니다. 이클립스에서는 src 하위에소스코드가패키지명과함께바로등장하지만 Gradle에서는소스코드가바로오지않고 src 폴더하위에 androidtest, main, test가추가됩니다. 원래 androidtest 와 main만있었지만, Anrdroid Studio 1.4로오면서 test 폴더가추가되었습니다. test 폴더는구글 I/O 2015에서소개된 Local Unit Test를지원합니다 ( 이폴더에관한자세한내용은구글문서를참고하기바랍니다 ). 03 main 폴더에는안드로이드앱소스코드가있고, androidtest에는안드로이드테스팅 ( 정확하게는 Instrumentation Testing) 소스코드가있습니다. 셋째, libs 폴더입니다. 이클립스의 libs 폴더에는빌드하는데필요한외부라이브러리파일이직접포함되어있습니다. 하지만 Gradle에서는의존성관리를 Gradle이담당하므로 libs 폴더를사용하지않아도됩니다. 필요한스크립트파일에서외부라이브러리의저장소와버전등을지정하면빌드할때알아서해당버전을다운로드하여포함합니다. 또한, + 옵션등을적용하면최신버전을자동으로다운로드할수도있습니다. 넷째, bin 폴더입니다. 기존이클립스프로젝트에서는빌드를완료한 APK가 bin 폴더에있지만, 안드로이드 Gradle에서는 build/output/apk 폴더에위 03 http://tools.android.com/tech-docs/unit-testing-support 1 안드로이드스튜디오와 Gradle - 017
치합니다. 빌드의결과물은적용한플러그인에따라 APK 파일혹은 AAR 파일입니다. 이제빌드는단지 APK( 또는 AAR) 를생성하는데서벗어나점점다양한언어, 프레임워크와어우러지고자동화되어가고있습니다. 018 -