Как разрешить "Дублировать файлы, скопированные в APK META-INF/*",

Я работаю над коммерческим андроидным приложением. Я также использую некоторые библиотеки, лицензированные под разными типами лицензий, некоторые из которых заявляют следующее:

Если в библиотеке есть файл "УВЕДОМЛЕНИЕ" с примечаниями о атрибуции, вы должны включить это УВЕДОМЛЕНИЕ при распространении

(один из них лицензирован под 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 License 2.0), файлы лицензий и уведомлений должны быть включены.

Мой вопрос:. Как добавить несколько файлов, связанных с лицензированием (например, license.txt, notice.txt и т.д.) из gradle в мой проект, чтобы соответствовать требованиям лицензий ( техническая информация: тексты лицензий будут конкатенированы)?

Ответ 1

Существует решение, если у вас есть только одна лицензия, использующая имя license.txt (чтение: все license.txt копии идентичны):

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

Ответ 2

Добавьте следующий файл в соответствующий файл 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'
    }

Ответ 3

Я столкнулся с той же проблемой с моим приложением. Вам нужно убедиться, что вы не добавляли библиотеки дважды. Если вы следовали документации по firebase https://firebase.google.com/docs/android/setup

Тогда вам не следует добавлять библиотеку firebase внутри студии Android то есть file- > project structure- > cloud- > firebase

Вы должны сделать только один из них, использовать firebase в своем приложении для Android.

В конце очистите и запустите свое приложение.

Ответ 5

Я думаю, вам нужно включить только эти параметры в 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'
    }
}

Ответ 6

Конечно, это сработает

упаковкаОпции {     исключить 'META-INF/LICENSE.txt'     исключить 'META-INF/NOTICE.txt'}