Reputation: 1447
I am working at a commercial android application. I am also using some libraries licensed under different license types some of them stating the following:
If the library has a "NOTICE" file with attribution notes, you must include that NOTICE when you distribute
(One of them is licensed under Apache License 2.0 for example).
There is more than one library. When I do the build with gradle or with Android Studio I obtain the following build error:
* 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
The answers that I found until now on the internet and stackoverflow suggest to remove the license.txt(notice.txt or other files that could interfere like this) from packaging by adding to build.gradle
file the following:
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'
}
See for example: Android Studio 0.4 Duplicate files copied in APK META-INF/LICENSE.txt
According to the license of those libraries(Apache License 2.0 for instance), the license and notice files should be included.
My question: How can I add multiple files related to licensing(such as license.txt, notice.txt etc) from gradle into my project in order to be compliant with the licenses(technical detail: licences texts will be concatenated)?
Upvotes: 92
Views: 66489
Reputation: 314
As an alternative to Marc Plano-Lesay's answer, you can also merge the files:
packagingOptions {
merge "META-INF/license.txt"
}
Reference: Gradle API 4.2 Packaging Options
Upvotes: 2
Reputation: 1144
Surely it will work
packagingOptions {
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt' }
Upvotes: -2
Reputation: 6958
There is a solution if you have only one license using the name license.txt
(read: all license.txt
copies are identical):
packagingOptions {
pickFirst 'META-INF/license.txt'
}
Otherwise, Google also released a Gradle plugin to manage dependencies licenses. See here. I didn't try it, but it looks like it's capable of aggregating every dependency, and even generating an activity displaying all of those licenses.
Upvotes: 48
Reputation: 39
I think you need to include only these options in 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'
}
}
Upvotes: 0
Reputation: 283
I faced the same issue with my application. You need to make sure you have not added any libraries twice. If you have followed the firebase documentation https://firebase.google.com/docs/android/setup
Then you should not add firebase library inside android studio i.e. file->project structure->cloud->firebase
You have to do only one of the both, to use firebase in your android application.
At the end clean and rerun your app.
Upvotes: 4
Reputation: 963
Add following into respective build.gradle file
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'
}
Upvotes: 32