Bagaimana cara menyelesaikan "File duplikat yang disalin dalam APK META-INF / *"

91

Saya bekerja di aplikasi android komersial. Saya juga menggunakan beberapa pustaka yang dilisensikan dengan jenis lisensi yang berbeda, beberapa di antaranya menyatakan sebagai berikut:

Jika perpustakaan memiliki file "PEMBERITAHUAN" dengan catatan atribusi, Anda harus menyertakan PEMBERITAHUAN itu saat Anda mendistribusikan

(Salah satunya berlisensi di bawah Lisensi Apache 2.0 misalnya).

Ada lebih dari satu perpustakaan. Ketika saya melakukan build dengan gradle atau dengan Android Studio, saya mendapatkan error build berikut:

* 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

Jawaban yang saya temukan sampai sekarang di internet dan stackoverflow menyarankan untuk menghapus license.txt (notice.txt atau file lain yang dapat mengganggu seperti ini) dari pengemasan dengan menambahkan ke build.gradlefile berikut:

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

Lihat misalnya: Android Studio 0.4 File duplikat yang disalin dalam APK META-INF / LICENSE.txt

Menurut lisensi pustaka tersebut ( Apache License 2.0 misalnya), file lisensi dan pemberitahuan harus disertakan .

Pertanyaan saya: Bagaimana saya dapat menambahkan beberapa file terkait dengan lisensi (seperti license.txt , notice.txt dll) dari gradle ke dalam proyek saya agar sesuai dengan lisensi ( detail teknis: teks lisensi akan digabungkan)?

Flowryn
sumber
2
Dari POV teknis, dapatkah Anda tidak memaketkan sesuatu sehingga semua file "harus menyertakan" dari setiap pustaka ada di direktorinya sendiri? Alternatif yang pernah saya lihat dengan beberapa aplikasi adalah Anda (secara manual) menggabungkan semua file lisensi / pemberitahuan masing-masing ke dalam satu sumber daya dan menyertakan / menampilkan ini (di mana dua atau lebih pustaka berbagi versi lisensi yang sama, Anda harus dapat mengelompokkannya , "Library A dan Library B disertakan dengan tunduk pada lisensi berikut: ...").
TripeHound
@TripeHound inilah yang saat ini saya lakukan sebagai solusi, sementara dalam proses pengembangan saya mengecualikannya dan ketika harus merilis: komentari semua 'tidak termasuk' dan selesaikan lisensi secara manual.
Flowryn
1
mencari jawaban "packagingOptions - exclude" layak mendapat upvote
Ahmed Adel Ismail

Jawaban:

47

Ada solusi jika Anda hanya memiliki satu lisensi menggunakan nama license.txt(baca: semua license.txtsalinan identik):

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

Jika tidak, Google juga merilis plugin Gradle untuk mengelola lisensi dependensi. Lihat disini . Saya tidak mencobanya, tetapi sepertinya itu mampu menggabungkan setiap ketergantungan, dan bahkan menghasilkan aktivitas yang menampilkan semua lisensi tersebut.

Marc Plano-Lesay
sumber
1
Saya memiliki 2 lisensi saat ini, satu dari Apache 2.0 yang lainnya GPL 3.0. Solusi saya saat ini adalah mengecualikannya saat dalam fase pengembangan dan secara manual menyertakannya saat kami merilis. Semua license.txt akan digabungkan. Sama untuk notice.txt Bagaimanapun saya suka pendekatan Anda dengan pickFirst jika lisensinya identik!
Flowryn
3
Jika Anda pernah menemukan cara untuk menggabungkan lisensi secara otomatis, saya mendengarkan!
Marc Plano-Lesay
Inilah yang saya selidiki sekarang. Pertama saya perlu mencari tahu apa (dan bagaimana) melakukan tugas gradle yang menghasilkan konflik (untuk itu saya mengajukan pertanyaan ini: stackoverflow.com/questions/34287701/… ) Dan kemudian menggantinya
Flowryn
@Flowryn bagaimana Anda menyertakan semua notice.txt secara manual, cukup salin dalam satu notice.txt? tidak dapat memodifikasinya yang dalam jarfile
chinaanihchen
Anda menyebutkan bahwa masalahnya ada di perpustakaan yang digunakan ... dalam kasus saya, saya bertanggung jawab untuk membuat perpustakaan yang saya gunakan .. kesalahan apa yang mungkin saya lakukan saat membuatnya? Terima kasih
Eric
32

Tambahkan mengikuti ke file build.gradle masing-masing

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'
    }
Max Droid
sumber
1
Ini tidak termasuk lisensi yang, bagi kebanyakan dari mereka, secara eksplisit bertentangan dengan ketentuan mereka.
Marc Plano-Lesay
1
Ini harus ada dalam penutupan {} android untuk versi Gradle saat ini (2. *)
mijiturka
4

Saya menghadapi masalah yang sama dengan aplikasi saya. Anda perlu memastikan bahwa Anda tidak menambahkan perpustakaan apa pun dua kali. Jika Anda telah mengikuti dokumentasi firebase https://firebase.google.com/docs/android/setup

Maka Anda tidak boleh menambahkan firebase library di dalam android studio ie file-> project structure-> cloud-> firebase

Anda hanya perlu melakukan salah satu dari keduanya, untuk menggunakan firebase di aplikasi android Anda.

Pada akhirnya, bersihkan dan jalankan kembali aplikasi Anda.

aMighty
sumber
2
Jika Anda menggunakan jackson-databind Anda mendapatkan masalah saat Anda menambahkannya sekali.
Tanggal
0

Anda dapat menambahkan beberapa lisensi di gradle lihat ini

Akhil Jayakumar
sumber
0

Saya pikir Anda hanya perlu menyertakan opsi ini di 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'
    }
}
S.sadham hussain
sumber
-2

Pasti itu akan berhasil

packagingOptions {
 exclude 'META-INF/LICENSE.txt'
 exclude 'META-INF/NOTICE.txt'   }
Permen Mahendran
sumber
1
Tidak, tidak akan: ini tidak termasuk lisensi. Itu ilegal menurut persyaratan lisensi tersebut.
Marc Plano-Lesay
Bukan solusi tmp untuk kompilasi instan proyek
Permen Mahendran
1
Apa pun penggunaannya, baca lisensinya: untuk sebagian besar dari mereka, apa yang Anda capai dengan aturan pengecualian Anda adalah ilegal.
Marc Plano-Lesay