programing

하위 프로젝트로 Android Gradle 빌드

projobs 2021. 1. 14. 08:00
반응형

하위 프로젝트로 Android Gradle 빌드


현재 프로젝트 중 하나를 maven에서 Gradle로 변환하는 중입니다. 폴더 구조는 다음과 같습니다.

gitRoot
    settings.gradle
    build.gradle
    ProjectA
        build.gradle
        src/main/java
    Libraries
        SomeLib (git submodule)
        ProjectBRoot (git submodule)
            settings.gradle
            build.gradle
            ProjectB
                build.gradle
                src/main/java
            Libraries
                FacebookSDK/facebook
                    build.gradle
                    src

그래서 이미 복잡해 보입니다. 그러나 아이디어는 ProjectB가 라이브러리 프로젝트이며 별도로 빌드하고 패키지화 할 수 있어야한다는 것입니다. 그래서 자체 settings.gradle이 있고 제대로 작동하는 것 같다고 말할 수있는 한 빌드가 있습니다. 그리고 그것의 페이스 북을 찾는 것은 괜찮습니다.

ProjectB / build.gradle에는 다음 줄이 포함됩니다.

compile project(':libraries:facebook-android-sdk:facebook')

ProjectBRoot / settings.gradle에는 다음 줄이 포함됩니다.

include ':ProjectB', ':libraries:facebook-android-sdk:facebook'

gitRoot / settings.gradle에는 다음 줄이 포함됩니다.

include ':ProjectA', ':Libraries:ProjectBRoot:ProjectB'

ProjectA / build.gradle에는 다음 줄이 포함됩니다.

compile project(':Libraries:ProjectBRoot:ProjectB')

빌드를 실행할 때이 오류가 발생합니다.

The TaskContainer.add() method has been deprecated and is scheduled to be removed in Gradle 2.0. Please use the create() method instead.

FAILURE: Build failed with an exception.

* Where:
Build file '/gitRoot/Libraries/ProjectBRoot/ProjectB/build.gradle' line: 17

* What went wrong:
A problem occurred evaluating project ':Libraries:ProjectBRoot:ProjectB'.
> Project with path ':libraries:facebook-android-sdk:facebook' could not be found in project ':Libraries:ProjectBRoot:ProjectB'.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 4.652 secs

그래서 내 생각에 잘못된 점은 페이스 북이 ProjectB의 직접 하위 폴더에 있지 않다는 것입니다 ...하지만 ProjectBRoot 내에서 빌드 할 때는 중요하지 않습니다. 이것은 아마도 ProjectBRoot / gradle.build를 통하지 않고 ProjectB를 직접 참조하고 있지만 시도했지만 작동하지 않았기 때문일 것입니다. 누군가 나를 도울 수 있습니까? 문서를 살펴 보았고 자체 settings.gradle 파일이있는 여러 프로젝트에 대해 이야기하지 않았으며 그것이 나를 엉망으로 만드는 것이라고 생각합니다.

최신 정보:

그래서 Xav의 대답을 따랐고 이제 명령 줄로 빌드 할 수 있지만 Android 스튜디오로 가져 오기 / 빌드 할 수 없습니다. 나는 문제가 여전히 facebook 프로젝트에 있다는 것을 알고 있습니다. 내가 얻는 오류는 ProjectB를 구성 할 수 없다는 것입니다.

 Gradle: A problem occurred configuring project ':ProjectA'.
   > Failed to notify project evaluation listener.
     > A problem occurred configuring project ':Libraries:ProjectBRoot:ProjectB'.
       > Failed to notify project evaluation listener.
         > Configuration with name 'default' not found.

오류는 라인으로 인해 발생합니다.

 compile project(':facebook-sdk')

ProjectB / build.gradle 내부


settings.gradle은 모든 모듈을 정의해야합니다. 더 많은 모듈을로드하기 위해 트리에있는 다른 settings.gradle을로드하지 않습니다.

당신은

  1. 최상위 settings.gradle에서 facebook SDK에 대한 모듈을 정의합니다. 예, 다른 settings.gradle과 중복됩니다.

  2. 프로젝트 B (이 경우에는 facebook SDK 라이브러리와 같은 종속성)를 어딘가 (예 : 기업 아티팩트 저장소)에 게시하고 프로젝트 A에서 액세스합니다.

# 1이 더 좋지만 사용되는 settings.gradle에 따라 경로가 달라 지므로 ProjectB-> Facebook 종속성이 까다로워집니다. 이를 해결하는 한 가지 방법은 모듈 이름 / 경로를 디스크의 실제 위치에서 분리하는 것입니다. 이는 settings.gradle 파일 내에서 수행됩니다.

최상위 settings.gradle 파일에서

include 'facebook-sdk'
project(':facebook-sdk').projectDir = new File('Libraries/ProjectBRoot/Libraries/FacebookSDK/facebook')

프로젝트 B 내의 setting.gradle 파일에서 다른 상대 경로로 동일하게 수행하십시오.

include 'facebook-sdk'
project(':facebook-sdk').projectDir = new File('Libraries/FacebookSDK/facebook')

이렇게하면 두 프로젝트 설정이 디스크의 동일한 절대 위치에있는 동일한 'facebook-sdk'모듈을 정의합니다.

이 모듈에 의존하는 모든 프로젝트는 종속성을 다음과 같이 선언해야합니다.

compile project(':facebook-sdk') 

이것은 당신이 찾고있는 답이 아니지만 ...

