Android Studio에서 build.gradle에 외부 프로젝트 추가


140

다음 설정을 사용하여 샘플 프로젝트가 있습니다.

/root
  + Pure Java Lib
  + Android Test Lib
  + Android Test Project

' Test Project '가 ' Test Lib '에 의존하고 마지막이 ' Pure Java Lib ' 에 의존하는 경우 프로젝트를 컴파일 하고이 설정을 시작하면 제대로 작동합니다.

이제 이전 Eclipse 작업 공간을 가져오고 Android 스튜디오에서 작업하는 것에 대해 생각하고 있습니다. 문제는 프로젝트 설정이 다르기 때문에이 방법으로 유지하고 싶습니다.

예를 들어 이전 예제를 사용하는 경우 :

/root
  + Android Test Lib
  + Android Test Project

/Some Other folder (another repository for example)
  + Pure Java Lib

많은 구성을 시도했지만 부모 폴더 범위 밖에서 프로젝트를 참조하는 방법을 찾지 못했습니다 ( 이 예에서는 ' root ').

많은 플랫폼 / 모듈에서 '..'을 사용하여 폴더로 이동할 수는 있지만 이것은 나에게 효과적이지 않습니다. 아마도 잘못 사용했습니다.

누구나 Gradle을 사용하여 이것이 어떻게 달성 될 수 있는지 알고 있습니까?

최신 정보

좀 더 일반적으로 노력하겠습니다.

/C:/

  /Project A
    + Module 1 - Pure Java
    + Module 2 - Android Test Lib
    + Module 3 - Android Test Project

  /Project B
    + Module 1 - Pure Java
    + Module 2 - Pure Java
    + Module 3 - Pure Java

나는의 모듈 1을 사용하고자하는 프로젝트 B , 프로젝트 A를에 .


업데이트 : 09-03-19

나는 이것을보고 지금 업데이트해야한다. 거의 6 년이 지난 지금, 나는 더 현명하다. 그리고 나는 문제가 "진리의 근원"이라는 개념을 오해하고 있다고 말할 수있다.

라이브러리에 대한 하나의 참조를 갖는 것은 개념을 갖는 것이 좋지만 "진리의 근원"처럼 보일 수 있지만, 실제 "진리의 근원"은 각 프로젝트가 해당 라이브러리에서 사용하는 코드의 버전 일 것입니다. 라이브러리 자체에는 버전이 있습니다. 많은 버전에서 "진실의 근원"은 라이브러리를 사용하는 프로젝트와 관련이 있습니다.

올바른 방법은 대부분의 개발자가 싫어하는 것을 사용하는 것이며 git 서브 모듈이며, 각 프로젝트의 소스를 복제하면 각 프로젝트가 다른 버전의 코드를 사용할 가능성이 높습니다.

그러나 모든 프로젝트가 모든 최신 라이브러리 버전을 사용하도록해야합니다. 이는 그 자체로 어려운 문제입니다.

이것이 라이브러리 소스로 프로젝트를 개발하는 올바른 방법 인 이유는이 스케일이기 때문입니다. 각각 자체 라이브러리 구성으로 수백 개의 프로젝트를 가질 수 있습니다.


4
나는이 질문에주의를 기울이는 것을 본다 ... 정말로 열심히 노력한 후에, 내가 구성하려고했던 설정의 복잡성이 너무 많아서 최종 프로젝트를 빌드 할 수 있었기 때문에 Android 스튜디오를 포기했습니다. 그러나 매우 불안정합니다. 안드로이드 스튜디오를 시작할 때마다 매개 변수를 다시 설정하고 빌드를 수동으로 수행해야했습니다. 내가 포기한 지 약 2 개월이 지났고 지금 상황이 나아지기를 바랍니다!
TacB0sS

접근법 2는이 작업을 매우 쉽게 수행하는 방법을 설명합니다 : stackoverflow.com/questions/25610727/…
Doron Ben-Ari

답변:


222

일부 다른 폴더가 gradle 프로젝트라고 가정하면 settings.gradle 파일에 다음과 같은 것을 추가 할 수 있습니다.

include ':module1'
project(':module1').projectDir = new File(settingsDir, '../Project B/Module 1')

1
someOtherFolder는 프로젝트 폴더를 가리키고 그 안에 모듈이 있습니다. 모듈은 Android Lib 프로젝트에 모듈로 추가하고
싶습니다.

설정 디렉토리가 '루트'를 가리 키고 다른 프로젝트의 다른 모듈보다 높은 레벨을 가져와야합니다.
TacB0sS

그 후에 서브 모듈을 추가 할 수 있습니까? ': someOtherFolder : proj1'포함
Ethan

1
몇 가지 세부 사항으로 업데이트되었습니다. settings.gradle은 / Project A
Ethan

5
좋은 대답입니다. AS 1.0.2에서도 다음을 수행해야했습니다. 모듈을 마우스 오른쪽 단추로 클릭-> 모듈 설정 열기-> 종속성-> + (아래)를 선택하고 모듈 종속성을 선택한 후 목록에서 라이브러리를 선택하고 확인 :)
T를

49

파일 설정 을 넣어야 합니다.

include ':module2'
project(':module2').projectDir = new File(settingsDir, '../Project 2/Module2')

그런 다음 의존성 트리 의 builde.gradle (모듈 : app) 을 다음 줄에 추가해야합니다.

implementation project(':module2')

또는 프로젝트 구조 > > 종속성 으로 이동하여 추가를 클릭 하고 3 모듈 종속성 을 선택한 다음 모듈을 선택하십시오.


