Android studio: perché minSdkVersion e targetSdkVersion sono specificati sia in AndroidManifest.xml che in build.gradle?


103

Ho appena scoperto qualcosa di strano su Android Studio: ha alcune opzioni di configurazione nel build.gradlefile che sovrascrivono ciò che è specificato nel AndroidManifest.xmlfile.

Ad esempio, avevo le seguenti righe in build.gradle:

android {
    compileSdkVersion 18
    buildToolsVersion "18.1.1"

    defaultConfig {
        minSdkVersion 10
        targetSdkVersion 10
    }
...
}

che sovrascriveva il tag corrispondente in AndroidManifest.xml:

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

Non mi piace molto che le stesse impostazioni siano distribuite in due file diversi, quindi mi chiedo se posso rimuoverle in modo sicuro da build.gradleo AndroidManifest.xmle dove ha più senso tenerle.

Risposte:


111

Gradle sovrascrive i valori manifest e preferisco aggiornare il build.gradlefile piuttosto che il manifest. Probabilmente questo è il modo giusto usando Gradle. Gradle supporta i gusti del prodotto che possono essere controllati tramite un IDE e questi gusti del prodotto possono cambiare molte cose nel nostro Manifest come il nome del pacchetto, il codice della versione, il nome della versione, l'SDK di destinazione e molti altri. Quindi con un clic in Android Studio puoi modificare molte proprietà e generare un altro apk.

Puoi lasciare il manifest così com'è ed eseguire tutte le configurazioni in build.gradle. Puoi tranquillamente rimuovere

<uses-sdk></uses-sdk>

da manifest e dai codici di versione.


3
Per chiunque si chieda, se usi apktool per decomprimere un APK costruito in questo modo, in realtà non vedrai minSdkVersion in AndroidManifest. Non so dove vada, ma fa la cosa corretta (l'ho confermato caricando su Google Play)!
Dan J

6
Strano. Sembra che Google decida il minSDK in base a ciò che l'API chiama la nostra app. Anche se la mia app / build.gradle specifica minSDK come Android 2.2, in Google Play si dice minSDK = Android 1.6. E sì, AndroidManifest.xml decompilato non contiene informazioni minSDK. Penso che questo sia un problema, dal momento che ci "costringe" a supportare anche i dispositivi Android 1.6.
sancho21

1
La barra laterale qui: developer.android.com/guide/topics/manifest/… suggerisce che Play utilizza ancora il manifest in qualche modo. Forse è stato reinserito dietro le quinte da gradle prima della build APK?
jordanpg

4
Ecco come funziona. Gradle inserirà le informazioni mancanti da manifestare durante la compilazione.
mar3kk

5
@ sancho21 Questo è un bug noto con Google Play Store durante i test alpha e beta. Dovrebbe risolversi quando si preme per spingere. Non è una fonte autorevole, ma vedi answer.unity3d.com/questions/683972/…
Tom Lubitz

0

Dai documenti Android:

Nota: se la tua app definisce la versione dell'app direttamente nell'elemento, i valori della versione nel file di build Gradle sovrascriveranno le impostazioni nel manifest. Inoltre, la definizione di queste impostazioni nei file di build Gradle ti consente di specificare valori diversi per le diverse versioni della tua app. Per una maggiore flessibilità e per evitare potenziali sovrascritture quando il manifest viene unito, dovresti rimuovere questi attributi dall'elemento e definire invece le impostazioni della tua versione nei file di build Gradle.

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


Penso che quella parte stia parlando versionCode . Avresti dovuto citare il prossimo nella Specify API level requirementssezione
Lungo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.