2015-06-02 5 views
36

Ist es möglich, einen anderen minSdkVersion für Tests als für die App selbst zu setzen? Ich frage, weil ich die neue Test Support Library und UI Automator zum Testen benutzen 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 zu meiner build.gradle Datei hinzufügen, um dies zu tun?Andere minSdkVersion für testAndroid als für Haupt-App einstellen

Um zu verdeutlichen, verwende ich Android Studio und die "neue" Gradle-basierte Projektstruktur.

+0

Ich denke, es eine akzeptable Antwort ist. – theblang

+0

@mattblang Ich entschuldige mich dafür, dass ich noch keine Antwort angenommen habe. Am Ende habe ich nur die "minSdkVersion" für die gesamte App geändert und die Antworten noch nicht verifiziert. Ich habe es jedoch nicht vergessen und werde eine Antwort akzeptieren, wenn ich die Antworten selbst testen kann. –

Antwort

1

Ja, Sie können. Sie sollten testspezifische Manifesteinträge in src/androidTest/AndroidManifest.xml eingeben. Wenn Sie Ihre Tests erstellen, kombiniert die manifest merger beide Manifeste, aber beim Erstellen Ihrer App wird nur die Hauptversion AndroidManifest.xml verwendet.

Weitere Informationen finden Sie unter this answer.

+0

Ich habe versucht, dies zu tun, und die Manifest-Fusion scheint die Datei 'src/androidTest/AndroidManifest.xml 'zu ignorieren. –

+0

Welche Version des Android Gradle Plugins verwenden Sie? –

+0

com.android.tools.build:gradle:1.2.3 –

60

Ich habe dies von the new testing template von Google.

Erstellen Sie eine neue AndroidManifest.xml Datei in Ihrem Ordner test oder androidTest.

<?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> 
4

Ich habe ein Beispiel für die Lösung mauricegavin/android-testing hochgeladen, wie ich kein Arbeits mich ein finden könnte.

Das Modul von Interesse ist ui/uiautomator/BasicSample/app. Sie werden bemerken, 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 werden sehen, dass die minSdkVersion in sample project's build.gradleapi 17 angibt, die nicht von uiautomator 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> 

Dank mattblang für seine Antwort, die ich für dieses Beispiel verwendet.

1

Nachdem ich diese Frage gestellt hatte, hatte ich auch die Idee, minSdkVersion auf verschiedene Werte für die debug und release Builds zu setzen. Ich hatte jedoch keine Chance zu testen, ob das funktioniert oder nicht.

Ich fand auch eine mögliche Arbeit von this blog post. Erstellen Sie separate test und production Aromen:

productFlavors { 
    // The actual application flavor 
    production { 
     minSdkVersion 14 
    } 
    // Test application flavor for uiautomatior tests 
    test { 
     minSdkVersion 18 
    } 
} 
+0

"Test" Name für Geschmack ist nicht akzeptabel – EliaszKubala

+0

@EliaszKubala Danke. Das wurde bereits in einer anderen Antwort erwähnt. –

1

@-Code-Lehrling ist fast da. Aber Sie können keine Produktaroma für "Test", "AndroidTest" oder "Release" nennen. Sie sind wie ein Schlüsselwort und Sie können diese Namen nicht verwenden.

Die Antwort ist also

productFlavors { 
     product{ 
      minSdkVersion 15 
     } 
     uiautoTest { 
      minSdkVersion 18 
     } 
    } 
+0

Gradle 2.14-1 schlägt in der Tat vor, dass 'ProductFlavor-Namen nicht mit 'test' beginnen können. – kit

5

versuchen 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 
} 
+0

Kann ich nicht einfach dasselbe innerhalb der' debug'- und 'release'-Blöcke ohne eine' if'-Anweisung machen? –

+0

Ich weiß nicht genau, wie Gradle funktioniert, aber wenn du das tust, werden ** dubug ** und ** release ** beide aufgerufen, also wird der letzte gesetzt. Sie können das Ergebnis mit Protokoll anzeigen. 'debug {logger.error ("debug !!") minifyEnabled false signingConfig signingConfigs.debug} release {logger.error ("release !!") minifyEnabled true signingConfig signingConfigs.release proguardFiles getDefaultProguardFile (' proguard-android.txt '), 'proguard-rules.pro'} ' –

0

Meine Lösung auf Geschmack Konfiguration basiert:

  1. Split zwei Geschmack:
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. bewegen Ihre testbezogenen Abhängigkeiten in "autoTestC ompile“
// 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. Run Test

Build Variant Screenshot