Saturday, September 12, 2015

[AndroidAnnotations_Build] 1.Gradle, Android Studio Gradle File

먼저 AndroidAnnotations 프로젝트에 대한 설정 방법을 설명하기에 앞서 Android Build에 사용되는 Gradle과 Gradle의 장점 프로젝트 구성을 설명하도록 하겠습니다.

1. Gradle

1.1. Gradle 이란?

Gradle 이란 Groovy DSL(Domain Specific Language)로 작성하여 빌드 자동화를 시키는 툴이다. Gradle은 필요한 프로젝트에 빌드 스크립트를 추가하여 주입하는 방식이다. 또한 Gradle은 Java 진영에서 많이 사용해왔던 Maven, Ant 툴의 단점은 버리고, 장점을 취한 빌드 툴이다.

1.2. Gradle 장점

  1. Groovy 기반인 DSL을 사용한다.
  2. Multi Project Build Configuration Injection 방식을 사용한다.
  3. Dependecncies 관리의 다양한 방법을 제공한다
  4. Build의 구조화가 가능하다.
  5. 빌드 내용을 XML이 아닌 Groovy Script로 작성된다.

1.3. Maven과의 차이점

Maven은 Multi Project 구성시 상속구조로 사용한다. 반면에 Gradle의 경우 Configuration injection(주입 방식)을 사용한다. 또한 XML을 사용할 경우 쓸데 없이 길어지며 중복성이 발생하여 가독성이 떨어진다. 반면에 Gradle의 경우 Groovy Script를 이용하여 이를 해결하고 있다.

2. Android Gradle

기본 Android Studio에서 MainActivity가 존재하는 프로젝트를 생성하면 아래의 이미지와 같은 구조로 생성되어 있습니다.

가장 외부에 있는 "build.gradle" script 내용은 아래와 같습니다.

// 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.3.0'

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

allprojects {
    repositories {
        jcenter()
    }
}

위 build script dependencies 부분에는 우리가 사용하는 외부 dependency는 입력하면 정상적으로 수행되지 않는다. 해당되는 dependecy는 프로젝트 application의 build script에 추가해야한다. 또한 현재 com.android.tools.build 버전의 경우 1.3.1이 (1.3.1 Link) 추가되어있다. 따라서 현재는 1.3.1을 적용하여도 된다.

Project의 repository의 경우 자동생성되는 저장소는 jcenter() 이었다. 하지만 이부분에 있어 기존에는 mavencentral()이었기 때문에 차이점을 확인해보았다. 차이점은 아래와 같다.

  • jcenter는 Android의 gradle plugin이 사용하는 새로운 기본 저장소입니다.
  • jcenter는 Bintray에 있는 Java repostiory입니다. 이 저장소는 Java, Android oss libararies, packages, component가 있는 가장큰 저장소입니다.
  • MavenCertral의 경우 http 요청만 지원할 뿐 https는 지원하지 않는다. 반면에 jcenter는 Https로 보장된 CDN(Content Delivery Network)서버로 사용되고 있다.
  • jcenter는 많은 추가 repository와 artifact를 포함한 mavencetnral의 상위 집합입니다.
  • Jcenter 사람이 말하길 성능면에서 maven central보다 좋다고 주장합니다.
  • Bintray는 Maven central 이 접근하는 package 접근과 다른 접근을 사용합니다.
  • 만약 Maven Cenrtal 패키지에있는 것이 필요하다면 버튼 클릭만으로 Bintray에서 사용할수 있도록 한다.

따라서 앞으로는 jcenter() 를 사용하면될것 같다.

안에 Application 모듈에 있는 "build.gradle" script는 아래와 같다. 컴파일에 사용되는 버전은 현재 나오게 된 23 마시멜로버전을 사용하였다.

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.0"

    defaultConfig {
        applicationId "com.juranoaa.myapplication"
        minSdkVersion 23
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

위의 build script에서 dependencies부분에 사용할 library import하여 사용한다. 또한 여기서 내가 의문점을 가졌던 부분은 apply plugin: 'com.android.application' 이다. 이 부분의 경우 기존에 다음과 같이 표현되었다.apply plugin: 'android'. 이 부분의 경우 Deprecated 되있었는데 해당되는 이유는 찾지 못하였다. 추정하건데 FQCN(Fully Qualifid Class Name)으로 패키지명부터 작성하여 정확한 plugin을 부르기 위함이라고 생각한다.

dependencies 에 있는 compile fileTree(dir : 'libs', include : ['*.jar']) 이 부부은 gradle을 통해 추가한 library가 아닌 직접 libs 폴더에 추가한 library에 대한 compile을 하기 위해서입니다.

buildTypes 부분의 경우에는 Android Documentation을 참조해보면 apk 추출시 쓸모없는 파일에 대해서 제외를 해주는 부분이다. 해당되는 부분은 자세한 내용은 추후 다른 포스팅에서 다루도록 하겠습니다.

그리고 Android Congifuration Gradle Build를 참고 하면 여러 내용들에 대한 자세한 내용을 확인할 수 있습니다.

참고 논문 및 사이트

1. AndroidAnnotations Wiki Get Started Page - https://github.com/excilys/androidannotations/wiki/Configuration

2. Library Project - https://github.com/excilys/androidannotations/wiki/Library-projects

3. Maven을 넘어 Gradle로 가자 - http://egloos.zum.com/kwon37xi/v/4747016

4. Gradle 설정 파일 및 기본개념 - http://www.slipp.net/wiki/pages/viewpage.action?pageId=11632748

5. Androi Studio - Migration from Maven Central to JCenter - http://blog.bintray.com/2015/02/09/android-studio-migration-from-maven-central-to-jcenter/

No comments:

Post a Comment