1
기본 앱에서 라이브러리 클래스를 참조하는 데 문제가있는 경우 라이브러리가 다른 변형으로 제공되기 때문입니다. 따라서 적절한 방식으로 종속성을 지정하십시오 compile project(path: ':library', configuration: 'variant'). 여기에, variant구성 flavorbuildType같은 라이브러리의에 의해 정의 build.gradle파일. 예를 들어, 플레이버 release에서 라이브러리 유형을 빌드하려면 is 입니다. developvariantdevelopRelease
Sevastyan Savanyuk

9

Gradle 1.10에서 (이것이 유효한 다른 버전을 모릅니다) 이것은 여기에 주어진 응답을 기반으로 작성한 것입니다 http://forums.gradle.org/gradle/topics/reference_external_project_as_dependancy

API 라이브러리 프로젝트, 공통 라이브러리 프로젝트 및 기본 앱 프로젝트가 있습니다. 각각은 독립형 개발 프로젝트이며 두 라이브러리는 여러 앱간에 공유되도록되어 있습니다.

공통 프로젝트의 settings.gradle에서 :

def apiLibDir = file('../android-api/android-api-lib')
def rootProjectDescriptor = settings.rootProject
settings.createProjectDescriptor(rootProjectDescriptor, 'android-api-lib', apiLibDir)
include ':android-api-lib'

그런 다음 기본 앱 프로젝트 settings.gradle에서 :

def apiLibDir = file('../android-libs/android-api/android-api-lib')
def rootProjectDescriptor = settings.rootProject
settings.createProjectDescriptor(rootProjectDescriptor, 'android-api-lib', apiLibDir)
include ':android-api-lib'

def commonLibDir = file('../android-libs/android-common/android-common-lib')
settings.createProjectDescriptor(rootProjectDescriptor, 'android-common-lib', commonLibDir)
include ':android-common-lib'

각각의 build.gradle 파일에서 다른 프로젝트 의존성과 마찬가지로 settings.createProjectDescriptor에서 지정한 이름으로 파일을 참조하십시오.

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile project(':android-api-lib')
    compile project(':android-common-lib')
}

이것은 작동하는 것 같습니다. API 라이브러리를 정의하는 여러 DEX 파일에 오류가 발생하지 않았습니다. 모두 동일한 빌드 프로세스의 일부 였고 Gradle이 모든 것을 알아낼만큼 똑똑했기 때문입니다.


2
나는 이것을 계속 시도하지만 문제는 각 라이브러리의 종속성이로드되지 않는 것 같습니다. 따라서 라이브러리를 열면 괜찮아 보이지만 주 앱에서 시도하면 가져온 라이브러리가 모두 사라집니다.
Czechnology

@Czechnology 같은 문제가있었습니다. 해결했습니다. 이 답변에 대한 내 의견보기 : stackoverflow.com/a/29603354/7408927
Sevastyan Savanyuk

9

프로젝트를 마우스 오른쪽 버튼으로 클릭하고- "모듈 설정 열기"를 선택하십시오-왼쪽 창에서 "모듈"을 선택하십시오-상단의 "+"기호를 클릭하십시오- "모듈 가져 오기"를 선택하십시오.

모듈을 가져온 후. 현재 프로젝트의 종속성으로 추가해야합니다.

왼쪽 창에서 "모듈"을 선택된 상태로 유지하고 프로젝트를 클릭하십시오. 이제 종속성 탭으로 이동하여 맨 아래에있는 "+"기호를 클릭하십시오.-세 번째 옵션 인 "모듈 종속성"을 선택하십시오. 프로젝트를 올바르게 가져 오면 현재 프로젝트에 대한 종속성으로 추가 할 수있는 모든 사용 가능한 모듈을 보여줍니다.


이것은 거의 작동합니다 ... 종속성 모듈의 출력이 build.gradle 파일에 추가되지 않아 프로젝트를 빌드 할 수 없습니다.
TacB0sS

gradle을 사용하면 모든 프로젝트를 동일한 루트 폴더에 넣어야한다고 생각합니다. 해봐 추가하려는 프로젝트를 현재 프로젝트와 같은 폴더에 배치하십시오.
Varundroid

안드로이드 스튜디오에서 작업하고 싶다면 ATM이 아닌 ATM을 원합니다. 이것이 작동하는 방법입니다. 내가 따르는 또 다른 대안은 Intellij에서 모든 종속성을 설정하고 프로젝트를 Android Studio로 가져 오는 것입니다.이 작업을 수행하면 Android Studio가 Gradle이 아닌 개미 빌드 시스템을 사용하게됩니다. 도움이 되길 바랍니다. 건배!!
Varundroid

1
@Varundroid에서 해결책은 먼저 Ethan의 답변을 사용하여 독립 실행 형 라이브러리에 대한 참조를 가져 오는 것입니다. 그런 다음 답변을 사용하여 기본 앱의 종속성에 모듈을 추가하십시오. 이를 통해 라이브러리 코드를 복제하지 않고도 여러 앱에서 동일한 라이브러리를 참조 할 수 있습니다.
bcorso


-1

Ethan이 말했듯이 이것을 settings.gradle에 추가하면 외부 프로젝트가 Android Studio에 추가됩니다 (이 예제에서는 상위 폴더에 있음).

project(':../ProjectB/:module1')

그런 다음 프로젝트 중 하나의 종속성으로 추가하려면 해당 프로젝트의 build.gradle에 다음과 같은 다른 종속성으로 추가하십시오 ( 여기에서와 같이 그래픽 으로 수행 할 수도 있음 ).

compile project(':../ProjectB/:module1')
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.