안드로이드 스튜디오에서 라이브러리 추가해서 빌드한다고 삽질 좀 하다가.. 이건 제대로 알아야 할 것 같아서 레퍼런스 해석을 했다.
Overview
안드로이드 스튜디오 빌드 시스템은 Gradle 안드로이드 플러그인으로 되어있는데, Gradle은 안드로이드 스튜디오와 독립적이다.
– 커맨드 라인으로 빌드를 할 수 있다. (안드로이드 스튜디오 설치와 무관함)
– 같은 프로젝트로 다른 기능을 가진 여러개의 APK를 만들 수 있다.
Gradle 빌드는 Groovy 문법이다.
– 자바 VM을 위한 동적 언어
– http://groovy.codehaus.org/
Project and modules
안드로이드 스튜디오에서 프로젝트는 완전한 안드로이드 앱을 대표한다. 프로젝트는 하나 혹은 그 이상의 모듈로 구성되어 있다. 모듈은 독립적으로 빌드, 테스트, 디버그 할 수 있는 앱의 요소로써, 소스코드와 리소스를 포함하고 있다.
안드로이드 스튜디오 프로젝트에서 모듈은 세가지
– 자바 라이브러리 모듈
재사용 가능한 코드를 포함한다. 빌드 시스템이 자바 라이브러리 모듈을 위해서 JAR 패키지를 만든다.
– 안드로이드 라이브러리모듈
재사용 가능한 안드로이드 코드와 리소스를 포함한다. 빌드 시스템은 AAR (Android ARchive) 패키지를 만듬
– 안드로이드 어플리케이션 모듈
라이브러리 모듈에 의존적인 어플리케이션 코드를 포함한다. (대부분 안드로이드 앱은 하나의 어플리케이션 모듈로 구성되어 있음.) 빌드 시스템은 APK 패키지를 만든다.
안드로이드 스튜디오 프로젝트는 top-level Gradle 빌드 파일이 모든 모듈의 정보를 가지고 있고, 각자 모듈도 Gradle 빌드 파일을 가지고 있다.
Dependencies
Module Dependencies
– 다른 모듈을 포함할 수 있다.
Local Dependencies
– 바이너리 아카이브, JAR파일 같은 거
Remote Dependencies
– Maven
– 형식은 group:name:version
– http://search.maven.org/
Gradle console
빌드 task와 subtask를 보여준다. 빌드가 실패하면 자세한 내용을 여기서 찾을 수 있음
Command line으로 빌드하기
맥 명령어
$ chmod +x gradlew - Gradle wrapper스크립트에 권한 줌, 이 명령어는 처음에만 필요
$ ./gradlew assembleDebug
APK 빌드는 app/build/apk/ 에 있고, AAR은 lib/build/libs/ 에 있다.
프로젝트의 가능한 빌드 task리스트를 보려면
$ ./gradlew tasks
릴리즈버전 빌드하기
커맨드 라인으로 빌드
gradlew assembleRelease
안드로이드 스튜디오에서 빌드
1. Gradle 클릭
2. 어플리케이션 이름 밑의 All task
3. app을 확장하면 보이는 assembleRelease를 더블 클릭
빌드 파일 기본
apply plugin: 'android'
android {
compileSdkVersion 19
buildToolsVersion "19.0.0"
defaultConfig {
minSdkVersion 8
targetSdkVersion 19
versionCode 1
versionName "1.0"
}
buildTypes {
release {
runProguard true
proguardFiles getDefaultProguardFile('proguard-android.txt'), \
'proguard-rules.txt'
}
}
}
dependencies {
compile project(":lib") // Module dependency
compile 'com.android.support:appcompat-v7:19.0.1' // Remote binary dependency
compile fileTree(dir: 'libs', include: ['*.jar']) // Local binary dependency
}
apply plugin: ‘android’ 빌드를 위해 Gradle 플러그인을 적용한다.
android {…} 안드로이드 쪽 빌드 옵션을 설정한다.
– defaultconfig : 동적으로 AndroidManifest.xml에 있는 요소를 설정한다. defaultConfig에 있는 값들은 manifest파일에 있는 걸 덮어쓰기(override)한다.
Local binary dependency
jar 파일 같은 것은 프로젝트의 <moduleName>/libs 에 복사를 한다.
compile fileTree(dir: ‘libs’, include: [‘*.jar’]) 은 app/libs에 JAR파일이 있다고 빌드시스템에 알려준다.
빌드 설정시 환경변수 이용하기
storePassword System.getenv("KSTOREPWD")
keyPassword System.getenv("KEYPWD")
빌드 시 입력창으로 받기
storePassword System.console().readLine("\nKeystore password: ")
keyPassword System.console().readLIne("\nKey password: ")
Source directories
여러 버전의 앱을 만들기 위해서는 아래처럼 소스코드와 리소스가 되어야 한다.
– src/main/ – 메인 소스 디렉토리
– src/<buildType>/ – 빌드 타입 소스 디렉토리
– src/<flavorName>/ – flavor 소스 디렉토리
다른 버전의 앱을 만들기 위해서
1. product flavor를 빌드 파일에 정의
2. 각 flavor의 추가 소스 디렉토리를 만든다.
3. 프로젝트에 flavor에 포함되는 소스를 추가한다.
configuration 예
...
android {
...
defaultConfig { ... }
signingConfigs { ... }
buildTypes { ... }
productFlavors {
demo {
packageName "com.buildsystemexample.app.demo"
versionName "1.0-demo"
}
full {
packageName "com.buildsystemexample.app.full"
versionName "1.0-full"
}
}
}
..
flavor 디렉토리 추가 예
레퍼런스 : http://developer.android.com/sdk/installing/studio-build.html