2016-03-04 7 views
6

古いAndroidアプリをAndroid-Studio/Gradleに移行しました。テストにはuiautomator-v18が必要です。これにはminSdkVersion=18が必要です。しかし、私はminSdkVersionを15または16に設定したいと思っています。Android:ライブラリ(uiautomator-v18)で宣言されたものよりも低いminSdkVersionを使用する方法

同じことについて多くの質問がありますが、私はこの問題を解決できません。

抜粋のAndroidManifest.xml:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    package="com.example.searcher" 
    android:versionCode="1" 
    android:versionName="0.0.1" > 

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

    <!-- ... --> 

</manifest> 

build.gradle:

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 23 
    buildToolsVersion "23.0.2" 

    defaultConfig { 
     applicationId "com.example.searcher" 
     minSdkVersion 15 
     targetSdkVersion 23 
     testApplicationId "com.example.searcher.test" 
     testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
    } 
} 

dependencies { 
    compile 'com.android.support:appcompat-v7:23.2.0' 
    compile 'com.google.android.gms:play-services-analytics:8.4.0' 
    compile files('libs/dagger-1.2.1.jar') 
    compile files('libs/dagger-compiler-1.2.1.jar') 
    compile files('libs/javawriter-2.1.2.jar') 
    compile files('libs/javax.inject.jar') 

    androidTestCompile(
     'com.android.support:support-annotations:23.2.0', 
     'com.android.support.test:runner:0.4.1', 
     'com.android.support.test:rules:0.4.1', 
     'com.android.support.test.uiautomator:uiautomator-v18:2.1.1', 
     'org.hamcrest:hamcrest-library:1.3', 
     'org.mockito:mockito-core:1.10.5', 
     'junit:junit:4.12', 
     'com.google.dexmaker:dexmaker:1.1', 
     'com.google.dexmaker:dexmaker-mockito:1.1' 
    ) 
} 

上記のエラーを与える:

Error:Execution failed for task ':app:processDebugAndroidTestManifest'. 
> java.lang.RuntimeException: Manifest merger failed : uses-sdk:minSdkVersion 15 cannot be smaller than version 18 declared in library [com.android.support.test.uiautomator:uiautomator-v18:2.1.1] /mypath/app/build/intermediates/exploded-aar/com.android.support.test.uiautomator/uiautomator-v18/2.1.1/AndroidManifest.xml 
    Suggestion: use tools:overrideLibrary="android.support.test.uiautomator.v18" to force usage 

しかし、私はすでにoverrideLibraryを使用しています。

これが可能でない場合、「main」と「androidTest」に異なるminSdkVersionを持つことは可能ですか?

EDIT: 味を追加した後、私はバリアントtstDebugを構築使用してテストを実行することができました。しかし、prdDebugでそれを構築すると、androidTest(例:package org.hamcrest does not exist)に未知のものがあるというエラーが表示されます。 build.gradleの修正抜粋:

defaultConfig { 
    applicationId "com.example.searcher" 
    targetSdkVersion 23 
    versionCode 6 
    versionName "0.5.0" 
} 

productFlavors { 
    prd { 
     minSdkVersion 15 
    } 
    tst { 
     minSdkVersion 18 
     testApplicationId "com.example.searcher.test" 
     testInstrumentationRunner "android.test.InstrumentationTestRunner" 
    } 
} 

// And instead of "androidTestCompile" use "tstCompile" 

androidTestせずにアプリケーションを構築すべきであること「のAndroidメーカー」を教えすることはできませんか?

android { 
    productFlavors { 
     production { 
      minSdkVersion 15 
     } 
     uiTest { 
      minSdkVersion 18 
     } 
    } 
... 
} 

そしてuiTest味のビルドでテストを実行します。

+0

あなたoverrideLibraryのAndroidManifestにバージョンを変更しようとしたのですか? – Sree

+0

@Sree:はい、同じ問題です。 – tokosh

+0

私は最終的に "フレーバー"で動かすことができました:私は風味のあるテストの名前を正しく指定しませんでした。だから、フレーバー "dev"の場合、テストフォルダは 'androidTestDev'でなければなりません。私はこの[答え]で見つけた(http://stackoverflow.com/a/28092437/3045181) – tokosh

答えて

5

1つのオプションは、あなたのテストのために、製品の風味を持つことです。

+0

申し訳ありませんが、それを遅く試してみてください。最後に、より低い 'minSdkVersion'でテストを実行しました。私が見逃したのは、 "Android Studio"のビルドバリアントを設定することでした。それがなければテストは実行できませんでした。 'overrideLibrary'でこれが可能だったのが私の好みでした(これが私の目的です)。しかし、十分に時間が費やされました。 – tokosh

+0

代わりに、製品の風味の、あなただけのように、defaultConfigでminSdkVersionがを包む、buildTypeでminSdkVersionがを増やす必要がある場合は、次の答えのための 'エスプレッソ{ defaultConfig { minSdkVersionが18 }}' –

8

<uses-sdk tools:overrideLibrary ...>src/main/AndroidManifest.xmlに入れましたか?

その場合はsrc/main/AndroidManifest.xmlから削除し、次のxmlをsrc/androidTest/AndroidManifest.xmlに入れてみてください。

android:minSdkVersion="18"を忘れないでください)

<?xml version="1.0" encoding="utf-8"?> 
<manifest 
    package="YOUR PACKAGE NAME" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools"> 

    <uses-sdk 
     android:minSdkVersion="18" 
     tools:overrideLibrary="android.support.test.uiautomator.v18" 
     /> 
</manifest> 
+0

感謝。src/androidTest /の 'AndroidManifest.xml'は自動的に生成されます。 gradle.buildで 'minSdkVersion'を使うと、build /でgradle.buildの値を持つ' AndroidManifest.xml'が作成されます。 'minSdkVersion'を未定義のままにしておくと、デフォルトでバージョン' 1'が使用され、エラーも発生します。 – tokosh

+0

@tokoshもっと正確に言うと、 'build.gradle'と' src/androidTest/AndroidManifest.xml'の 'minSdkVersion'は' build/intermediates/manifest/androidTest/debug/AndroidManifest.xml'にマージされます。したがって、 'src/androidTest/AndroidManifest.xml'の格納は重要です。 私は以下の環境でそれを確認: - Androidのメーカー1.5.1 - アンドロイドのGradleプラグイン1.5.0 - ''アプリ/ build.gradle'でminSdkVersion':16 – sumio

+0

以前のコメントに加えて、 AndroidManifest.xmlにはまだアンドロイド:minSdkVersion = "16" 'が含まれています。問題ない。 'tools:overrideLibrary'を宣言すると、マニフェストの合併がコンパイルに失敗するのを防ぎます。 – sumio

関連する問題