web-dev-qa-db-fra.com

Définissez minSdkVersion différent pour testAndroid que pour l'application principale

Est-il possible de définir une variable minSdkVersion différente de celle de l'application elle-même? Je pose la question parce que je veux utiliser la nouvelle bibliothèque de support de test et l'interface utilisateur Automator pour les tests. Cependant, ceci n'est disponible que sur l'API 18+. Dans le même temps, je souhaite toujours prendre en charge les anciennes versions d'Android, même si cela n'a pas été testé de manière aussi approfondie. Que dois-je ajouter à mon fichier build.gradle pour pouvoir le faire?

Pour clarifier, j'utilise Android Studio et la "nouvelle" structure de projet basée sur Gradle.

39
Code-Apprentice

Je l'ai reçu de le nouveau modèle de test de Google.

Créez un nouveau fichier AndroidManifest.xml dans votre dossier test ou 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>
65
theblang

J'ai téléchargé un exemple de solution sur mauricegavin/Android-testing , car je ne pouvais pas en trouver un qui fonctionne.

Le module d’intérêt est ui/uiautomator/BasicSample/app. Vous remarquerez qu'il existe un fichier AndroidManifest.xml dans le répertoire androidTests. La minSdkVersion que vous spécifiez dans votre app/build.gradle sera toujours utilisée pour les générations debug et release

Vous verrez que la minSdkVersion dans le build.gradle du projet exemple spécifie api 17 qui n'est pas pris en charge par uiautomator et entraînerait généralement l'échec de la construction.

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

Merci à mattblang pour sa réponse que j’ai utilisée pour cet exemple.

6
Maurice Gavin

essaye celui-là.

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 est presque là. Mais vous ne pouvez pas nommer une saveur de produit pour "tester", "androidTest" ou "release". Ils sont comme mot-clé, et vous ne pouvez pas utiliser ces noms.

Donc la réponse est 

    productFlavors {
        product{
            minSdkVersion 15
        }
        uiautoTest {
            minSdkVersion 18
        }
    }
1
songzhw

Oui, vous pouvez. Vous devez mettre les entrées de manifeste spécifiques au test dans src/androidTest/AndroidManifest.xml. Lors de la création de vos tests, le manifeste merger combinera les deux manifestes, mais lors de la construction de votre application, seul le fichier principal AndroidManifest.xml sera utilisé.

Voir cette réponse pour plus de détails.

1
Allen Hair

Après avoir posté cette question, j'ai également eu l'idée de définir minSdkVersion sur différentes valeurs pour les générations debug et release. Cependant, je n'ai pas eu l'occasion de vérifier si cela fonctionne ou non.

J'ai également trouvé un travail possible autour de cet article de blog . Créez des saveurs test et production distinctes:

productFlavors {
    // The actual application flavor 
    production {
        minSdkVersion 14
    }
    // Test application flavor for uiautomatior tests
    test {
        minSdkVersion 18
    }
}
1
Code-Apprentice

Ma solution basée sur la configuration de la saveur:

  1. diviser en deux saveurs:
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. déplacez vos dépendances liées aux tests dans "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. Run Test

 Build Variant Screenshot

0
Lin Yu Cheng

Avec androidx , vous pouvez forcer l’utilisation de l’automaratoire en version <18 avec tools: 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> 

Mais cela peut entraîner des échecs d'exécution si vous exécutez vos tests sur la version <18

0
Stéphane

Ceci est la version la plus hacki. Il m'a fallu presque une journée pour créer ce script. Veuillez en prendre note pour le souvenir, mais utilisez-le uniquement en dernier recours .

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

J'ai eu le conflit suivant, pour tester j'avais besoin d'un minSdkVersion plus élevé.

La solution que j'ai trouvée est extraite du document suivant, à l'aide de buildType changez le type de build de test et le travail a été fait pour moi

Voici la solution:

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
    }
}

Changez le buildType en stage et ça devrait aller

0
dogood