2015-01-16 5 views
32

를 컴파일 APK META-INF/종속 복사 된 파일을 중복 : build.gradle안드로이드 스튜디오 : <a href="http://developer.android.com/sdk/installing/migrate.html">http://developer.android.com/sdk/installing/migrate.html</a> 내가 구축</p> <p>, 나는 오류가 있습니다 때 이클립스에서 내 프로젝트를 수출이 링크의 지침을 사용하여 안드로이드 스튜디오에 가져

packagingOptions { 
    exclude 'META-INF/DEPENDENCIES' 
} 

을 추가

Duplicate files copied in APK META-INF/DEPENDENCIES 

검색 한 후, 나는 해결책을 찾을. 그리고 그것은 작동합니다!

그러나 왜이 오류가 있었는지 이해할 수 없으며 그 이유는 무엇입니까? 아무도 설명 할 수 있니?

+1

방금 ​​Android Studio 2.2로 업데이트되었으며이 오류가 발생했습니다. 'META-INF/DEPENDENCIES.txt'를 'META-INF/DEPENDENCIES'로 변경하여 수정되었습니다. –

+0

Android Studio 2.2 이후 나 "META-INF/LICENSE"와 동일한 대신 – aez

+0

이 줄을 추가하면 프로젝트를 빌드 할 때 영원히 중단됩니다. – Dan

답변

33

Android Gradle 빌드에서 같은 경로에 같은 파일을 두 번 이상 출력에 포함 할 수 없습니다. 귀하의 빌드에서 다른 장소에서 오는 두 개의 META-INF/DEPENDENCIES 파일이있었습니다. 응용 프로그램에서이 파일이 전혀 필요하지 않으므로 빌드 시스템에이 파일을 모두 무시하도록 지시하는 것이 가장 간단합니다. 이는 exclude 지시문이하는 것입니다.

빌드 시스템에 중 하나를으로 유지하도록 지시하는 pickFirst 지시문이 있습니다. 그것에 관한 세부 사항은 Android Gradle plugin 0.7.0: "duplicate files during packaging of APK"입니다.

Gradle의 Android 빌드는 중복 파일에 대해 다소 엄격하기 때문에 수명을 단축시킬 수 있습니다. 동일한 Java 클래스를 두 번 이상 포함하면 유사한 문제가 발생합니다. 일반적인 경우에는 "복수 dex 파일 정의"오류가 발생합니다 (Multiple dex files define Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat 참조).

기타 빌드 시스템은 좀 더 관대합니다. 자바에서 클래스 패스에 같은 클래스를 두 번 이상 포함 시키면 (예 : 사용되는 첫 번째 복사본이 사용되는 경우) 그 후에는 무시됩니다. 대부분의 경우 다루기가 쉽지만 몇 가지 문제가 있습니다. 가장 큰 것 중 하나는 파일의 여러 버전이 모르게 빌드에 들어가는 경우 미묘한 오류가 발생할 수 있다는 것입니다. 문제가 무엇인지 파악하기 어려울 수 있습니다. 알아낼 때 일반적으로 원하는 것을 포함하여 최종 출력물을 만드는 순서를 저글링하여 매우 복잡한 문제를 해결할 수 있지만 매우 복잡한 빌드에서는 달성하기 어려울 수 있습니다. 프로젝트에 새 라이브러리를 포함하는 것과 같이 관련없는 일을하는 것은 주문을 뒤엎고 많은 불행을 초래할 수 있습니다.

그런 이유로 Gradle은 중복 문제 해결 게임에서 "수상자"를 결정하기 위해 사물의 순서를 사용하지 않는 철학을 가지고 있으며 개발자가 모든 종속성을 명시 적으로 만들도록 강요합니다. Android가 Gradle 위에 구축 시스템을 구현 한 것은 그 철학을 따릅니다. 스콧 바르 타의 대답은 정확하지만,이다

+0

도움 주셔서 감사합니다.
하지만 왜 내 빌드에 두 개의 META-INF/DEPENDENCIES 파일이 있는지 알 수 없습니다. 메시지가 중복 된 파일이 같은 위치에 있음을 보여줍니다.
' ': packageDebug'작업을 실행하지 못했습니다. APK META-INF에 복사 > 중복 파일/DEPENDENCIES \t 파일 1 : D : \ 연구 \ 안드로이드 \ 안드로이드 스튜디오 \ MyProject를 \ libs와 \ 아파치 mime4j 코어-0.7.2.jar \t 파일 2 : D : \ 연구 \ Android \ AndroidStudio \ MyProject \ libs \ apache-mime4j-core-0.7.2.jar Android Studio에서 자동으로 생성 했습니까? – TrungNVT

+0

사실 그건 좋은 질문입니다. 잘 모르겠습니다. 나는 전에 그것을 보았지만 결코 그것의 바닥에 가려고 시도하지 않았습니다. –

58

간단하고 일반적인 솔루션 부족 : 그냥 그 중복을 무시하도록 build.gradle에

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

를 추가합니다.

+0

Android Studio 2.2.2 (11/2016)에서이 문제가 발생하여 빌드 할 수 없습니다. AnddroidStudio 2.2.2로 업그레이드 한 후 이러한 변경 사항을 추가하면 Gradle이 최종적으로 빌드되고 프로젝트를 실행할 수있었습니다. 필자는 Firebase와 Admobs에 의존합니다. 감사합니다 – raddevus

+0

감사합니다! –

+0

'pickFirst'도'exclude' 대신 작동합니다. 또한 다른 유사한 오류가있는 경우에도 오류를 추가하십시오. 예를 들어,'pickFirst'META-INF/plexus/components.xml''을 추가해야만했습니다. – CorayThan

6

가장 간단한 해결책은 새로운 업로드하는 사람이 이러한 문제를 갖는 경우 안드로이드 섹션에

+0

좋아요! 보통 하위 폴더에는 'pickFirst'META-INF/** ''를 사용할 수 있지만 하위 폴더는 없습니다. –

0

당신의 build.gradle에

packagingOptions { 
    pickFirst 'META-INF/*' 
} 

를 추가하는 것입니다.Android Studio를 업데이트 한 후 Google Play 스토어로 이동합니다. 기존 키 스토어의 새로운 APK를 생성하는 동안

클릭 V1 항아리 서명하지 전체 APK 서명

V1 Jar Signature

enter image description here

1

나는이 문제를 해결하기 위해 찾은 가장 쉬운 방법이다 와일드 카드를 사용하므로 충돌하는 각 파일을 수동으로 선언하지 않아도됩니다.

packagingOptions { 
    pickFirst '**' 
}