Studio Android: pourquoi minSdkVersion et targetSdkVersion sont-ils spécifiés à la fois dans AndroidManifest.xml et build.gradle?

103

Je viens de découvrir quelque chose de bizarre à propos du studio Android: il contient des options de configuration dans le build.gradlefichier qui remplacent ce qui est spécifié dans le AndroidManifest.xmlfichier.

Par exemple, j'avais les lignes suivantes dans build.gradle:

android {
    compileSdkVersion 18
    buildToolsVersion "18.1.1"

    defaultConfig {
        minSdkVersion 10
        targetSdkVersion 10
    }
...
}

qui remplaçait la balise correspondante dans AndroidManifest.xml:

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="8"/>

Je n'aime pas vraiment que les mêmes paramètres soient répartis dans deux fichiers différents, alors je me demande si je peux le supprimer en toute sécurité de build.gradleou AndroidManifest.xmlet où il est plus logique de le conserver.

mariosangiorgio
la source

Réponses:

111

Gradle remplace les valeurs du manifeste et je préfère mettre à jour le build.gradlefichier plutôt que le manifeste. C'est probablement la bonne façon d'utiliser Gradle. Gradle prend en charge les variantes de produits qui peuvent être contrôlées via un IDE et ces variantes de produits peuvent changer de nombreuses choses dans notre manifeste comme le nom du package, le code de version, le nom de la version, le SDK cible et bien d'autres. Ensuite, en un clic dans Android Studio, vous pouvez modifier de nombreuses propriétés et générer un autre apk.

Vous pouvez laisser le manifeste tel quel et effectuer toute la configuration dans build.gradle. Vous pouvez supprimer en toute sécurité

<uses-sdk></uses-sdk>

du manifeste ainsi que des codes de version.

mar3kk
la source
3
Pour quiconque se demande, si vous utilisez apktool pour décompresser un APK construit comme celui-ci, vous ne verrez pas réellement la minSdkVersion dans le fichier AndroidManifest. Je ne sais pas où cela va, mais il fait la bonne chose (j'ai confirmé en téléchargeant sur Google Play)!
Dan J
6
Étrange. Il semble que Google décide du minSDK par l'API que notre application appelle. Même si mon application / build.gradle spécifie que minSDK est Android 2.2, dans Google Play, il indique minSDK = Android 1.6. Et oui, le fichier AndroidManifest.xml décompilé ne contient aucune information minSDK. Je pense que c'est un problème, car cela nous "oblige" à prendre également en charge les appareils Android 1.6.
sancho21
1
La barre latérale ici: developer.android.com/guide/topics/manifest/… suggère que Play utilise toujours le manifeste d'une manière ou d'une autre. Peut-être qu'il est réinséré dans les coulisses par gradle avant la construction de l'APK?
jordanpg
4
C'est comme ça que ça marche. Gradle insérera les informations manquantes pour se manifester lors de la compilation.
mar3kk
5
@ sancho21 Il s'agit d'un bogue connu avec le Google Play Store lors des tests alpha et bêta. Cela devrait se résoudre lorsque vous poussez pour produire. Pas une source faisant autorité, mais voir answers.unity3d.com/questions/683972/…
Tom Lubitz
0

À partir de la documentation Android:

Remarque: si votre application définit la version de l'application directement dans l'élément, les valeurs de version du fichier de construction Gradle remplaceront les paramètres du manifeste. En outre, la définition de ces paramètres dans les fichiers de construction Gradle vous permet de spécifier différentes valeurs pour différentes versions de votre application. Pour plus de flexibilité et pour éviter tout écrasement potentiel lors de la fusion du manifeste, vous devez supprimer ces attributs de l'élément et définir vos paramètres de version dans les fichiers de construction Gradle à la place.

https://developer.android.com/studio/publish/versioning.html#appversioning

CONTE
la source
Je pense que cette partie parlait versionCode . Vous auriez dû citer le suivant dans la Specify API level requirementssection
Long