2016-03-04 22 views
6

Przeprowadziłem migrację starszej aplikacji na Androida do systemu Android-Studio/Gradle. Wymagany test to uiautomator-v18, który wymaga minSdkVersion=18. Jednak chciałbym, aby minSdkVersion był ustawiony na 15 lub 16.Android: jak używać niższej wartości minSdkVersion niż zadeklarowano w bibliotece (uiautomator-v18)

Jest wiele pytań na temat SO w tej samej sprawie, ale nie jestem w stanie rozwiązać tego problemu.

Exerpt 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' 
    ) 
} 

Powyższe daje błąd:

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 

Ale jestem już przy użyciu overrideLibrary.

Jeśli nie jest to możliwe, czy można mieć różne minSdkVersion dla "głównego" i "androidTest"?

EDIT: Po dodaniu smaki, udało mi się uruchomić testy z wykorzystaniem budować wariant tstDebug. Jednak zbudowanie go pod numerem prdDebug kończy się błędem mówiącym, że w androidTestu są nieznane rzeczy (przykład: package org.hamcrest does not exist). Zmodyfikowany fragment 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" 

Czy nie można powiedzieć „Android Studio”, że powinien zbudować aplikację bez androidTest?

+0

Czy próbowałeś zmienić wersję w AndroidManifest swojej overrideLibrary? – Sree

+0

@Sree: Tak, ten sam problem. – tokosh

+0

W końcu udało mi się uruchomić go z "smakami": nie udało mi się poprawnie nazwać testów smakowych. Tak więc dla smaku "dev" folderem testowym powinien być "androidTestDev". Które znalazłem w tym [odpowiedź] (http://stackoverflow.com/a/28092437/3045181) – tokosh

Odpowiedz

5

Jedną z opcji jest, aby mieć smak produktów dla swoich badań:

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

a następnie uruchomić testy na smak uiTest buduje.

+0

Przepraszamy za wypróbowanie go późno. W końcu dostałem testy z niższym 'minSdkVersion'. Brakowało mi ustawienia wariantu kompilacji w "Android Studio". Bez tego testy nie mogłyby zostać uruchomione. Wolałem, jeśli było to możliwe z 'overrideLibrary' (ponieważ wydaje mi się, że to jest jego cel). Ale cóż, wystarczająco dużo czasu. – tokosh

+0

Jeśli zamiast smaku produktu, trzeba zwiększyć minSdkVersion w buildType, po prostu zawinąć minSdkVersion z defaultConfig, tak: 'espresso { defaultConfig { minSdkVersion 18 }}' –

8

Czy umieściłeś <uses-sdk tools:overrideLibrary ...> w src/main/AndroidManifest.xml?

Jeśli tak, usuń go z src/main/AndroidManifest.xml i spróbuj umieścić następujący xml w src/androidTest/AndroidManifest.xml.

(Nie zapomnij 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

Dzięki za odpowiedź.Plik "AndroidManifest.xml" w src/androidTest/jest generowany automatycznie. Jeśli użyję 'minSdkVersion' w gradle.build, utworzy to' AndroidManifest.xml' w kompilacji/z wartościami z gradle.build. Jeśli zostanę niezdefiniowana 'minSdkVersion', użyje ona domyślnie wersji' 1', co spowoduje również błąd. – tokosh

+0

@tokosh Dokładniej, 'minSdkVersion' w twoim' build.gradle' i 'src/androidTest/AndroidManifest.xml' są połączone w' build/intermediates/manifest/androidTest/debug/AndroidManifest.xml'. Zatem przechowywanie "src/androidTest/AndroidManifest.xml" jest znaczące. I potwierdził to w następującym środowisku: - Android Studio 1.5.1 - Android Gradle Plugin 1.5.0 - '' minSdkVersion' w app/build.gradle' 16 – sumio

+0

W uzupełnieniu do poprzedniego uwag, scalony AndroidManifest.xml nadal ma "android: minSdkVersion =" 16 "'. To nie jest problem. Zadeklarowanie 'tools: overrideLibrary' zapobiegnie uszkodzeniu oczywistego łączenia w kompilacji. – sumio