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
?
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>
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With