IT_Programming/Dev Tools

Android Studio Gradle build

JJun ™ 2013. 11. 7. 10:06



 출처: http://croute.me/618






Gradle build script

Structure example

시작점: $projectRoot/settings.gralde

  • build 의 시작은 프로젝트 루트에 있는 [settings.gradle] 에서 시작된다.
  • main-module 이라는 모듈을 기반으로 하는 프로젝트의 settings.gradle 의 script 는 아래와 같다.
  • 해당 프로젝트에서 포함하는 module 을 include 로 명시한다.
include ":main-module" 

Main module: $projectRoot/main-module/build.gradle

  • target sdk version이나, 빌드툴 버전등에 따라 차이가 있지만, 기본적인 구조는 아래와 같다.
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.6.+'
    }
}
apply plugin: 'android'
android {
    compileSdkVersion 18
    buildToolsVersion "18.1.1" 
    defaultConfig {
        minSdkVersion 8
        targetSdkVersion 16
    }
}
dependencies {
    compile 'com.android.support:appcompat-v7:+'
}


buildscript

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.6.+'
    }
}

repository

  • repository 는 default 로 mavenCentral() 을 포함하고 있다.

dependency

  • classpath 뒤쪽의 :0.6.+ 등으로 gradle 버전을 지정할 수 있다.


apply-plugin

Android application module

apply plugin: 'android'

Android library module

apply plugin: 'android-library'


android

컴파일 sdk 버전과 빋드툴 버전을 지정한다.
defaultConfig 로 minimum sdk version 과 target sdk version 을 지정한다.

android {
    compileSdkVersion 16
    buildToolsVersion "18.1.1" 
    defaultConfig {
        minSdkVersion 8
        targetSdkVersion 16
    }
}

sourceSet: eclipse 에서 생성한 ADT project 의 경우

  • 기존 이클립스에서 작업하던 프로젝트의 경우, structure 가 다르기 때문에 인식을 위해 아래의 sourceSets 코드를 추가해주어야 한다.

sourceSets { main { manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['src'] resources.srcDirs = ['src'] aidl.srcDirs = ['src'] renderscript.srcDirs = ['src'] res.srcDirs = ['res'] assets.srcDirs = ['assets'] }

instrumentTest.setRoot('tests') }

  • 물론 위의 방식처럼 직접하지 않고, 이클립스의 [export > Generate Gradle build files] 를 이용해 build.gradle 및 gradle build 관련 파일을 generate 한다.
  • 이때, 주의해야 할 것이, Android studio 와 Eclipse 에서 바라보고 있는 SDK 가 같지 않으면, build tool version 이 달라, export 후에도 Android studio 에 프로젝트를 제대로 불러 올 수 없는 경우가 있다.
  • 이런 문제가 발생한 경우, $projectRood/gradle/wrapper/gradle-wrapper.properties 파일을 확인해, distributionUrl 이 예전 버전을 targeting 하고 있는지 확인해 본다.
#Wed Sep 25 14:05:51 KST 2013
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=http\://services.gradle.org/distributions/gradle-1.7-bin.zip


dependencies

해당 모듈의 디펜던시를 지정한다.
기본적으로, support library v7(예전 버전이면 v4)만을 컴파일 하도록 설정되어있다. 필요에 따라 추가해준다.

dependencies {
    compile 'com.android.support:appcompat-v7:+'
}

compile project

  • 다른 module 을 레퍼런스 하도록 설정할 경우 사용한다.
  • 예를 들면, android library module 을 레퍼런스할때 사용한다.
  • 이때 레퍼런스 하려는 모듈의 위치가 '$projectRoot/libraries/volley' 라면 아래와 같이 작성한다.
compile project(':libraries:volley')
  • compile project 를 추가한 경우,* '$projectRoot/settings.gralde' 에도 추가*해준다.
  • 여기서 중요한점! main-module 이 volley 를 레퍼런스 하고 있다면, volley 는 main-module 보다 먼저 명시 되어야 한다.
// 기존
include ":main-module" 
// $projectRoot/libraries/volley 를 추가한 경우, volley 를 main-module 앞에 명시한다.
include ":libraries:volley", ":main-module" 

compile files

  • jar 파일등을 reference 할 때 사용한다.
  • directory 경로부터, 파일이름, 확장자 까지 명시해준다.
compile files('../libs/commons-io-2.1.jar')
  • files 에서 볼 수 있듯, 여러개의 파일을 연결해서 compile 하도록 설정할 수 있다.
compile files('../libs/commons-io-2.1.jar', '../libs/httpmime-4.1.3.jar')

compile fileTree

  • 특정 directory 에 있는 특정 확장자 파일 모두(예를 들면 .jar 파일들)를 컴파일 하려고 할 때 사용한다.
compile fileTree(dir: './libs', include: '*.jar')

compile native library(.so)

  • native library 를 compile 하기 위해서 아래의 코드를 추가한다.
compile fileTree(dir: "$buildDir/native-libs", include: 'native-libs.jar')
  • build.gradle 에 아래 코드를 추가한다. 위의 코드에 추가된 'native-libs.jar' 를 만드는 코드이다. (예시중 하나)
task nativeLibsToJar(type: Zip, description: 'create a jar archive of the native libs') {
    destinationDir file("$buildDir/native-libs")
    baseName 'native-libs'
    extension 'jar'
    from fileTree(dir: 'libs', include: '**/*.so')
    into 'lib/'
}
tasks.withType(Compile) {
    compileTask -> compileTask.dependsOn(nativeLibsToJar)
}


Release Build

  • terminal, 해당 프로젝트의 root 에서, 아래의 명령을 실행한다. (보통은 android studio 에 있는 terminal 을 이용하면 편하다.)
./gradlew assembleRelease 
  • buildTypes block 을 추가해 build 설정을 할 수 있다.
buildTypes {
    release {
    }
}
  • signingConfigs 에 key store 및 alias, password 를 지정해 추가 입력 없이 빌드할 수 있다.

android { compileSdkVersion 18 buildToolsVersion "18.0.1" defaultConfig { minSdkVersion 8 targetSdkVersion 16 } signingConfigs { release { storeFile file("your keystore file") storePassword "storePassword" keyAlias "keyAlias" keyPassword "keyPassword" } } buildTypes { release { debuggable false signingConfig signingConfigs.release } } }