2015-10-02 10 views
31

Androidプロジェクトを作成したいと思います。 APIレベルは4ですが、新しいデバイスでAPIレベル18を必要とするUiAutomatorでテストしたいと考えています。したがって、アプリは古いデバイスでも動作しますが、自動テストは新しいデバイスで実行されます。ツールの使用方法:複数のライブラリを持つoverrideLibrary

そこで私は、Android Studioで新しいプロジェクトを作成し、UiAutomatorテストライブラリを追加しました:

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    testCompile 'junit:junit:4.12' 
    compile 'com.android.support:appcompat-v7:23.0.1' 
    androidTestCompile 'com.android.support:support-annotations:23.0.1' 
    androidTestCompile 'com.android.support.test:runner:0.3' 
    androidTestCompile 'com.android.support.test:rules:0.3' 
    androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.1' 
} 

それをコンパイルすると、私はエラー

<uses-sdk tools:overrideLibrary="android.support.test"/> 

を追加

Error:Execution failed for task ':app:processDebugAndroidTestManifest'. 
> java.lang.RuntimeException: Manifest merger failed : uses-sdk:minSdkVersion 4 cannot be smaller than version 8 declared in library [com.android.support.test:runner:0.3] /Users/dom/Entwicklung/MacBookPro/git/GradleTest/app/build/intermediates/exploded-aar/com.android.support.test/runner/0.3/AndroidManifest.xml 
    Suggestion: use tools:overrideLibrary="android.support.test" to force usage 

を取得しますAndroidManifest.xmlに別のエラーが発生します:

Error:Execution failed for task ':app:processDebugManifest'. 
> Manifest merger failed : uses-sdk:minSdkVersion 4 cannot be smaller than version 7 declared in library [com.android.support:appcompat-v7:23.0.1] /Users/dom/Entwicklung/MacBookPro/git/GradleTest/app/build/intermediates/exploded-aar/com.android.support/appcompat-v7/23.0.1/AndroidManifest.xml 
    Suggestion: use tools:overrideLibrary="android.support.v7.appcompat" to force usage 

<uses-sdk tools:overrideLibrary="android.support.test, android.support.v7.appcompat"/> 

にそれを変更するには、再び最初のエラーが発生します。

Error:Execution failed for task ':app:processDebugAndroidTestManifest'. 
> java.lang.RuntimeException: Manifest merger failed : uses-sdk:minSdkVersion 4 cannot be smaller than version 8 declared in library [com.android.support.test:runner:0.3] /Users/dom/Entwicklung/MacBookPro/git/GradleTest/app/build/intermediates/exploded-aar/com.android.support.test/runner/0.3/AndroidManifest.xml 
    Suggestion: use tools:overrideLibrary="android.support.test" to force usage 

が、私は最新のAndroid Studioを使用してツールを構築しています。 Android Studioがアプリの作成に使用するgradleコマンドは、

Gradle tasks [clean, :app:generateDebugSources, :app:generateDebugAndroidTestSources, :app:compileDebugSources, :app:compileDebugAndroidTestSources] 

です。問題は再現できます。 with

gradle :app:generateDebugAndroidTestSources :app:compileDebugAndroidTestSources 

ツールで複数のライブラリを指定する正しい構文は何ですか:overrideLibrary?私はカンマとスペースが正しいと読んだが、うまくいかないようだ。私はStackOverflowやその他の場所でこれについて多くのことを読んだことがありますが、残念ながらこれまでのところ解決策を見つけることはできませんでした(テストのコメントを除いて)。

答えて

65

解決策は、テストのためだけに AndroidManifest.xmlを作成することです。

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
      xmlns:tools="http://schemas.android.com/tools" 
      package="${applicationId}"> 
    <uses-sdk tools:overrideLibrary="android.app, android.support.test, android.support.test.rule, android.support.test.espresso, android.support.test.espresso.idling, android.support.test.uiautomator.v18"/> 
</manifest> 

、あなたの仕事のために別のディレクトリを使用している場合、あなたはGradleのファイルにそれをこのように指定することができます:それはテストディレクトリに保存する必要があるとだけoverrideLibrary声明が含まれている必要があり

androidTest.setRoot('src_test_uiautomator') 

AndroidManifest.xmlファイルは、そのディレクトリのルートにある必要があります。テストソースは「java」サブディレクトリにあります。

+1

ありがとう、それは動作します!Googleがこの問題を文書化するのを気にしなかったので、愚かです... – Egor

+0

androidTest { \t \t \t setRoot ( 'SRC /メイン/ androidTest /') \t \t \t java.srcDirs = [ 'SRC /メイン/ androidTest/javaの/'] \t \t} '' '私にとっては、これはすべての作業を行った。 – ericharlow

+0

@ericharlowはにトリングていますあなたのソリューションを使用します私のapp.gradleにエラーが発生しています** DSLメソッドが見つかりません: 'androidTest()' **私は 'apply plugin: 'java''を使用しようとしましたが、同期しても同じエラーが表示されます。どうすればこの問題を解決できますか? –

17

official doc(インポートされたライブラリのマージ競合マーカーセクション)によると、それはそうでなければなりません。

com.example.lib1, com.example.lib2は、ライブラリ内のAndroidManifesで宣言されたパッケージです
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.android.example.app" 
    xmlns:tools="http://schemas.android.com/tools"> 
    ... 
    <uses-sdk android:targetSdkVersion="22" android:minSdkVersion="2" 
      tools:overrideLibrary="com.example.lib1, com.example.lib2"/> 

+0

はい、私はこれらのドキュメントを読んでいると私は今minSdkVersionが及びtargetSdkVersionを追加しようとしましたが、それは <使用-SDKアンドロイド:-(違いはありません。targetSdkVersion =「23」のandroid:minSdkVersionが= "4 " tools:overrideLibrary =" android.support.test、android.support.v7.appcompat "/> これらの値は、とにかくbuild.gradleから取得されています。あなたの例とStackOverflowで見つかった別の例で何が間違っているのかは分かりませんが、これはテストライブラリの依存関係だけを追加した空のプロジェクトです – Dominique

+0

@Dominiqueこれで問題は解決しません新しいプロジェクトの場合は、なぜminSdk = 4を使用していますか?minSdk = 8では、100%のcu目に見えるアンドロイドの分布。 https://developer.android.com/intl/ru/about/dashboards/index.html –

+0

ライブラリ「android.support.test.uiautomator.v18」にminSdk = 18が必要なため、minSdk = 8は役に立ちません。さらに、実際のプロジェクトは新しいプロジェクトではありません。しかし、本当の問題が存在することを確認するために、私は新しい空のプロジェクトで問題を再現しました。 minSdk = 7またはminSdk = 8の新しいAndroid Studioプロジェクトに4つのandroidTestCompile依存関係行を追加するだけで再現できます。 – Dominique

関連する問題