Android Nanodegree Project4 Review(Part1)

이번 Udacity 안드로이드 나노디그리 Project4(이하 P4)는 아래와 같은 몇가지 요소가 복합적으로 적용된 프로젝트입니다.

  • Step 0: 배너가 있는 액티비티와 클릭시 농담을 말하는 것 같은 버튼.
  • Step 1: 자바라이브러리 생성하기
  • Step 2: 안드로이드 라이브러리 생성하기
  • Step 3: GCE(Google Cloud Endpoints) 모듈 생성하기
  • Step 4: 기능 테스트 코드 추가하기
  • Step 5: 앱에 유무료 제품 기능 추가하기

안드로이드 진영에서는 개발 환경(IDE, http://developer.android.com/intl/ko/tools/revisions/studio.html)으로 안드로이드 스튜디오(이하 안스)를 사용하고 있습니다. 이 안스는 JetBrains (https://www.jetbrains.com/)사가 꾸준히 업데이트하고 있습니다. 머잖아 2.0버전으로 메이저 업그레이드가 될 예정입니다. 안스는 그래들(Gradle)이라는 시스템을 사용해서 애플리케이션 프로젝트의 다양한 구성 요소를 컴파일하고 패키징하고 있습니다.

그래들은 한마디로 자동화된 빌드 시스템입니다. 그래들은 개발자에게 제공되는 유연성이 높습니다. 즉 그래들 시스템은 독립적인 명령형 기반 환경이면서 또한 플러그인을 사용하여 다른 환경에 통합될 수 있습니다. 안스는 안스 플러그인을 통해 그래들이 통합되어 있습니다. 개발자들은 이 그래들에서 그루비(Groovy)라는 프로그래밍 언어 기반의 스크립트로 그래들 빌드 파일을 선언합니다.

이번 P4에서는 그래들 기능 중 의존(dependency) 관계를 활용하고 있습니다. 즉 한 모듈이 해당 프로젝트의 다른 모듈을 로드하고 있습니다. 이 경우 첫 번째 모듈은 두 번째 모듈에 의존 관계를 갖습니다. 만일 런타임 시에 두 번째 모듈을 찾지 못해 론칭에 실패 할 수 있다면 애플리케이션의 빌드가 실패하게 됩니다. 즉 빌드 에러가 나게 됩니다.

또한 P4에서는 전체 프로젝트가 컴파일 및 실행되기 위해서는 관련하여 필요한 라이브러리와 JAR 파일이 필요합니다. 이 경우의 의존 관계는 로컬(local)과 원격(remote)으로 분류 할 수 있습니다. 로컬 의존 관계에서는 빌드가 수행되는 컴퓨터 시스템의 로컬 파일 시스템에 있는 모듈을 참조합니다. 반면에 원격 의존 관계는 원격 서버(repository)에 있는 모듈을 참조합니다.

안스 프로젝트의 경우 원격 의존 관계는 메이븐(Maven)이라는 또 다른 프로젝트 관리 도구를 사용해서 처리되고 있는데요, P4에서는 아래와 같습니다.

dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
// Added for AdMob
compile project(':jokeandroidlib')
freeCompile 'com.google.android.gms:play-services:7.5.0'
compile 'com.android.support:appcompat-v7:23.1.1'
compile project(path: ':backend', configuration: 'android-endpoints')
compile project(':jokejavalib')
}

위의 볼드체로 되어 있는 경우와 같이, 만일 메이븐 구문을 사용해서 그래들 빌드 파일에 원격 의존 관계가 선언되면 지정된 리포지터리로부터 의존 관계가 있는 파일들이 자동으로 다운로드되어 빌드 프로세스에 포함됩니다. 그 결과 P4에서 다운로드된 파일은 아래와 같습니다.

최상위 수준의 그래들 빌드 파일

앞서 본 것처럼 P4는 총 4개의 프로젝트로 구성되어 있습니다. 각 프로젝트는 하나의 최상위 수준 그래들 빌드 파일을 포함합니다. 이 파일은 아래 그림에 있는 build.gradle(Project:프로젝트 이름)로 프로젝트 도구 창에 나타납니다.

위 그림 P4의 최상위 수준 그래들 빌드 파일의 해당 내용은 아래와 같습니다.

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.5.0'

// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}

allprojects {
repositories {
jcenter()
}
}

evaluationDependsOn ":backend"

project(":backend"){
appengine{
daemon true
}
}

task testLocalServer {
dependsOn ':backend:appengineRun'
mustRunAfter ':backend:appengineRun'
dependsOn ':app:connectedAndroidTestFreeLocaltest'
finalizedBy ':backend:appengineStop'
}

여기서는 jcenter 리포지터리를 사용해서 원격 라이브러리를 얻고 있습니다.

모듈 수준의 그래들 빌드 파일들

P4는 총 4개의 모듈, 즉 안드로이드 애플리케이션, 안드로이드 라이브러리, 자바 라이브러리, 구글 클라우드 플랫폼 모듈 이렇게 4개입니다. 각 모듈은 자신의 그래들 빌드 파일을 필요로 합니다. 프로젝트 구조 관점에서 그 빌드 파일들은 아래의 위치에 있습니다.

P4의 app에 있는 build.gradle은 내용은 아래와 같습니다.

apply plugin: 'com.android.application'

android {
testBuildType "localtest"
compileSdkVersion 23
buildToolsVersion '23.0.2'

defaultConfig {
applicationId "com.udacity.gradle.builditbigger"
minSdkVersion 10
targetSdkVersion 23
versionCode 1
versionName "1.0"
multiDexEnabled true
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
localtest {
debuggable true
jniDebuggable false
signingConfig android.signingConfigs.debug
renderscriptDebuggable false
renderscriptOptimLevel 3
minifyEnabled false
zipAlignEnabled true
}
}
productFlavors {
free {
applicationId 'com.udacity.gradle.builditbigger.free'
}
paid {
minSdkVersion 10
applicationId 'com.udacity.gradle.builditbigger.paid'
targetSdkVersion 23
versionCode 1
versionName '1.0'
}
}
}

dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
// Added for AdMob
compile project(':jokeandroidlib')
freeCompile 'com.google.android.gms:play-services:7.5.0'
compile 'com.android.support:appcompat-v7:23.1.1'
compile project(path: ':backend', configuration: 'android-endpoints')
compile project(':jokejavalib')
}

위 그래들 빌드 파일은 안드로이드 플러그인의 사용을 선언하는 것부터 시작합니다. 그 다음에 android 섹션에서는 app 모듈을 빌드 할 때 사용되는 SDK와 SDK에 포함된 안드로이드 빌드 도구의 버젼을 정의합니다. defaultConfig 섹션에 선언된 항목들은 app 모듈이 최초 생성되었을 때 안스에서 입력된 설정들로부터 가져옵니다.

사정상 이번 P4의 리뷰는 우선 여기까지 작성하겠습니다. 추후 Part2에서 이어서 작성하겠습니다. 감사합니다.