ADT (Android Developer Tool)를 사용하다 보면 중대한 한가지 문제(한가지 뿐이겠냐만은..)가 있습니다. 여러명이 작업을 할 때 한명이 프로젝트를 생성하고 git 레파지토리에 프로젝트를 올린 것을 다른 사람들이 받아서 프로젝트를 세팅할려고 할 때 문제가 발생합니다.

~/work/android-projects/Original

에 소스를 받았다고 하면 ADT 나 Eclipse 는 바로 저 위치에서 프로젝트를 만들 수가 없습니다. 바로 workspace 에 복사를 하던가 import 를 해야 하기 때문이지요. 강제로 같은 곳을 지정해주면 에러가 발생합니다. 이 부분은 정말 많은 구글링을 해봐도 거의 답이 없다는 것이 정설입니다. 많은 사람들이 Eclipse 를 욕합니다. 개발자들이 점점 git 이나 svn 을 이용하면서 IntelliJ 로 이동하는게 다 이유가 있는 것 같습니다. (물론 svn 이나 git 으로 바로 프로젝트를 생성하는 방법이 있기는 있는데 많이 불편합니다)

물론 Command Line 에서는 간단합니다. 'android update project' 명령을 이용하면 쉽게 ant 용 프로젝트로 변경시킬 수가 있고 이대로 공유하면 개발하는데 아무 문제도 없습니다.

그래도 같이 일하는 개발자들이 Command Line 을 좋아할 리가 없으니 IDE 를 이용하는 선에서 협상을 해야 합니다. 결국 답은 Android Studio 가 되겠지요. 그런데 Android Stuido 도 문제가 있습니다. 기존의 Eclipse 기반의 Project 구조를 변경합니다. (기존의 프로젝트를 app 이라는 이름으로 변경하여 구조가 변경됩니다) 이것이 변경되기 때문에 또 Eclipse 개발자가 개발하기 힘듭니다. 즉 정리하자면

  • git 레파지토리에 소스가 있고
  • Eclipse 개발자와 Android Studio 를 이용하는 개발자들 간에 협업을 할 수 있는 프로젝트 구조를 만들어야 함

이 두가지를 만족해야 합니다. 어려워 보이지만 (실제로도 어려웠습니다..) build.gradle 파일을 프로젝트 root 에 만들어주고 Android Studio 에서 'Import Non-Android Studio Project' 로 만들어 주면 됩니다.

build.gradle 파일의 예입니다.

buildscript {

  repositories {
    mavenCentral()
  }

  dependencies {
    classpath 'com.android.tools.build:gradle:+'
  }
}

apply plugin: 'android' 


repositories {

  mavenCentral()
  mavenLocal()
}


dependencies {
  compile fileTree(dir: 'libs' , include: '*.jar')
  compile('com.google.android.gms:play-services:+') {
    exclude group: 'com.android.support', module: 'support-v4'
  }

  compile 'com.android.support:appcompat-v7:+'

  compile project(':aplib_aos')
}

android {

  compileSdkVersion 21
  buildToolsVersion "21.0.1"

  sourceSets {
    debug.setRoot('build-types/debug')
    release.setRoot('build-types/release')

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

}

나머지 부분은 위의 내용을 그대로 써도 되지만 제일 중요한 부분이 바로 dependencies 부분입니다. 이 부분만 자신의 프로젝트에 맞게 구성만 해주시면 됩니다.

dependencies {
  compile fileTree(dir: 'libs' , include: '*.jar')
  compile('com.google.android.gms:play-services:+') {
    exclude group: 'com.android.support', module: 'support-v4'
  }

  compile 'com.android.support:appcompat-v7:+'

  compile project(':aplib_aos')
}

이 부분만 따로 설명을 드리자면 기본적으로 $PROJECT_ROOT 밑의 libs 밑에 있는 jar 파일을 포함시키라는 뜻입니다. 그리고 google-play-service 를 외부 라이브러리로 링크하고 support-library v7 도 외부 라이브러리로 링크하라는 것입니다.

compile project(':aplib_aos')

이 부분이 중요한데 이 부분은 안드로이드 스튜디오의 'File' - 'Import Module' 명령을 이용해서 외부의 라이브러리 프로젝트를 포함시킨 경우에 그 라이브러리 모듈이름을 적어 주는 부분입니다. 위 명령을 이용하면 자동으로 settings.gradle 파일에 어떤 모듈이 포함됐는지 쓰여집니다.

모바일 개발자가 혼자 일하는 상황이면 사실 이런 경우는 전부 삽질일것입니다. 그러나 레파지토리에 소스를 옮겨서 관리하는 경우도 그렇고 한번 내려 받은 소스를 이용해서 다시 프로젝트를 구성하는 경우에는 항상 발생하는 문제일 것이라 생각해서 정리해 둡니다.




+ Recent posts