ฉันจะแก้ไข“ ไฟล์ที่ซ้ำกันที่คัดลอกใน APK META-INF / *” ได้อย่างไร


91

ฉันกำลังทำงานกับแอปพลิเคชัน Android เชิงพาณิชย์ ฉันกำลังใช้ไลบรารีบางแห่งที่ได้รับอนุญาตภายใต้ใบอนุญาตประเภทต่างๆซึ่งบางแห่งระบุดังต่อไปนี้:

หากไลบรารีมีไฟล์ "NOTICE" พร้อมบันทึกแสดงแหล่งที่มาคุณต้องใส่ NOTICE นั้นเมื่อคุณแจกจ่าย

(หนึ่งในนั้นได้รับอนุญาตภายใต้Apache License 2.0เป็นต้น)

มีห้องสมุดมากกว่าหนึ่งแห่ง เมื่อฉันสร้างด้วยgradleหรือด้วยAndroid Studioฉันได้รับข้อผิดพลาดของการสร้างต่อไปนี้:

* 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 แนะนำให้ลบ license.txt (notice.txt หรือไฟล์อื่น ๆ ที่อาจรบกวนสิ่งนี้) ออกจากบรรจุภัณฑ์โดยเพิ่มbuild.gradleไฟล์ต่อไปนี้:

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 ใบอนุญาต 2.0เป็นต้น) ใบอนุญาตและแจ้งให้ทราบล่วงหน้าไฟล์ที่ควรจะรวม

คำถามของฉัน: ฉันจะเพิ่มไฟล์หลายไฟล์ที่เกี่ยวข้องกับการออกใบอนุญาต (เช่นlicense.txt , notice.txt และอื่น ๆ ) จากการไล่ระดับลงในโปรเจ็กต์ของฉันได้อย่างไรเพื่อให้สอดคล้องกับใบอนุญาต ( รายละเอียดทางเทคนิค:ข้อความใบอนุญาตจะถูกต่อกัน)


2
จาก POV ทางเทคนิคคุณไม่สามารถจัดแพคเกจสิ่งต่างๆเพื่อให้ไฟล์ "ต้องรวม" ทั้งหมดของแต่ละไลบรารีอยู่ในไดเร็กทอรีของตนเองได้หรือไม่? อีกทางเลือกหนึ่งที่ฉันเคยเห็นกับแอพบางตัวคือให้คุณ (ด้วยตนเอง) รวมไฟล์ใบอนุญาต / ประกาศตามลำดับทั้งหมดไว้ในทรัพยากรเดียวและรวม / แสดงสิ่งนี้ (ที่สองไลบรารีหรือมากกว่านั้นแชร์เวอร์ชันลิขสิทธิ์เดียวกันคุณควรจัดกลุ่มได้ , "ห้องสมุด A และห้องสมุด B รวมอยู่ภายใต้ใบอนุญาตต่อไปนี้: ... ")
TripeHound

@TripeHound นี่คือสิ่งที่ฉันทำอยู่ในขณะนี้เป็นวิธีแก้ปัญหาในขณะที่อยู่ในขั้นตอนการพัฒนาฉันไม่รวมพวกเขาและเมื่อมันมาถึงการเปิดตัว: แสดงความคิดเห็นทั้งหมด 'ไม่รวม' และแก้ไขใบอนุญาตด้วยตนเอง
บิน

1
ค้นหาคำตอบ "packagingOptions - exclude" สมควรได้รับการโหวตเพิ่ม
Ahmed Adel Ismail

คำตอบ:


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 ในกรณีที่ใบอนุญาตเหมือนกัน!
บิน

3
หากคุณเคยพบวิธีต่อใบอนุญาตโดยอัตโนมัติฉันก็หูผึ่ง!
Marc Plano-Lesay

นี่คือสิ่งที่ฉันกำลังตรวจสอบในตอนนี้ ก่อนอื่นฉันต้องหาว่าอะไร (และอย่างไร) กำลังทำภารกิจไล่ระดับที่ทำให้เกิดความขัดแย้ง (สำหรับสิ่งนั้นฉันถามคำถามนี้: stackoverflow.com/questions/34287701/… ) แล้วแทนที่
Flowryn

@Flowryn วิธีที่คุณรวม notice.txt ทั้งหมดด้วยตนเองเพียงแค่คัดลอกไว้ใน notice.txt เดียว? ไม่สามารถแก้ไขได้ซึ่งในjarไฟล์
chinaanihchen

คุณพูดถึงว่าปัญหาอยู่ในไลบรารีที่ใช้ ... ในกรณีของฉันฉันรับผิดชอบในการสร้างไลบรารีที่ฉันใช้.. ฉันจะทำอะไรผิดเมื่อฉันสร้างมันขึ้นมา ขอบคุณ
Eric

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
ซึ่งไม่รวมใบอนุญาตซึ่งส่วนใหญ่ขัดต่อเงื่อนไขอย่างชัดเจน
Marc Plano-Lesay

1
สิ่งนี้ควรอยู่ในการปิดระบบ Android {} สำหรับ Gradle เวอร์ชันปัจจุบัน (2. *)
mijiturka

4

ฉันประสบปัญหาเดียวกันกับใบสมัครของฉัน คุณต้องแน่ใจว่าคุณไม่ได้เพิ่มไลบรารีสองครั้ง หากคุณทำตามเอกสาร firebase https://firebase.google.com/docs/android/setup

จากนั้นคุณไม่ควรเพิ่มไลบรารี firebase ภายใน android studio เช่น file-> project structure-> cloud-> firebase

คุณต้องทำเพียงหนึ่งในทั้งสองอย่างเพื่อใช้ firebase ในแอปพลิเคชัน Android ของคุณ

ในตอนท้ายทำความสะอาดและเรียกใช้แอปของคุณใหม่


2
หากคุณใช้ jackson-databind คุณจะพบปัญหาเมื่อคุณเพิ่มครั้งเดียว
เหลือเชื่อ


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

ไม่มีโซลูชัน tmp สำหรับการรวบรวมโครงการทันที
Mahendran Candy

1
ไม่ว่าการใช้งานจะเป็นอย่างไรโปรดอ่านใบอนุญาต: โดยส่วนใหญ่แล้วสิ่งที่คุณได้รับจากกฎการยกเว้นนั้นผิดกฎหมาย
Marc Plano-Lesay
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.