¿Cuál es la diferencia entre compileSdkVersion y targetSdkVersion?


He mirado la documentación para compilar con Gradle, pero todavía no estoy seguro de cuál es la diferencia entre compileSdkVersion y targetSdkVersion.

Todo lo que dice es:

La propiedad compileSdkVersion especifica el destino de compilación.

Bueno, ¿cuál es el "objetivo de compilación"?

Veo dos maneras posibles de interpretar esto:

  1. compileSdkVersion es la versión del compilador que se utiliza para compilar la aplicación, mientras que targetSdkVersion es el nivel de API objetivos de la aplicación " . (Si este fuera el caso, asumiría compileSdkVersion debe ser mayor o igual a la targetSdkVersion?
  2. Significan lo mismo. "objetivo de compilación" = = "el nivel de API al que se dirige la aplicación"
  3. Algo más?

Veo que esta pregunta se ha hecho antes, pero la única respuesta solo cita al doc, que es lo que no me queda claro.

Author: Community, 2014-11-02

9 answers

CompileSdkVersion

El compileSdkVersion es la versión de la API con la que se compila la aplicación. Esto significa que puedes usar las funciones de la API de Android incluidas en esa versión de la API (así como todas las versiones anteriores, obviamente). Si intenta usar las características de la API 16 pero establece compileSdkVersion en 15, obtendrá un error de compilación. Si establece compileSdkVersion en 16, todavía puede ejecutar la aplicación en un dispositivo API 15, siempre y cuando las rutas de ejecución de la aplicación no intenten invocar ninguna API específica de la API 16.

TargetSdkVersion

El targetSdkVersion no tiene nada que ver con cómo se compila su aplicación o qué API puede utilizar. El targetSdkVersion se supone que indica que ha probado su aplicación en (presumiblemente hasta e incluyendo) la versión que especifique. Esto es más como una certificación o cierre de sesión que le está dando al sistema operativo Android como una pista sobre cómo debe manejar su aplicación en términos de características del sistema operativo.

Por ejemplo, como la documentación dice:

Para por ejemplo, establecer este valor en "11" o superior permite que el sistema aplique un nuevo tema predeterminado (Holo) a tu aplicación cuando se ejecuta en Android 3.0 o superior...

El sistema operativo Android, en tiempo de ejecución, puede cambiar la forma en que se estiliza o ejecuta la aplicación en el contexto del sistema operativo en función de este valor. Hay algunos otros ejemplos conocidos que están influenciados por este valor y es probable que esa lista solo aumente con el tiempo.

Para todos los propósitos prácticos, la mayoría de las aplicaciones son va a querer establecer targetSdkVersion a la última versión publicada de la API. Esto asegurará que su aplicación se vea lo mejor posible en los dispositivos Android más recientes. Si no especifica el targetSdkVersion, el valor predeterminado es el minSdkVersion.

 429
Author: Jeff Mixon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-01 23:17:30

Como una guía única:

minSdkVersion <= targetSdkVersion <= compileSdkVersion

Idealmente:

minSdkVersion (lowest possible) <= targetSdkVersion == compileSdkVersion (latest SDK)

Leer más de este gran post de Ian Lake

 115
Author: Jimmy Kane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-15 19:03:55

El compileSdkVersion debe ser la versión estable más reciente. El targetSdkVersion debe someterse a ensayo completo y ser inferior o igual a compileSdkVersion.

 29
Author: androidwifi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-27 17:49:11

Tarde al juego.. y hay varias respuestas excelentes arriba essentially esencialmente, que la compileSdkVersion es la versión de la API contra la que se compila la aplicación, mientras que la targetSdkVersion indica la versión contra la que se probó la aplicación.

Me gustaría complementar esas respuestas con las siguientes notas:

  1. Que targetSdkVersion afecta la forma en que se solicitan los permisos :

    • Si el dispositivo ejecuta Android 6.0 (nivel de API 23) o superior, y el targetSdkVersion de la aplicación es 23 o superior, la aplicación solicita permisos al usuario en tiempo de ejecución.
    • Si el dispositivo ejecuta Android 5.1 (nivel de API 22) o inferior, o el targetSdkVersion de la aplicación es 22 o inferior, el sistema le pide al usuario que conceda los permisos cuando instale la aplicación.
  2. Si compileSdkVersion es mayor que la versión declarada por targetSdkVersion de la aplicación, el sistema puede habilitar comportamientos de compatibilidad para garantizar que la aplicación continúe trabaja como esperas. (ref)

  3. Con cada nueva versión de Android...

    • targetSdkVersion debe incrementarse para que coincida con el último nivel de API, luego pruebe a fondo su aplicación en la versión de plataforma correspondiente
    • compileSdkVersion, por otro lado, no necesita ser cambiado a menos que esté agregando características exclusivas a la nueva versión de la plataforma
    • Como resultado, mientras que targetSdkVersion es a menudo (inicialmente) menor que el compileSdkVersion, no es raro que ver una aplicación bien mantenida/establecida con targetSdkVersion > compileSdkVersion
 21
