"APK META-INF / *에 복사 된 중복 파일"을 해결하려면 어떻게해야합니까?


91

저는 상용 안드로이드 애플리케이션에서 일하고 있습니다. 또한 다른 라이센스 유형에 따라 라이센스가 부여 된 일부 라이브러리를 사용하고 있습니다.

라이브러리에 속성 메모가있는 "NOTICE"파일이있는 경우 배포 할 때 해당 NOTICE를 포함해야합니다.

(그 중 하나는 예를 들어 Apache License 2.0 에 따라 사용이 허가되었습니다 .)

둘 이상의 라이브러리가 있습니다. 내가 함께 빌드 작업을 수행 할 때 Gradle을 하거나 함께 안드로이드 스튜디오 나는 다음과 같은 빌드 오류를 얻을 :

* What went wrong:
Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'.
> com.android.build.api.transform.TransformException: com.android.builder.packaging.DuplicateFileException: Duplicate files copied in APK META-INF/license.txt

지금까지 인터넷과 stackoverflow에서 찾은 답변 build.gradle은 다음 을 파일 에 추가하여 패키지에서 license.txt (notice.txt 또는 이와 같이 방해 할 수있는 기타 파일)를 제거 할 것을 제안합니다 .

packagingOptions {
    exclude 'META-INF/DEPENDENCIES.txt'
    exclude 'META-INF/LICENSE.txt'
    exclude 'META-INF/NOTICE.txt'
    exclude 'META-INF/NOTICE'
    exclude 'META-INF/LICENSE'
    exclude 'META-INF/DEPENDENCIES'
    exclude 'META-INF/notice.txt'
    exclude 'META-INF/license.txt'
    exclude 'META-INF/dependencies.txt'
    exclude 'META-INF/LGPL2.1'
}

예 : Android Studio 0.4 APK META-INF / LICENSE.txt에 복사 된 중복 파일

해당 라이브러리 (예 : Apache License 2.0 )의 라이선스에 따라 라이선스 및 알림 파일이 포함 되어야합니다 .

내 질문 : 라이선스 ( 기술 세부 정보 : 라이선스 텍스트가 연결됨)를 준수하기 위해 라이선스 (예 : license.txt , notice.txt 등) 와 관련된 여러 파일 을 gradle에서 프로젝트에 추가하려면 어떻게해야합니까?


2
기술 POV에서 각 라이브러리의 모든 "필수 포함"파일이 자체 디렉토리에 있도록 패키지화 할 수 없습니까? 일부 앱에서 본 대안은 모든 개별 라이선스 / 알림 파일을 하나의 리소스로 (수동으로) 결합하고이를 포함 / 표시하는 것입니다 (두 개 이상의 라이브러리가 동일한 라이선스 버전을 공유하는 경우 그룹화 할 수 있어야 함). , "라이브러리 A 및 라이브러리 B는 다음 라이센스에 따라 포함됩니다 : ...").
TripeHound

@TripeHound 이것은 내가 현재 해결 방법으로 수행하는 작업입니다.
Flowryn 2015

1
답을 찾고 "packagingOptions - 제외되는 것은"는 upvote에 가치가
아메드 아델 이스마일

답변:


47

이름을 사용하는 라이선스가 하나만있는 경우 솔루션이 있습니다 license.txt(읽기 : 모든 license.txt사본이 동일 함).

packagingOptions {
   pickFirst  'META-INF/license.txt'
}

그렇지 않으면 Google은 종속성 라이선스를 관리하는 Gradle 플러그인도 출시했습니다. 를 참조하십시오 여기 . 나는 그것을 시도하지 않았지만 모든 종속성을 집계하고 이러한 모든 라이센스를 표시하는 활동을 생성 할 수있는 것처럼 보입니다.


1
현재 2 개의 라이선스가 있는데 하나는 Apache 2.0이고 다른 하나는 GPL 3.0입니다. 현재 해결 방법은 개발 단계에서 제외하고 출시 할 때 수동으로 포함하는 것입니다. 모든 license.txt가 연결됩니다. notice.txt와 동일 어쨌든 라이센스가 동일한 경우 pickFirst에 대한 접근 방식이 좋습니다!
Flowryn

3
라이센스를 자동으로 연결하는 방법을 찾으신다면, 저는 귀를 기울입니다!
Marc Plano-Lesay 2015

이것이 제가 지금 조사하고있는 것입니다. 먼저 충돌을 일으킨 gradle 작업을 수행하고있는 작업 (및 방법)을 찾아야합니다 (이 질문에 대한 질문 : stackoverflow.com/questions/34287701/… ) 그런 다음 교체
Flowryn

@Flowryn 모든 notice.txt를 수동으로 포함하는 방법은 하나의 notice.txt에 복사합니까? 에있는 수정할 수 없습니다 jar파일
chinaanihchen

사용중인 라이브러리에 문제가 있다고 언급하셨습니다. 제 경우에는 내가 사용중인 라이브러리를 생성해야합니다. 내가 만들 때 뭘 잘못 할 수 있을까요? 감사합니다
에릭

32

각 build.gradle 파일에 다음을 추가하십시오.

packagingOptions {
        exclude 'META-INF/ASL2.0'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/MANIFEST.MF'
    }

1
대부분의 경우 명시 적으로 조건에 위배되는 라이선스는 제외됩니다.
마크 플라 노 - Lesay

1
이것은 현재 (2 *)에 대한 안드로이드 {} 폐쇄에 Gradle을 버전이어야한다
mijiturka

4

내 응용 프로그램에서 동일한 문제에 직면했습니다. 라이브러리를 두 번 추가하지 않았는지 확인해야합니다. firebase 문서 https://firebase.google.com/docs/android/setup을 따른 경우

그런 다음 android studio ie file-> project structure-> cloud-> firebase 안에 firebase 라이브러리를 추가해서는 안됩니다.

Android 애플리케이션에서 firebase를 사용하려면 둘 중 하나만 수행하면됩니다.

마지막에 앱을 정리하고 다시 실행하십시오.


2
jackson-databind를 사용하는 경우 한 번 추가하면 문제가 발생합니다.
놀라운 Jan


0

build.gradle에 다음 옵션 만 포함하면된다고 생각합니다.

android {
    packagingOptions {
        exclude 'META-INF/DEPENDENCIES.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/LICENSE.txt'
    }
}

-2

확실히 작동합니다

packagingOptions {
 exclude 'META-INF/LICENSE.txt'
 exclude 'META-INF/NOTICE.txt'   }

1
아니요, 그렇지 않습니다. 라이선스가 제외됩니다. 상기 라이선스 조건에 따르면 불법입니다.
Marc Plano-Lesay 16. 9.

아니 프로젝트의 컴파일 인스턴트에 대한 TMP 솔루션
Mahendran 캔디

1
사용법이 무엇이든 라이센스를 읽으십시오. 대부분의 경우 제외 규칙으로 달성하는 것은 불법입니다.
Marc Plano-Lesay 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.