Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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?

like image 592
tokosh Avatar asked Mar 04 '16 06:03

tokosh


2 Answers

Did you put <uses-sdk tools:overrideLibrary ...> in src/main/AndroidManifest.xml?

If so, remove it from src/main/AndroidManifest.xml and try to put the following xml in src/androidTest/AndroidManifest.xml.

(Don't forget 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>
like image 106
sumio Avatar answered Nov 15 '22 19:11

sumio


One option is to have a product flavor for your tests:

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

And then run the tests on the uiTest flavor builds.

like image 40
kevinpelgrims Avatar answered Nov 15 '22 21:11

kevinpelgrims