Estudio de Android: ¿por qué minSdkVersion y targetSdkVersion se especifican tanto en AndroidManifest.xml como en build.gradle?

103

Acabo de descubrir algo extraño sobre Android Studio: tiene algunas opciones de configuración en el build.gradlearchivo que anulan lo que se especifica en el AndroidManifest.xmlarchivo.

Por ejemplo, tenía las siguientes líneas en build.gradle:

android {
    compileSdkVersion 18
    buildToolsVersion "18.1.1"

    defaultConfig {
        minSdkVersion 10
        targetSdkVersion 10
    }
...
}

que estaba anulando la etiqueta correspondiente en AndroidManifest.xml:

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

Realmente no me gusta tener la misma configuración distribuida en dos archivos diferentes, por lo que me pregunto si puedo eliminarla de forma segura, ya sea de build.gradleo AndroidManifest.xmly dónde tiene más sentido guardarla.

mariosangiorgio
fuente

Respuestas:

111

Gradle anula los valores del manifiesto y prefiero actualizar el build.gradlearchivo en lugar del manifiesto. Probablemente esta sea la forma correcta de usar Gradle. Gradle admite sabores de productos que se pueden controlar a través de un IDE y esos sabores de productos pueden cambiar muchas cosas en nuestro manifiesto, como el nombre del paquete, el código de la versión, el nombre de la versión, el SDK de destino y muchos otros. Luego, con un clic en Android Studio, puede cambiar muchas propiedades y generar otra apk.

Puede dejar el manifiesto como está y realizar toda la configuración en build.gradle. Puede eliminar de forma segura

<uses-sdk></uses-sdk>

tanto del manifiesto como de los códigos de versión.

mar3kk
fuente
3
Para cualquiera que se pregunte, si usa apktool para descomprimir un APK construido como este, en realidad no verá minSdkVersion en el AndroidManifest. No sé a dónde va, ¡pero hace lo correcto (lo confirmé subiendo a Google Play)!
Dan J
6
Extraño. Parece que Google decide el minSDK por la API que llama nuestra aplicación. Aunque mi aplicación / build.gradle especifica que minSDK sea Android 2.2, en Google Play dice minSDK = Android 1.6. Y sí, el AndroidManifest.xml descompilado no contiene información de minSDK. Creo que esto es un problema, ya que nos "obliga" a admitir también dispositivos con Android 1.6.
sancho21
1
La barra lateral aquí: developer.android.com/guide/topics/manifest/… sugiere que Play todavía usa el manifiesto de alguna manera. ¿Tal vez gradle lo reinsertó detrás de escena antes de la compilación del APK?
jordanpg
4
Asi es como funciona. Gradle insertará la información faltante para manifestar durante la compilación.
mar3kk
5
@ sancho21 Este es un error conocido en la tienda Google Play durante las pruebas alfa y beta. Debería resolverse cuando presiona para prod. No es una fuente autorizada, pero consulte answers.unity3d.com/questions/683972/…
Tom Lubitz
0

De los documentos de Android:

Nota: Si su aplicación define la versión de la aplicación directamente en el elemento, los valores de la versión en el archivo de compilación de Gradle anularán la configuración en el manifiesto. Además, definir estas configuraciones en los archivos de compilación de Gradle le permite especificar diferentes valores para diferentes versiones de su aplicación. Para una mayor flexibilidad y para evitar una posible sobrescritura cuando se fusiona el manifiesto, debe eliminar estos atributos del elemento y definir la configuración de su versión en los archivos de compilación de Gradle.

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

CUENTO
fuente
Creo que de esa parte estaba hablando versionCode . Debería haber citado el siguiente en la Specify API level requirementssección
Largo