"APK META-INF / * 'de kopyalanan yinelenen dosyalar" sorununu nasıl çözebilirim?


91

Ticari bir android uygulamasında çalışıyorum. Ayrıca, farklı lisans türleri altında lisanslanmış bazı kütüphaneleri kullanıyorum, bunlardan bazıları şu şekildedir:

Kitaplıkta atıf notlarının bulunduğu bir "NOTICE" dosyası varsa, dağıtım yaparken bu BİLDİRİMİ eklemeniz gerekir

(Örneğin, biri Apache Lisans 2.0 altında lisanslanmıştır ).

Birden fazla kütüphane var. Birlikte yapı yaptığınızda gradle veya Android Studio aşağıdaki yapı hatasıyla edinin:

* 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

Şimdiye kadar internette ve stackoverflow'da bulduğum yanıtlar build.gradle, aşağıdakileri dosyaya ekleyerek license.txt'yi (notice.txt veya buna benzer başka dosyalar) paketten kaldırmayı önerir :

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

Örneğin bkz .: Android Studio 0.4 APK META-INF / LICENSE.txt dosyasında kopyalanan yinelenen dosyalar

Bu kitaplıkların lisansına göre ( örneğin Apache License 2.0 ), lisans ve bildirim dosyaları dahil edilmelidir .

Sorum: Lisanslarla uyumlu olmak için lisanslama ile ilgili birden fazla dosyayı ( lisans.txt , not.txt vb.) Gradle'dan projeme nasıl ekleyebilirim ( teknik detay: lisans metinleri birleştirilecek)?


2
Teknik bir bakış açısıyla, her kitaplığın tüm "içermesi gereken" dosyaları kendi dizinlerinde olacak şekilde bir şeyleri paketleyemez misiniz? Bazı uygulamalarda gördüğüm bir alternatif, tüm ilgili lisans / bildirim dosyalarını tek bir kaynakta (manuel olarak) birleştirmeniz ve bunu eklemeniz / görüntülemenizdir (iki veya daha fazla kitaplığın aynı lisans sürümünü paylaştığı durumlarda, bunları gruplayabilmelisiniz) , "Kitaplık A ve Kitaplık B, aşağıdaki lisansa tabidir: ...").
TripeHound

@TripeHound, şu anda bir geçici çözüm olarak yaptığım şey, geliştirme sürecinde onları hariç tutuyorum ve yayınlama söz konusu olduğunda: tüm 'dışlananları' yorumlayın ve lisansları manuel olarak çözün.
Flowryn

1
"paketlemeSeçenekleri - hariç tut" yanıtını aramak olumlu oyu hak ediyor
Ahmed Adel İsmail

Yanıtlar:


47

Adı kullanan yalnızca bir lisansınız varsa bir çözüm vardır license.txt(okuyun: tüm license.txtkopyalar aynıdır):

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

Aksi takdirde Google, bağımlılık lisanslarını yönetmek için bir Gradle eklentisi yayınladı. Buraya bakın . Denemedim, ancak her bağımlılığı bir araya getirebilecek ve hatta tüm bu lisansları gösteren bir etkinlik oluşturabilecek gibi görünüyor.


1
Şu anda 2 lisansım var, biri Apache 2.0'dan, diğeri GPL 3.0. Mevcut çözümüm, geliştirme aşamasında bunları dışlamak ve piyasaya sürdüğümüzde manuel olarak dahil etmektir. Tüm license.txt birleştirilecektir. Notice.txt için de aynı Neyse, lisansın aynı olması durumunda pickFirst ile yaklaşımınızı beğendim!
Flowryn

3
Lisansları otomatik olarak birleştirmenin bir yolunu bulursanız, tamamen kulağım!
Marc Plano-Lesay

Şu an araştırdığım şey bu. Öncelikle, çatışmaya neden olan kademeli görevin ne (ve nasıl) yaptığını bulmam gerekiyor (bunun için şu soruyu sordum: stackoverflow.com/questions/34287701/… ) Ve sonra onu değiştirin
Flowryn

@Flowryn tüm notice.txt dosyasını manuel olarak nasıl eklersiniz, bunları bir notice.txt dosyasında kopyalamanız yeterli mi? jardosyada hangisi değiştirilemiyor
chinaanihchen

sorunun kullanılan kütüphanelerde olduğunu söylüyorsunuz ... benim durumumda, kullandığım kütüphaneleri oluşturmaktan ben sorumluyum ... Onları yaparken neyi yanlış yapıyor olabilirim? Teşekkürler
Eric

32

İlgili build.gradle dosyasına aşağıdakileri ekleyin

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
Çoğu için açıkça kendi koşullarına aykırı olan lisanslar buna dahil değildir.
Marc Plano-Lesay

1
Bu, Gradle'ın geçerli (2. *) sürümleri için android {} kapanışında olmalıdır
mijiturka

4

Başvurumda da aynı sorunla karşılaştım. İki kez kitaplık eklemediğinizden emin olmanız gerekir. Firebase belgelerini https://firebase.google.com/docs/android/setup izlediyseniz

O zaman android stüdyo içerisine firebase kitaplığı eklememelisiniz, yani dosya-> proje yapısı-> bulut-> firebase

Android uygulamanızda firebase kullanmak için her ikisinden de yalnızca birini yapmanız gerekir.

Sonunda uygulamanızı temizleyin ve yeniden çalıştırın.


2
Jackson-databind kullanıyorsanız, sorunu bir kez eklediğinizde alırsınız.
inanılmaz


0

Build.gradle'da yalnızca şu seçenekleri eklemeniz gerektiğini düşünüyorum:

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

Elbette işe yarayacak

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

1
Hayır, olmayacak: bu lisansları kapsamaz. Söz konusu lisans koşullarına göre yasa dışıdır.
Marc Plano-Lesay

Bir projenin anında derlenmesi için tmp çözümü yok
Mahendran Candy

1
Kullanım şekli ne olursa olsun, lisansları okuyun: bunların büyük çoğunluğu için, hariç tutma kuralınızla elde ettiğiniz şey yasa dışıdır.
Marc Plano-Lesay
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.