AndroidStudioとGradleを使用して、 'androidTest'ソースディレクトリのテストでAndroidアプリをビルドしています。新しい依存関係を追加し、AndroidStudioまたは './gradlew connectedCheck'を介してAndroidテストを実行すると、次の問題が発生します。これを解決する好ましい方法は何ですか?
'警告:依存関係' org.somelibrary:library-core 'との競合。アプリとテストアプリの解決済みバージョンは異なります。
Android Gradleプラグイン1.1.1の時点で、エラーは次のように表示されます。「警告:依存関係 'com.google.code.findbugs:jsr305」と競合します。 (2.0.1)違います。」
Androidアプリのテストをビルドして実行すると、Android Gradleプラグインは2つのAPK(アプリとテストAPK)をビルドします。gradle実行中に依存関係を実行しますアプリとテストビルドの比較。バージョン番号が同じ場合、両方に存在する依存関係はテストビルドから削除されます。同じ依存関係が使用されているが、バージョン番号が異なる場合は、依存関係を手動で解決する必要があります。競合し、このエラーが表示されます。
競合を解決するには、最初に競合している2つのバージョンを把握する必要があります。まだAndroid Gradle Plugin v1.1.1 +を使用していない場合、そのバージョンにアップグレードすると、エラーメッセージに競合するバージョン番号が表示されます。必要なものを選択してください。
*競合番号を選択する場合、デフォルトのgradle依存関係解決戦略( failOnVersionConflict )をオーバーライドしない限り、アプリ内で内部的に競合し、テストビルドが(別々に)大きいバージョンを選択して解決してください。
次に、競合を解決する方法を決定する必要があります。下位バージョン(1.2)のライブラリの使用を強制する必要がある場合、アプリとテストビルドの両方の依存関係を、次のようにライブラリの特定のバージョンに強制的に解決する必要があります。
// Needed to resolve app vs test dependencies, specifically, transitive dependencies of
// libraryq and libraryz. Forcing the use of the smaller version after regression testing.
configurations.all {
resolutionStrategy.force 'org.somelibrary:library-core:1.2'
}
2.1バージョンの依存関係を使用する必要がある場合は、上記のスニペットも使用できますが、推移的な依存関係の更新に必要かどうかに関係なく、新しいバージョンのライブラリの使用を開始することはありません。または、アプリまたはテストビルド(どちらかのバージョンの依存関係を使用しようとしたもの)に新しい通常の依存関係を追加することもできます。これにより、アプリまたはテストビルドは(前述の)gradle依存関係解決戦略に依存するように強制されるため、そのビルドにはライブラリの2.1バージョンが使用されます。
// Force the use of 2.1 because the app requires that version in libraryq transitively.
androidTestCompile 'org.somelibrary:library-core:2.1'
または
// Force the use of 2.1 because the Android Tests require that version in libraryz.
compile 'org.somelibrary:library-core:2.1'
このソリューションでは、バージョン3.3のように、テストまたはアプリビルドのいずれかでのみ使用が開始された場合、エラーが再表示されますが、ビルド時に別の非互換性が通知され、アクションを実行できるため、これは通常は問題ありません。
更新:この質問に対するいくつかの新しいソリューションも、宣言された依存関係から特定の推移的な依存関係を除外するようになりました。これは有効なソリューションですが、開発者により多くの責任を負わせます。上記の強制依存関係解決の提案がビルドにバージョンをハードコードするのと同じように、exclude-transitive-dependencyソリューションは、ライブラリの規定要件を具体的にオーバーライドします。ライブラリ開発者がバグを抱えたり、他のさまざまなライブラリのバグを回避したりすることがあるため、これらのソリューションを実装する際に、非常に不明瞭なバグを追跡しなければならないリスクがあります。
同様の問題がありました。最初に-gradleプラグインを1.1.1にアップグレードします(プロジェクトのgradleで):
classpath 'com.Android.tools.build:gradle:1.1.1'
問題は次のものを参照しているアプリであることに気づきました。
com.Android.support:support-annotations:21.0.3
テストアプリが参照している間:
com.Android.support:support-annotations:20.0.0
(androidTestCompile 'com.squareup.assertj:assertj-Android-appcompat-v7:1.0.0'
を指定したため)
以下を指定して解決しました:
androidTestCompile 'com.Android.support:support-annotations:21.0.3'
または、次を使用して、テストアプリの依存関係(たとえば、assertj-Android)によって引き込まれた競合する依存関係(たとえば、サポートアノテーションライブラリ)を除外できます。
testCompile('com.squareup.assertj:assertj-Android:1.0.0') { exclude group: 'com.Android.support', module: 'support-annotations' }
Gradleには 解像度戦略メカニズム があります。
この競合を解決するには、アプリレベルのbuild.gradleファイルに次の行を追加します。
configurations.all {
resolutionStrategy {
force 'com.google.code.findbugs:jsr305:1.3.9', 'com.google.code.findbugs:jsr305:2.0.1'
}
}
(生成された).imlファイルを見ると、競合するバージョン番号を簡単に確認できます。私の場合:
<orderEntry type="library" exported="" scope="TEST" name="support-annotations-20.0.0" level="project" />
<orderEntry type="library" exported="" name="support-annotations-21.0.3" level="project" />
Gradleプラグインのバージョン1.0.1に戻ると、問題は解決します。