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.
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>
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.
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
}
@ 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
}
}
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.
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
}
}
Ma solution basée sur la configuration de la saveur:
- 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'
}
}
- 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'
}
- Run Test
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
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
}
}
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