webentwicklung-frage-antwort-db.com.de

Legen Sie für testAndroid eine andere minSdkVersion fest als für die Hauptanwendung

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.

39
Code-Apprentice

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>
65
theblang

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.

6
Maurice Gavin

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
}
6
Soo Chun Jung

@ 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
        }
    }
1
songzhw

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.

1
Allen Hair

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
    }
}
1
Code-Apprentice

Meine Lösung basiert auf Flavour-Konfiguration:

  1. 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'
   }
}
  1. 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'
}
  1. Lauftest

 Build Variant Screenshot

0
Lin Yu Cheng

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

0
Stéphane

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
    }
}
0
Pier Betos

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

0
dogood