「APK META-INF / *にコピーされた重複ファイル」の解決方法


91

私は商用のandroidアプリケーションで働いています。また、さまざまなライセンスタイプでライセンスされているいくつかのライブラリを使用しています。

ライブラリに帰属情報が記載された「NOTICE」ファイルがある場合は、配布時にその通知を含める必要があります

(たとえば、そのうちの1つは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でこれまでに見つけた回答はbuild.gradle、次のファイルに追加して、license.txt(notice.txtまたはこのように干渉する可能性のあるその他のファイル)をパッケージから削除することを提案しています。

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を参照してください。APKMETA-INF / LICENSE.txtにコピーされた重複ファイル

これらのライブラリのライセンスApache License 2.0など)によると、ライセンスと通知ファイルが含まれている必要があります

私の質問: ライセンスに準拠するために、gradleからライセンスに関連する複数のファイル(license.txtnotice.txtなど)をプロジェクトに追加するにはどうすればよいですか(技術的な詳細:ライセンスのテキストが連結されます)?


2
技術的な視点から、各ライブラリのすべての「インクルードする必要がある」ファイルが独自のディレクトリにあるようにパッケージ化できませんか?一部のアプリで見た別の方法は、それぞれのライセンス/通知ファイルをすべて1つのリソースに(手動で)結合し、これを含めたり表示したりすることです(2つ以上のライブラリが同じライセンスバージョンを共有している場合、それらをグループ化できるはずです) 、「ライブラリAとライブラリBは、次のライセンスの対象です...」)。
トライプハウンド

@TripeHoundこれは私が現在回避策として行っていることですが、開発プロセスではそれらを除外し、リリースに関してはすべての「除外」をコメントしてライセンスを手動で解決します。
Flowryn

1
「packagingOptions-exclude」という答えを検索すると、賛成票が必要です
Ahmed Adel Ismail

回答:


47

名前を使用するライセンスが1つしかない場合の解決策がありますlicense.txt(読み取り:すべてのlicense.txtコピーは同一です)。

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

それ以外の場合、Googleは依存関係ライセンスを管理するためのGradleプラグインもリリースしました。見るください。私は試しませんでしたが、すべての依存関係を集約し、それらのライセンスをすべて表示するアクティビティを生成することもできるようです。


1
現在2つのライセンスがあります。1つはApache 2.0から、もう1つはGPL 3.0です。現在の回避策は、開発段階でそれらを除外し、リリース時に手動で含めることです。すべてのlicense.txtが連結されます。notice.txtについても同じです。とにかく、ライセンスが同一の場合に備えて、pickFirstによるアプローチが気に入っています。
Flowryn

3
ライセンスを自動的に連結する方法を見つけたなら、私はすべて耳にしたものです!
Marc Plano-Lesay

これは私が現在調査しているものです。最初に、競合を発生させたGradleタスクを実行している方法(および方法)を見つける必要があります(そのため、この質問をしました:stackoverflow.com/questions/34287701/…)そしてそれを置き換えます
Flowryn

@Flowrynすべてのnotice.txtを手動で含める方法、それらを1つのnotice.txtにコピーするだけですか?jarファイルで変更できません
chinaanihchen

問題は使用されているライブラリにあると述べています...私の場合、私が使用しているライブラリを作成する責任があります。ライブラリを作成しているときに何が間違っているのでしょうか?ありがとう
エリック

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 2017年

1
これは、Gradleの現在の(2. *)バージョンのandroid {}クロージャーにある必要があります
mijiturka '20

4

アプリケーションで同じ問題に直面しました。ライブラリを2回追加していないことを確認する必要があります。Firebaseのドキュメントhttps://firebase.google.com/docs/android/setupに従っている場合

次に、Androidスタジオ内にFirebaseライブラリを追加しないでください。つまり、ファイル->プロジェクト構造->クラウド->火ベース

AndroidアプリケーションでFirebaseを使用するには、両方を実行する必要があります。

最後に、アプリをクリーンアップして再実行します。


2
jackson-databindを使用する場合、一度追加すると問題が発生します。
驚くべきJan


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 2016

プロジェクトのインスタントコンパイルのためのtmpソリューションはありません
Mahendran Candy

1
使用方法が何であれ、ライセンスを読んでください。それらの大多数では、除外ルールで達成することは違法です。
Marc Plano-Lesay 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.