Android/App개발2011. 2. 11. 17:39

원문 : http://www.wakaleo.com/blog/302-android-development-with-maven

당신이 자바개발자고 모바일디바이스용 앱을 작성하고자 한다면 안드로이드는 의심할 여지 없는 최적의 플랫폼이다. 당신이 알고있는 자바기술과 툴등 이미 익숙한 환경에서 접근이 가능하다. 이런 이유로 iPhone이나 iPad용 앱개발보다 접근이 쉽다. 또한 훌룡한 많은 툴들과 기술들을 사용할 수 있다(유닛테스트, 자동빌드, 연속빌드등등)

이 문서는 안드로이드 앱개발에 관한것이 아니다. 자동화된 빌드인프라에 안드로이드프로세스를 통합하는것에 대한 내용을 기술한다. 두개의 시리즈로 나뉘며 첫번째는 안드로이드 빌드프로세스를 메이븐을 통해 자동화하는 법에 대한 내용이고 두번째는 자동화된 테스트와 연속빌드에 대한 내용이다.

안드로이드 개발자는 이클립스를 많이 사용한다. 안드로이드는 훌룡한 이클립스플러그인을 제공하는데 안드로이드개발관련 많은 항목들을 아주 쉽게 사용할 수 있게 해준다. 실시간 안드로이드의 에러체킹과 빌드와 에뮬레이터와 연결하여 테스트하는것까지 가능하다.

그러나 멋진 이클립스플러그인도 빌드프로세스를 자동화하지는 못하고 있고 많은 메이븐의 기능들이 빠져있다(의존성을 선언만으로 관리하는것과 배포프로세스를 클린하는것). 다행히 메이븐플러그인이 존재한다. 다만 이 두가지를 잘 사용하려면 조심해서 써야 한다. 이 문서에서 안드로이드에서 메이븐을 다루는 기본적인 사항에 대한것과 몇가지 팁 그리고 방법에 대해 안내할것이다.

시작하기
먼저 안드로이드 SDK와 이클립스플러그인이 설치되었음을 가정한다. 설치가 안되었다면 먼저 설치후 진행하기 바란다. 정상적으로 환경이 갖추어졌다면 File->New->Android Project를 선택하면 아래 화면이 나타날것이다.

Android and Maven
이클립스는 좋지만 중요한 자바개발프로젝트는 하나의 자동화된 빌드스크립트가 필요하다. 안드로이드가 메이븐과 함께 작업되게 하려면 몇가지 단계의 작업을 해야 한다. 먼저 ANDROID_HOME환경변수를 안드로이드SDK가 설치된 경로로 설정한다.
export ANDROID_HOME=/opt/android-sdk-linux
메이븐 안드로이드 플러그인은 이 환경변수가 필요하다.
또한 settings.xml파일에 안드로이드 플로그인 그룹을 반드시 추가해야 한다. 그러면 커맨드라인에서 안드로이드플러그인을 쉽게 사용할 수 있다.
<pluginGroups>
  <pluginGroup>com.jayway.maven.plugins.android.generation2</pluginGroup> 
</pluginGroups>
안드로이드 AVD Manager에서 emulator를 생성하라. 여기서 입력한 AVD name은 프로젝트설정파일(pom.xml)에서 참조된다.
이제 당신의 프로젝트에서 pom.xml파일을 편집할 차례이다. 간편한 방법은 프로젝트 디렉토리에서 바로 pom.xml파일을 생성하는 것이다. pom.xml파일의 예제를 아래 나타내었다.
<project xmlns="http://maven.apache.org/POM/4.0.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.wakaleo.training.android.qotd</groupId>
  <artifactId>QuoteOfTheDay</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>apk</packaging>
  <name>QuoteOfTheDay</name>
  <dependencies>
    <dependency>
      <groupId>com.google.android</groupId>
      <artifactId>android</artifactId>
      <version>2.2.1</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>com.google.android</groupId>
      <artifactId>android-test</artifactId>
      <version>2.2.1</version>
      <scope>provided</scope>
    </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.8.2</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.hamcrest</groupId>
      <artifactId>hamcrest-all</artifactId>
      <version>1.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.mockito</groupId>
      <artifactId>mockito-all</artifactId>
      <version>1.8.5</version>
      <scope>test</scope>
    </dependency>

  </dependencies>
  <build>
    <sourceDirectory>src</sourceDirectory>
    <testSourceDirectory>test</testSourceDirectory>
    <plugins>
      <plugin>
        <groupId>com.jayway.maven.plugins.android.generation2</groupId>
        <artifactId>maven-android-plugin</artifactId>
        <version>2.6.0</version>
        <configuration>
          <sdk>
            <platform>8</platform>
          </sdk>
          <emulator>
            <avd>em22</avd>
          </emulator>
          <deleteConflictingFiles>true</deleteConflictingFiles>
          <undeployBeforeDeploy>true</undeployBeforeDeploy>
        </configuration>
        <extensions>true</extensions>
      </plugin>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.3.2</version>
      </plugin>
    </plugins>
  </build>
</project>

