Kann für Tests eine andere minSdkVersion
eingestellt werden als für die App selbst? Ich frage, weil ich die neue Test Support Library und den UI Automator zum Testen verwenden möchte. Dies ist jedoch nur für API 18+ verfügbar. Gleichzeitig möchte ich noch ältere Versionen von Android unterstützen, wenn auch nicht so gründlich getestet. Was muss ich meiner build.gradle
-Datei hinzufügen, um dies zu tun?
Zur Verdeutlichung verwende ich Android Studio und die "neue" Gradle-basierte Projektstruktur.
Ich habe dies von der neuen Testvorlage von Google erhalten.
Erstellen Sie eine neue AndroidManifest.xml
-Datei in Ihrem test
- oder androidTest
-Ordner.
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:tools="http://schemas.Android.com/tools"
package="your.package.name">
<uses-sdk tools:overrideLibrary="Android.support.test.uiautomator.v18"/>
</manifest>
Ich habe ein Beispiel für die Lösung in mauricegavin/Android-testing hochgeladen, da ich selbst keine funktionierende Lösung finden konnte.
Das interessierende Modul ist ui/uiautomator/BasicSample/app. Sie werden feststellen, dass sich im Verzeichnis androidTests eine AndroidManifest.xml befindet. Die minSdkVersion
, die Sie in Ihrem app/build.gradle
angeben, wird weiterhin für debug
und release
-Builds verwendet.
Sie sehen, dass minSdkVersion
in build.gradle des Beispielprojektsapi 17
angibt, der von uiautomator nicht unterstützt wird und normalerweise dazu führen würde, dass der Build fehlschlägt.
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:tools="http://schemas.Android.com/tools"
package="com.example.Android.testing.uiautomator.BasicSample" >
<uses-sdk tools:overrideLibrary="Android.support.test.uiautomator.v18"/>
</manifest>
Danke an mattblang für seine Antwort, die ich für dieses Beispiel verwendet habe.
probier diese.
defaultConfig {
applicationId "com.test"
if (gradle.startParameter.taskNames.contains(":app:assembleDebug")) {
minSdkVersion 21
}else{
minSdkVersion 14
}
targetSdkVersion 22
versionCode Integer.parseInt(VERSION_CODE)
versionName VERSION_NAME
}
@ Code-Apprentice ist fast da. Sie können eine Produktvariante jedoch nicht als "test", "androidTest" oder "release" bezeichnen. Sie sind wie Schlüsselwörter und Sie können diese Namen nicht verwenden.
Die Antwort lautet also
productFlavors {
product{
minSdkVersion 15
}
uiautoTest {
minSdkVersion 18
}
}
Ja, du kannst. Sie sollten testspezifische Manifesteinträge in src/androidTest/AndroidManifest.xml
einfügen. Beim Erstellen Ihrer Tests werden in der manifest-Fusion beide Manifests kombiniert. Beim Erstellen Ihrer App wird jedoch nur die Hauptversion von AndroidManifest.xml verwendet.
Siehe diese Antwort für weitere Details.
Nach dem Posten dieser Frage hatte ich auch die Idee, minSdkVersion
auf unterschiedliche Werte für die Builds debug
und release
einzustellen. Ich hatte jedoch noch keine Gelegenheit zu testen, ob dies funktioniert oder nicht.
Ich habe auch eine mögliche Umgehung von diesem Blogbeitrag gefunden. Erstellen Sie getrennte test
- und production
-Flavours:
productFlavors {
// The actual application flavor
production {
minSdkVersion 14
}
// Test application flavor for uiautomatior tests
test {
minSdkVersion 18
}
}
Meine Lösung basiert auf Flavour-Konfiguration:
- aufgeteilt in zwei Geschmacksrichtungen:
buildTypes {
release {...}
debug {...}
}
productFlavors {
dev { ... }
autoTest {
minSdkVersion 18 // set to 18 only in this flavor
multiDexEnabled true // if you got dex index overflow error
testInstrumentationRunner 'Android.support.test.runner.AndroidJUnitRunner'
}
}
- verschiebe deine testbezogenen Abhängigkeiten in "autoTestCompile"
// for test
autoTestCompile 'com.Android.support.test:runner:0.5', {
exclude group: 'com.Android.support', module: 'support-annotations'
}
autoTestCompile 'com.Android.support.test:rules:0.5', {
exclude group: 'com.Android.support', module: 'support-annotations'
}
autoTestCompile 'com.Android.support.test.espresso:espresso-web:2.2.2', {
exclude group: 'com.Android.support', module: 'support-annotations'
}
autoTestCompile 'com.Android.support.test.espresso:espresso-contrib:2.2.2', {
exclude group: 'com.Android.support', module: 'support-annotations'
exclude group: 'com.Android.support', module: 'support-v4'
exclude group: 'com.Android.support', module: 'design'
exclude group: 'com.Android.support', module: 'recyclerview-v7'
}
autoTestCompile 'com.Android.support.test.uiautomator:uiautomator-v18:2.1.2', {
exclude group: 'com.Android.support', module: 'support-annotations'
}
- Lauftest
Mit androidx können Sie die Verwendung des UI-Automators in Version <18 mit Tools erzwingen: overrideLibrary = "Android_libs.ub_uiautomator"
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:tools="http://schemas.Android.com/tools" package="..." >
<uses-sdk tools:overrideLibrary="Android_libs.ub_uiautomator"/>
</manifest>
Es kann jedoch zu Laufzeitfehlern kommen, wenn Sie Ihre Tests auf Version <18 ausführen
Dies ist die hickeste Version. Ich habe fast einen Tag gebraucht, um dieses Skript zu erstellen. Bitte beachten Sie dies für Andenken, aber verwenden Sie dies nur als letzten Ausweg .
Android.applicationVariants.all { variant ->
//Making specific variant disablements for faster build
if (variant.buildType.name.contains("debug")) {
println "Making min version to 21 and disabling multidex"
variant.mergedFlavor.setMultiDexEnabled false
def versionMin = new com.Android.builder.core.DefaultApiVersion(21)
variant.mergedFlavor.setMinSdkVersion versionMin
}
}
Ich hatte den folgenden Konflikt, zum Testen brauchte ich eine höhere minSdkVersion.
Die gefundene Lösung wurde aus dem folgenden Dokument mit buildType change the test build type entnommen und hat die Aufgabe für mich erledigt
Folgendes ist die Lösung:
Android {
defaultConfig {
applicationId "com.doronkettner.ilikemovies"
...
minSdkVersion 18
...
testBuildType "staging"
...
}
...
buildTypes {
release {...}
debug {...}
staging {
initWith(buildTypes.debug) // keep versionName and PIN from 'debug'
defaultConfig.minSdkVersion 19
}
}
Ändern Sie den buildType in stage und es sollte in Ordnung sein