내 복잡한 프로젝트 구조 (실제로는 당신과 매우 유사)를 Gradle로 마이그레이션하는 데 약 4 일을 보냈습니다. 결국, 전체 하위 프로젝트 개념을 버리고 (제 경우에는 작동하지 않았기 때문에)이 기사에 설명 된대로 로컬 메이븐 저장소 접근 방식을 사용하기로 결정했습니다. http : //www.flexlabs .org / 2013 / 06 / using-local-aar-android-library-packages-in-gradle-builds

따라서 하위 프로젝트가있는 라이브러리 프로젝트에서 기본적으로 각 프로젝트에 대해 완전한 라이브러리 프로젝트를 만든 다음 위의 링크를 사용하여 메이븐 로컬 저장소에 게시했습니다. 그런 다음 상위 프로젝트에서 하위 프로젝트에 대한 모든 참조를 제거하고 종속성에서 게시 된 라이브러리를 참조했습니다. 그런 다음 주 프로젝트에서 하위 프로젝트에 대한 모든 참조를 제거하고 게시 된 Maven 로컬 버전의 라이브러리를 참조했습니다.

결국 모든 것이 잘 작동하지만 모든 것을 변환하는 데 시간이 걸립니다. 나는 하위 프로젝트, 그 하위 프로젝트 등이있는 약 6 개의 라이브러리 프로젝트를 가지고 있었고 이제 모든 것이 잘 작동합니다.

Gradle 및 Maven과 같은 시스템에 대해 내가 싫어하는 점은 코드 / 프로젝트를 "어떻게"구성할지 변경하기를 기대한다는 것입니다. 따라서 Gradle로 마이그레이션하는 것이 아니라 Gradle로 시작하는 경우 프로세스가 매우 실망 스러울 수 있습니다. 그래도 알아 내면 다음 번이 훨씬 쉽습니다.)


라이브러리가 모두 동일한 수준에있는 앱만 있으면됩니다. 여전히 build.gradle 파일을 기반으로 각 라이브러리를 빌드하고 패키징 할 수 있습니다. 뭔가 빠졌을 수도 있지만 구조는 build.gradle 파일에있는 것만 큼 중요하지 않습니다. 동일한 폴더 수준에 있더라도 여전히 projectB가 Facebook에 종속되도록 할 수 있습니다.


같은 문제가 있었는데, 제 경우에는 settings.gradle. 그 후 작동했습니다.


마침내 프로젝트를 빌드했습니다 (gradle 오류 없음). Xavier의 답변이 매우 도움이되었습니다.

내 프로젝트를 설정하는 데 거의 3 일을 소비합니다. 거의 완료가되었지만 gradle 빌드 프로세스 (dexDebug)의 마지막 단계에서 예상치 못한 최상위 예외가 발생했습니다.

내 프로젝트 설정은 Stoyan과 매우 유사하지만 Android 지원 라이브러리를 참조하는 여러 Android 라이브러리 프로젝트가 있습니다. 상위 루트 프로젝트를 컴파일하는 데 문제가있는 경우 (Android 지원이 이미 추가되었다는 오류) jar를 별도의 Android 라이브러리 프로젝트로 이동해야하는 것보다 (분해 / 분리하여 독립형 인스턴스로 분리) 제안합니다.

--| ProjectARoot
--| ProjectA (where main/java etc are)
  --| build.gradle
--| settings.gradle
--| libraries
  --| ProjectBRoot
    --| settings.gradle
    --| ProjectB
    --| libraries
       --| android-supports (android lib project)
         --| libs
           --| android-support-v4.jar
           --| android-support-v13.jar
         --| build.gradle
       --| libA
         --| build.gradle (referencing android-supports)'

android 지원 프로젝트를 참조하는 libA에 대한 예제 빌드 스크립트

buildscript {
  repositories {
      maven { url 'http://repo1.maven.org/maven2' }
  }
  dependencies {
      classpath 'com.android.tools.build:gradle:0.4'
  }
}
apply plugin: 'android-library'

dependencies {
  compile project(':android-support')
}

android {
  compileSdkVersion 17
  buildToolsVersion "17.0.0"

  defaultConfig {
      minSdkVersion 7
      targetSdkVersion 17
  }
}

// 최상위 루트 설정 .gradle

include 'ProjectB', 'android-support', ':ProjectA' (notice Project B is first than android-support and lastly Project A)

project(':android-support').projectDir = new File('libraries/ProjectBRoot/libraries/android-support')
project(':ProjectB').projectDir = new File('libraries/ProjectBRoot/ProjectB')

현재 gradle 빌드를 실행할 때이 오류가 발생합니다.

:ProjectA:dexDebug

UNEXPECTED TOP-LEVEL EXCEPTION:
java.lang.IllegalArgumentException: already added: Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat;
at com.android.dx.dex.file.ClassDefsSection.add(ClassDefsSection.java:123)
at com.android.dx.dex.file.DexFile.add(DexFile.java:163)
at com.android.dx.command.dexer.Main.processClass(Main.java:490)
at com.android.dx.command.dexer.Main.processFileBytes(Main.java:459)
at com.android.dx.command.dexer.Main.access$400(Main.java:67)
at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:398)
at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:245)
at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:131)
at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:109)
at com.android.dx.command.dexer.Main.processOne(Main.java:422)
at com.android.dx.command.dexer.Main.processAllFiles(Main.java:333)
at com.android.dx.command.dexer.Main.run(Main.java:209)
at com.android.dx.command.dexer.Main.main(Main.java:174)
at com.android.dx.command.Main.main(Main.java:91)
1 error; aborting
:ProjectA:dexDebug FAILED

ReferenceURL : https://stackoverflow.com/questions/16971375/android-gradle-build-with-sub-projects

반응형