위 pom.xml에서 중요한 항목이 두가지가 있다. 먼저 packaging타입이 apk인것이다. 이것은 안드로이드애플리케이션임을 나타낸다. dependencies에서 android와 android-test library는 provided로 설정되어 있다. 이 라이브러리는 디바이스에 존재하기 때문에 package에 포함되지 않도록 하게된다. 그리고 default source directory와 test directory를 를 변경하여 안드로이드 이클립스프로젝트 설정과 함께 사용가능해졌다.

이 pom파일은 메이블을 통해 커맨드라인명령으로 안드로이드의 공통된 작업을 할 수 있게 해준다. 예를 들어 애플리케이션을 빌드하는것이 단순해진다. 그냥 mvn clean install을 실행하면 된다. emulator에 deploy하고자 한다면 에뮬레이터를 먼저 띄워야 한다. 커맨드라인에서 띄우려면 mvn android:emulator-start를 실행하면 된다. 에뮬레이터는 1~2분 정도후에 뜨게 된다.
$ mvn android:emulator-start
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building QuoteOfTheDay 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-android-plugin:2.6.0:emulator-start (default-cli) @ qotd ---
[INFO] Android emulator command: /opt/android/android-sdk-mac_x86/tools/emulator -avd em22 
unknown
[INFO] Starting android emulator with script: /var/folders/y+/y+a+wZ-jG6WKHEm9KwnSvE+++TI/-
Tmp-//maven-android-plugin-emulator-start.sh
[INFO] Waiting for emulator start:5000
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 6.836s
[INFO] Finished at: Thu Oct 28 14:34:40 NZDT 2010
[INFO] Final Memory: 8M/81M
[INFO] ------------------------------------------------------------------------

그리고 에뮬레이터에 애플리케이션을 deploy하고 싶다면 mvn android:deploy를 실행하면 된다.
$ mvn android:deploy
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building QuoteOfTheDay 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-android-plugin:2.6.0:deploy (default-cli) @ qotd ---
[INFO] /opt/android/android-sdk-mac_x86/tools/adb [install, -r, /Users/johnsmart/Projects
/Training/android/android-quote-of-the-day/quoteoftheday/target/qotd-0.0.1-SNAPSHOT.apk]
[INFO] 1068 KB/s (13169 bytes in 0.012s)
        pkg: /data/local/tmp/qotd-0.0.1-SNAPSHOT.apk
Success
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 8.537s
[INFO] Finished at: Thu Oct 28 14:35:25 NZDT 2010
[INFO] Final Memory: 8M/81M
[INFO] ------------------------------------------------------------------------

이클립스로 돌아가서
이제 메이븐으로 당신을 안드로이드 앱을 빌드하고 배치할수 있게 되었다. 당신은 이제 이클립스를 이 파티에 초대할 필요가 있다. 프로젝트에 메이븐 기능을 활성화하는 일반적인 방법은 'Maven -> Enable Dependency Management'메뉴를 통해 가능하다. 불행히도 이작업이 불가능할것이다. 이작업을 하려면 m2eclipse Android Integration plugin 를 설치해야 한다. 이 플러그인은 m2eclipse와 Android Eclipse plugin를 연결해주는 역할을 한다. 이 플러그인을 설치하면 'Enable Dependency Management'메뉴가 나타날것이다.
메이븐이 활성화된 안드로이드 프로젝트를 'Run As-> Android Application'메뉴를 통해 실행이 가능해야 한다. 이는 에뮬레이터를 실행하고 애플리케이션을 배치할것이다. 또는 활성화된 애뮬레이터에 바로 배치할것이다.

이제 빌드하고, 배치하고 실행하는 것을 메이븐을 통한것과 이클립스를 통해 모두 가능해졌다. 이제 자동화된 빌드를 위한 문이 열렸다. 그리고 로컬 CI server를 셋업할수 있게 되었다.

다음 시리즈에서는 자동화된 유닌과 테스트를 통합하는것과 허드슨을 사용하여 당신의 안드로이드 프로젝트에 Continuous Integration을 셋업하는 방법에 대해 안내할것이다. 

Trouble shooting...
메이븐을 사용하는 가장 큰 이유는 참조라이브러리들의 관리가 쉽다는 것인데 위 절차대로 수행 후 센트럴레포지트리가 아닌 로컬레포지트리의 라이브러리를 가져오지 못하는 경우가 있을 수 있다.
콘솔에서는 참조를 잘하는데 이클립스에서는 잘 안된다면 바로 메이븐의 설정파일을 이클립스에서 참조하지 않고 있어서 발생하는것으로 생각하면 된다. 이것때문에 하루정도 삽질을 ...

eclipse 환경설정에서 Maven -> Installations에서 Add선택 후 설치한 메이븐 폴더를 지정해주면 된다.


Posted by 삼스

댓글을 달아 주세요

  1. 진저브레드로 업데이트가 되서 플러그인 2.8.4 로 업데이트해야 정확하게 됨. ^^;;

    2011.06.29 16:52 [ ADDR : EDIT/ DEL : REPLY ]
  2. 다른 남자 부르면서 울거면 나한테 이쁘지나 말던지

    2013.07.12 02:57 [ ADDR : EDIT/ DEL : REPLY ]
  3. 당신 매력있어, 자기가 얼마나 매력있는지 모르는게 당신매력이야

    2013.07.17 17:13 [ ADDR : EDIT/ DEL : REPLY ]