プロジェクトをEclipseからエクスポートし、Androidこのリンクの手順を使用してStudioにインポートしました: http://developer.Android.com/sdk/installing/migrate.html =
ビルドすると、エラーが発生します。
Duplicate files copied in APK META-INF/DEPENDENCIES
検索した後、私は解決策を見つけました:追加
packagingOptions {
exclude 'META-INF/DEPENDENCIES'
}
build.gradle
。そしてそれは動作します!
しかし、なぜこのエラーが発生したのか、なぜその修正を適用しなければならなかったのかはわかりません。誰でも説明できますか?
Android Gradleビルドでは、出力に同じパスを持つ同じファイルを複数回含めることはできません。ビルドには、2つのMETA-INF/DEPENDENCIES
さまざまな場所からのファイル。アプリケーションではこのファイルはまったく必要ないので、最も簡単なことはビルドシステムにこのファイルを完全に無視するように指示することです。これがこのexclude
ディレクティブの機能です。
ビルドシステムにコピーのoneを保持するよう指示するpickFirst
ディレクティブもあります。 Android Gradleプラグイン0.7.0:「APKのパッケージ化中にファイルを複製する」 に詳細があります。
GradleでのAndroidビルドは、重複ファイルについてかなり厳格であり、それが人生を困難にする可能性があります。同じJavaクラスを複数回含めると、「Multiple dex files define」エラーが発生します( Multiple dex files define Landroid/support/v4を参照してください)/accessibilityservice/AccessibilityServiceInfoCompat )(典型的な例)。
他のビルドシステムはより寛大です。 Javaで一般的です。たとえば、クラスパスに同じクラスを複数回含めると、最初に表示されるコピーが使用されます。その後の重複は無視されます。最大の問題は、知らないうちにファイルの複数の異なるバージョンがビルドに忍び込む場合、微妙なエラーが発生する可能性があることです-何が起こっているのかを把握するのは難しい場合がありますあなたがそれを理解するとき、あなたは通常、物事が含まれる順序をジャグリングすることによってそれを解決することができます、あなたが望むものが最終的な出力になるようにすることを確認しますプロジェクトに新しいライブラリを含めるなど、一見無関係なことを行うと、順序が乱れ、多くの悲惨な事態につながる可能性があります。
そのため、Gradleは、重複を解決するゲームの「勝者」を決定するために物事の順序に依存しないという哲学を持ち、開発者にすべての依存関係を明示的にすることを強制します。 Gradle上でのビルドシステムのAndroidの実装は、その哲学に従っています。
スコットバルタの答えは正しいですが、単純で一般的な解決策はありません。
Android {
packagingOptions {
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/NOTICE'
exclude 'META-INF/LICENSE'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
}
}
build.gradleにこれらの重複を無視します。
最も簡単な解決策は、追加することです
packagingOptions {
pickFirst 'META-INF/*'
}
Androidセクションのbuild.gradle
この問題を解決するために見つけた最も簡単な方法は、ワイルドカードを使用することです。そのため、競合する各ファイルを手動で宣言する必要はありません。
packagingOptions {
pickFirst '**'
}