Author: Austin D,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-02 23:09:30

The CompileSdkVersion es la versión de la plataforma SDK con la que funciona su aplicación para la compilación, etc. DURANTE el proceso de desarrollo (siempre debe usar la última) Esto se envía con la versión de API que está utilizando

introduzca la descripción de la imagen aquí

Verá esto en su archivo build.gradle:

introduzca la descripción de la imagen aquí

targetSdkVersion: contiene la información que su aplicación envía después del proceso de desarrollo a la tienda de aplicaciones que le permite TARGET the SPECIFIED version of the Android platform. Dependiendo de la funcionalidad de su aplicación, puede dirigirse Versiones de API inferiores a la actual.Por ejemplo, puede dirigirse a API 18 incluso si la versión actual es 23.

Echa un buen vistazo a esta página oficial de Google .

 18
Author: ojonugwa ochalifu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-18 20:24:36

Veo muchas diferencias sobre compiledSdkVersion en las respuestas anteriores, así que voy a tratar de aclarar un poco aquí, siguiendo la página web de Android.

A - Lo que dice Android

Según https://developer.android.com/guide/topics/manifest/uses-sdk-element.html:

Seleccionar una versión de plataforma y un nivel de API Cuando se está desarrollando su aplicación, tendrá que elegir la versión de la plataforma contra que va a compilar la aplicación. En general, debe compilar su aplicación contra la versión más baja posible de la plataforma que su aplicación puede soportar.

Entonces, este sería el orden correcto según Android:

compiledSdkVersion = minSdkVersion <= targetSdkVersion

B-Lo que otros también dicen

Algunas personas prefieren usar siempre la versión COMPILEDSKD más alta disponible. Se debe a que confiarán en sugerencias de código para verificar si están utilizando características de API más nuevas que minSdkVersion, por lo tanto cambiar el código para no usarlos o verificar la versión de la API de usuario en tiempo de ejecución para usarlos condicionalmente con alternativas para versiones anteriores de la API.

Las sugerencias sobre usos obsoletos también aparecen en el código, lo que le permite saber que algo está obsoleto en los niveles de API más nuevos, para que pueda reaccionar en consecuencia si lo desea.

Entonces, este sería el orden correcto según otros:

minSdkVersion <= targetSdkVersion <= compiledSdkVersion (highest possible)

Qué hacer?

Depende de usted y de su app.

Si planea ofrecer diferentes características de la API de acuerdo con el nivel de API del usuario en tiempo de ejecución, use la opción B. Obtendrá sugerencias sobre las características que usa mientras codifica. Solo asegúrese de nunca usar funciones de API más nuevas que minSdkVersion sin verificar el nivel de API de usuario en tiempo de ejecución, de lo contrario, su aplicación se bloqueará. Este enfoque también tiene el beneficio de aprender lo que es nuevo y lo que es viejo mientras se codifica.

Si ya sabes lo que es nuevo o viejo y estás desarrollando una aplicación de una sola vez eso seguro que nunca se actualizará, o está seguro de que no va a ofrecer nuevas características de la API condicionalmente, luego use la opción A. No se molestará con sugerencias obsoletas y nunca podrá usar características de la API más nuevas, incluso si está tentado a hacerlo.

 6
Author: CGodo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-12 11:11:16

Mis 2 centavos: Compile con cualquier versión del SDK, pero tenga cuidado de no llamar a ninguna API que su "versión mínima del SDK" no admita. Eso significa que "podría" compilar contra la última versión del SDK.

En cuanto a la "versión de destino" simplemente se refiere a lo que planeaste apuntar en primer lugar y posiblemente has probado contra. Si no has hecho la diligencia debida, esta es la manera de informar a Android de que necesita realizar algunas comprobaciones adicionales antes de implementar tu digamos" Lollipop "aplicación dirigida en "Oreo".

Así que la "versión de destino" obviamente no es menor que su "versión mínima del SDK", pero no puede ser mayor que su "versión compilada".

 1
Author: Prab,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-16 02:51:04

No responde a sus preguntas directas, ya que ya hay muchas respuestas detalladas, pero vale la pena mencionar, que al contrario de la documentación de Android, Android Studio sugiere usar la misma versión para compileSDKVersion y targetSDKVersion.

introduzca la descripción de la imagen aquí

 1
Author: sshturma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-12 03:03:41

La configuración de la aplicación de las propiedades de un proyecto Android en Visual Studio 2017 (15.8.5) parece tenerlas combinadas o algo así:

introduzca la descripción de la imagen aquí

 0
Author: samis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-21 12:50:45