2014년 5월 12일 월요일

build tool - Gradle

Build tools
  • Ant
  • Maven
  • Ivy
  • Gradle
  • ...
Gradle
  • Groovy 기반 DSL(Domain Specific Language) 채용
  • 선언적 언어의 특징을 제공
  • 멀티 프로젝트 관리가 쉬움
  • Gradle Wrapper를 이용하여 Gradle이 설치되지 않은 환경에서도 빌드 가능
참고 URL - http://www.gradle.org, http://kwonnam.pe.kr/wiki/gradle

Groovy
  • 타입이 유연하고  간결한 동적 객체지향 프로그래밍 언어
  • 자바, 루비, 스몰토크, 파이썬 언어에서 영향을 받음
  • 자바와 상호 연동
  • 클로저(List Processing Programming) 지원
참고 URL - http://groovy.codehaus.org, http://groovy.codehaus.org/Korean+Home

참고)
 Grails - Ruby on Rails를 Groovy용으로 개발한 웹 개발 프레임워크


eclipse에서 android project를 Gradle로 빌드/배포

1. 적용방안
  • Gradle Project로 전환하여 사용하기
    •  Gradle IDE plugin 3.5 버전을 설치하여 테스트한 결과 plugin 버그인지 안드로이드 프로젝트로 세팅된 정보에 문제가 생긴다.
    •  eclipse에 완전히 통합된 느낌이 없다.
    •  개발환경에서는 오히려 불편한점이 더 많다.
  • Gradle 세팅파일만 추가하여 배포시에만 Gradle 사용하기
    • 기존 안드로이드 프로젝트에 아무런 영향을 미치지 않는다.
    •  IDE에 영향을 받지 않는다.
  ==> Eclipse에서 Android Project를 Gradle Project로 전환하여 개발하는것은 다소 문제가 있어 보여 두번째 방안으로 적용하는 방법을 설명하였다.


2. Gradle 설치
  • http://www.gradle.org 에서 다운로드 후 압축해제
  • 해당 경로로 GRADLE_HOME 환경변수 추가
  • 해당 경로의 bin 디렉토리를 PATH 환경변수에 추가
3. Eclipse에 Gradle plugin 설치
  • Eclipse 메뉴의 Help >> Eclipse Marketplace 에서 gradle 로 검색
  • Gradle 설정파일 편집기인 Minimalist Gradle Editor 설치
  • Gradle Integration for Eclipse 설치

4. 기존 Android Project에 gradle 적용하기

 1) 단일 프로젝트 구조

  (1) Gradle에 Android SDK 경로 설정
  • 프로젝트 홈 디렉토리에 "sdk.dir" 이름으로 Android SDK Home 경로가 설정된local.properties를 추가
  • 또는 ANDROID_HOME  환경변수 추가

  (2) 프로젝트 홈 디렉토리에 build.gradle 파일 생성
  • 직접 파일을 생성하여 Gradle을 작성할 수 있다.
  • 프로젝트 Export 기능에서 제공하는 "Generate Gradle build files" 기능을 사용하여 손쉽게 작성할 수 있다.
 ==> Eclipse에서 제공하는 "Generate Gradle build files" 기능으로 생성된 build.gradle 파일을 수정하여 사용하는것이 효과적이다.

  (3) build.gradle 파일 수정
  • lint 에러가 발생할 경우 build가 중단되는 문제
 ==> android { ... } 안에 다음 항목 추가
    lintOptions {
        abortOnError false
    }
  • java 소스파일에 입력된 한글이 깨지는 문제
 ==> android { ... } 안에 다음 항목 추가
    compileOptions.encoding = '인코딩문자열'

==> 인코딩문자열은 java 소스파일과 같은 인코딩으로


 2) 복수 프로젝트 구조

  (1) Gradle에 Android SDK 경로 설정

 ==> 단일 프로젝트와 동일

  (2) 프로젝트 홈 디렉토리에 build.gradle 파일 생성
  • 직접 파일을 생성할 경우 프로젝트별로 각각 Gradle 파일을 생성해야 한다.
  • 프로젝트 Export 기능에서 제공하는 "Generate Gradle build files" 기능을 사용하여 생성시 메인 프로젝트만 선택하면 메인 프로젝트에서 참조하는 android library project를 자동으로 인지하여 선택하게 하며 참조된 프로젝트들 각각에 build.gradle 파일을 생성한다.

  (3) 메인 프로젝트 홈 디렉토리에 settings.gradle 파일 생성
  • android library project를 사용하는 복수 프로젝트 구조에서는 사용하는 library 프로젝트를 include하여야 한다. 해당 기능은 Eclipse Export 기능에서 생성되지 않는다.
  • eclipse에서 사용하는 프로젝트 방식에서는 메인 프로젝트와 라이브러리 프로젝트가 모두 workspace 하위에 동일한 레벨의 경로에 위치한다. 이럴 경우 gradle에서는 라이브러리 프로젝트를 못 찾는 문제가 발생하며 이를 해결하기 위해 "projectDir"로 프로젝트 홈 경로를 지정해주어야 한다.
 ==> 프로젝트 디렉토리 구조
 - workspace
     - MainProject
     - LibProject1
     - LibProject2

==> setting.properties 설정 예
 include ':LibProject1', ':LibProject2'
 project(':LibProject1').projectDir = new File("../LibProject1");
 project(':LibProject2').projectDir = new File("../LibProject2");

 5. 빌드 및 기타 기능 추가

 1) 빌드
  • 메인 프로젝트 홈 디렉토리에서 gradle [task 이름]형식으로 빌드
 ==> gradle build
 ==> gradle clean build
 ==> gradle build --daemon

 2) signed apk 설정
  • 메인 프로젝트의 build.gradle에 signing 설정 추가
 ==> android { ... } 안에 다음 항목 추가 : keystore경로는 keystore파일의 실제 경로를 프로젝트 홈 기준 상대경로로 지정하고 별칭은 프로젝트 영문이름을 사용


     signingConfigs {
          release {
              storeFile file("keystore경로")
              storePassword "notYourRealPassword"
              keyAlias "별칭"
              keyPassword "notYourRealPassword"
         }
     }
     
     buildTypes {
        release {
            signingConfig signingConfigs.release
        }
    }


 ==> password 입력 task 추가


task askForPasswords << {
    def storePw = new String(System.console().readPassword("Keystore password: "))
    def keyPw  = new String(System.console().readPassword("Key password: "))

    android.signingConfigs.release.storePassword = storePw
    android.signingConfigs.release.keyPassword = keyPw
}

tasks.whenTaskAdded { theTask -> 
    if (theTask.name.equals("packageRelease")) {
        theTask.dependsOn "askForPasswords"
    }
}


댓글 없음:

댓글 쓰기