Android Studio: Warum werden minSdkVersion und targetSdkVersion sowohl in AndroidManifest.xml als auch in build.gradle angegeben?

102

Ich habe gerade etwas Seltsames an Android Studio entdeckt: Es enthält einige Konfigurationsoptionen in der build.gradleDatei, die die Angaben in der Datei überschreiben AndroidManifest.xml.

Zum Beispiel hatte ich die folgenden Zeilen in build.gradle:

android {
    compileSdkVersion 18
    buildToolsVersion "18.1.1"

    defaultConfig {
        minSdkVersion 10
        targetSdkVersion 10
    }
...
}

welches das entsprechende Tag überschrieb in AndroidManifest.xml:

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

Ich mag es nicht wirklich, wenn dieselben Einstellungen in zwei verschiedenen Dateien verteilt sind, daher frage ich mich, ob ich sie sicher entfernen kann build.gradleoder AndroidManifest.xmlwo und wo es sinnvoller ist, sie aufzubewahren.

mariosangiorgio
quelle

Antworten:

110

Gradle überschreibt die Manifestwerte, und ich bevorzuge es, die build.gradleDatei anstelle des Manifests zu aktualisieren . Wahrscheinlich ist dies der richtige Weg mit Gradle. Gradle unterstützt Produktvarianten, die über eine IDE gesteuert werden können, und diese Produktvarianten können viele Dinge in unserem Manifest ändern, wie Paketname, Versionscode, Versionsname, Ziel-SDK und viele andere. Dann können Sie mit einem Klick in Android Studio viele Eigenschaften ändern und eine weitere apk generieren.

Sie können das Manifest unverändert lassen und die gesamte Konfiguration in vornehmen build.gradle. Sie können sicher entfernen

<uses-sdk></uses-sdk>

von Manifest sowie Versionscodes.

mar3kk
quelle
3
Wenn Sie sich fragen, ob Sie mit apktool eine so erstellte APK entpacken, wird die minSdkVersion im AndroidManifest nicht angezeigt. Ich weiß nicht, wohin es geht, aber es macht das Richtige (ich habe es durch Hochladen auf Google Play bestätigt)!
Dan J
6
Seltsam. Es scheint, dass Google das minSDK anhand der von unserer App aufgerufenen API entscheidet. Obwohl in meiner App / build.gradle angegeben ist, dass minSDK Android 2.2 ist, heißt es in Google Play minSDK = Android 1.6. Und ja, die dekompilierte AndroidManifest.xml enthält keine minSDK-Informationen. Ich denke, dies ist ein Problem, da es uns "zwingt", auch Android 1.6-Geräte zu unterstützen.
sancho21
1
Die Seitenleiste hier: developer.android.com/guide/topics/manifest/… legt nahe, dass Play das Manifest immer noch irgendwie verwendet. Vielleicht wird es vor dem APK-Build von gradle hinter den Kulissen wieder eingefügt?
Jordanpg
4
So funktioniert das. Gradle fügt fehlende Informationen ein, die während der Kompilierung angezeigt werden sollen.
3. März
5
@ sancho21 Dies ist ein bekannter Fehler im Google Play Store während des Alpha- und Betatests. Es sollte sich auflösen, wenn Sie auf Prod drücken. Keine maßgebliche Quelle, aber siehe answers.unity3d.com/questions/683972/…
Tom Lubitz
0

Aus den Android-Dokumenten:

Hinweis: Wenn Ihre App die App-Version direkt im Element definiert, überschreiben die Versionswerte in der Gradle-Builddatei die Einstellungen im Manifest. Wenn Sie diese Einstellungen in den Gradle-Builddateien definieren, können Sie außerdem unterschiedliche Werte für verschiedene Versionen Ihrer App angeben. Um die Flexibilität zu erhöhen und ein mögliches Überschreiben beim Zusammenführen des Manifests zu vermeiden, sollten Sie diese Attribute aus dem Element entfernen und stattdessen Ihre Versionseinstellungen in den Gradle-Builddateien definieren.

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

GESCHICHTE
quelle
Ich denke, dieser Teil hat darüber gesprochen versionCode . Sie sollten den nächsten in Specify API level requirementsAbschnitt
Long