Android: How to use lower minSdkVersion than declared in library (uiautomator-v18)

Viewed 10526

I migrated an older Android app to Android-Studio/Gradle. The test need uiautomator-v18 which requires minSdkVersion=18. However, I would like to have the minSdkVersion set to 15 or 16.

There are many questions on SO over the same thing, but I am just not able to resolve this problem.

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>

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

The above gives the error:

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

But I am already using the overrideLibrary.

If this is not possible, is it possible to have different minSdkVersion for "main" and "androidTest"?

EDIT: After adding the flavors, I was able to run the tests using build variant tstDebug. However, building it with prdDebug ends in an error saying that there are unknown stuff in the androidTest (example: package org.hamcrest does not exist). The modified excerpt of 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"

Is it not possible to tell "Android Studio" that it should build the app without androidTest?

2 Answers
Related