Làm cách nào để giải quyết “Tệp trùng lặp được sao chép trong APK META-INF / *”


91

Tôi đang làm việc tại một ứng dụng Android thương mại. Tôi cũng đang sử dụng một số thư viện được cấp phép theo các loại giấy phép khác nhau, một số trong số đó nêu rõ những điều sau:

Nếu thư viện có tệp "THÔNG BÁO" với các ghi chú thuộc quyền, bạn phải gửi kèm THÔNG BÁO đó khi phân phối

(Một trong số chúng được cấp phép theo Giấy phép Apache 2.0 chẳng hạn).

Có nhiều hơn một thư viện. Khi tôi xây dựng với gradle hoặc với Android Studio, tôi gặp lỗi xây dựng sau:

* 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

Các câu trả lời mà tôi tìm thấy cho đến bây giờ trên internet và stackoverflow đề xuất loại bỏ license.txt (văn bản thông báo.txt hoặc các tệp khác có thể gây trở ngại như thế này) khỏi đóng gói bằng cách thêm vào build.gradletệp sau:

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'
}

Xem ví dụ: Android Studio 0.4 Tệp trùng lặp được sao chép trong APK META-INF / LICENSE.txt

Theo giấy phép của các thư viện đó ( Ví dụ: Giấy phép Apache 2.0 ), giấy phép và tệp thông báo phải được bao gồm .

Câu hỏi của tôi: Làm thế nào tôi có thể thêm nhiều file liên quan đến việc cấp phép (như license.txt , notice.txt vv) từ gradle vào dự án của tôi để đảm bảo phù hợp với giấy phép ( chi tiết kỹ thuật: giấy phép văn bản sẽ được nối)?


2
Từ một POV kỹ thuật, bạn có thể không đóng gói mọi thứ để tất cả các tệp "phải bao gồm" của mỗi thư viện nằm trong thư mục riêng của chúng? Một giải pháp thay thế mà tôi đã thấy với một số ứng dụng là để bạn (theo cách thủ công) kết hợp tất cả các tệp giấy phép / thông báo tương ứng vào một tài nguyên và bao gồm / hiển thị tài nguyên này (trong đó hai hoặc nhiều thư viện chia sẻ cùng một phiên bản giấy phép, bạn có thể nhóm chúng , "Thư viện A và Thư viện B được bao gồm theo giấy phép sau: ...").
TripeHound

@TripeHound đây là những gì tôi hiện đang làm như một giải pháp thay thế, trong khi trong quá trình phát triển, tôi loại trừ chúng và khi phát hành: nhận xét tất cả 'loại trừ' và giải quyết các giấy phép theo cách thủ công.
Flowryn

1
tìm kiếm câu trả lời "packagingOptions - loại trừ" xứng đáng một upvote
Ahmed Adel Ismail

Câu trả lời:


47

Có một giải pháp nếu bạn chỉ có một giấy phép sử dụng tên license.txt(đọc: tất cả các license.txtbản sao đều giống nhau):

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

Mặt khác, Google cũng phát hành một plugin Gradle để quản lý giấy phép phụ thuộc. Xem tại đây . Tôi đã không thử nó, nhưng có vẻ như nó có khả năng tổng hợp mọi phụ thuộc và thậm chí tạo ra một hoạt động hiển thị tất cả các giấy phép đó.


1
Tôi có 2 giấy phép tại thời điểm này, một là từ Apache 2.0, một là GPL 3.0. Cách giải quyết hiện tại của tôi là loại trừ chúng trong giai đoạn phát triển và đưa chúng vào theo cách thủ công khi chúng tôi phát hành. Tất cả license.txt sẽ được nối với nhau. Tương tự đối với notification.txt Dù sao tôi cũng thích cách tiếp cận của bạn với pickFirst trong trường hợp giấy phép giống hệt nhau!
Flowryn

3
Nếu bạn từng tìm ra cách để tự động nối các giấy phép, thì tôi không sao cả!
Marc Plano-Lesay

Đây là những gì tôi đang điều tra bây giờ. Trước tiên, tôi cần tìm hiểu xem (và cách) thực hiện nhiệm vụ gradle đã tạo ra xung đột (vì điều đó tôi đã hỏi câu hỏi này: stackoverflow.com/questions/34287701/… ) và sau đó thay thế nó
Flowryn

@Flowryn làm thế nào bạn bao gồm tất cả văn bản thông báo theo cách thủ công, chỉ cần sao chép chúng trong một văn bản báo cáo? không thể sửa đổi nó mà trong jartập tin
chinaanihchen

bạn đề cập rằng vấn đề nằm ở các thư viện đang được sử dụng ... trong trường hợp của tôi, tôi chịu trách nhiệm tạo các thư viện mà tôi đang sử dụng.. Tôi có thể làm gì sai khi tạo chúng? Cảm ơn
Eric

32

Thêm phần sau vào tệp build.gradle tương ứng

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
Điều này loại trừ các giấy phép, đối với hầu hết chúng, rõ ràng là chống lại các điều kiện của chúng.
Marc Plano-Lesay

1
Điều này cần được trong việc đóng cửa {} android cho hiện tại (2. *) phiên bản của Gradle
mijiturka

4

Tôi phải đối mặt với vấn đề tương tự với ứng dụng của mình. Bạn cần đảm bảo rằng bạn chưa thêm bất kỳ thư viện nào hai lần. Nếu bạn đã làm theo tài liệu firebase https://firebase.google.com/docs/android/setup

Sau đó, bạn không nên thêm thư viện firebase bên trong studio android tức là tệp-> cấu trúc dự án-> đám mây-> firebase

Bạn chỉ phải làm một trong cả hai, để sử dụng firebase trong ứng dụng Android của bạn.

Cuối cùng, hãy làm sạch và chạy lại ứng dụng của bạn.


2
Nếu bạn sử dụng jackson-databind, bạn sẽ gặp sự cố khi thêm nó một lần.
Điều đáng kinh ngạc ngày


0

Tôi nghĩ rằng bạn chỉ cần bao gồm các tùy chọn này trong 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

Chắc chắn nó sẽ hoạt động

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

1
Không, sẽ không: điều này không bao gồm giấy phép. Đó là bất hợp pháp theo các điều khoản giấy phép đã nói.
Marc Plano-Lesay

Không nó một giải pháp tmp cho ngay lập tức soạn thảo một dự án
Mahendran Kẹo

1
Dù cách sử dụng là gì, hãy đọc các giấy phép: đối với phần lớn chúng, những gì bạn đạt được với quy tắc loại trừ của mình là bất hợp pháp.
Marc Plano-Lesay
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.