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

525

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

Todo lo que dice es:

La compileSdkVersionpropiedad especifica el objetivo de compilación.

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

Veo dos formas posibles de interpretar esto:

  1. compileSdkVersiones la versión del compilador utilizada en la creación de la aplicación, mientras que targetSdkVersiones el "nivel API al que se dirige la aplicación" . (Si este fuera el caso, supongo que compileSdkVersiondebe ser mayor o igual que targetSdkVersion?
  2. Quieren decir 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 ya se ha hecho antes, pero la única respuesta solo cita el documento, que es lo que no está claro para mí.

coder123
fuente
2
targetSdkVersion es lo que está ejecutando su dispositivo. Entonces, si sus dispositivos se ejecutan por debajo de Oreo, entonces no apunte a 27.
IgorGanapolsky

Respuestas:

546

compileSdkVersion

Esta compileSdkVersiones la versión de la API con la que se compila la aplicación. Esto significa que puede usar las características de la API de Android incluidas en esa versión de la API (así como todas las versiones anteriores, obviamente). Si intenta utilizar las características de API 16 pero se establece compileSdkVersionen 15, obtendrá un error de compilación. Si establece compileSdkVersion16, aún puede ejecutar la aplicación en un dispositivo API 15 siempre que las rutas de ejecución de su aplicación no intenten invocar ninguna API específica para API 16.

targetSdkVersion

No targetSdkVersiontiene nada que ver con cómo se compila su aplicación o qué API puede utilizar. Se targetSdkVersionsupone que indica que ha probado su aplicación en (presumiblemente hasta) 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 dice la documentación :

Por ejemplo, establecer este valor en "11" o superior permite que el sistema aplique un nuevo tema predeterminado (Holo) a su 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 su aplicación se estiliza o se ejecuta de otro modo 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 fines prácticos, la mayoría de las aplicaciones querrán configurar targetSdkVersionla última versión lanzada 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 minSdkVersion.

Jeff Mixon
fuente
14
No, targetSdkVersionmuy probablemente será más alto compileSdkVersiony con razón. Esto significa que, aunque diseñó una aplicación para apuntar a API 16, por ejemplo, todavía funciona bien en API 21 (Lollipop) y debe targetSdkVersionpasar a 21 para indicar que está bien que el sistema operativo Android aplique cualquier estilo de Lollipop que pueda existe para su aplicación.
Jeff Mixon el
24
Básicamente, no entiendo cómo podría apuntar a un SDK más alto que el SDK con el que compiló.
coder123
55
Cambiar compileSdkVersiona una versión superior significaría que desea utilizar algunas API nuevas que solo se incluyen en esa versión en particular. Si no planea usar ninguna característica específica de Lollipop en su aplicación, entonces realmente (por lo general) no hay razón para establecerla compileSdkVersionen 21. Sin embargo, es probable que su aplicación funcione bien en API 21 tal como está, por lo que cambia targetSdkVersionpara indicar que su aplicación se ejecuta como espera (objetivo) en API 21, pero no está utilizando ninguna API específica para 21 (compilación) y, por lo tanto, compileSdkVersionpuede permanecer en 15 en este ejemplo.
Jeff Mixon
19
Se informa una advertencia cuando hago eso en el estudio de Android. Tengo "compileSdkVersion 17" y "targetSdkVersion 22" y me dice que "targetSdkVersion no debe ser superior a compileSdkVersion". Oh, solo lo cambié y ahora me dice que targetSdkVersion no es el último 22 y que el modo de compatibilidad podría entrar en acción. Suspiro.
Pelpotronic
18
Esta respuesta contradice lo que dice Android Studio. targetSdkVersion importa y debe ser menor o igual que compileSdkVersion
ARK
152

Como guía oneliner:

minSdkVersion <= targetSdkVersion <= compileSdkVersion

Idealmente:

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

Lea más de esta gran publicación de Ian Lake

Jimmy Kane
fuente
¿ minSdkVersion Significa que se canejecuta la aplicación de nivel de API de dispositivo más bajo ? ¿Presumiblemente porque usa ciertas API disponibles a minSdkVersionpartir de ahora?
Nitin Bansal
1
@NitinBansal sí. Por ejemplo, si minSdkVersiones 15 (que es ICS 4.0.3), los dispositivos con API 14 (que es ICS 4.0) no deberían poder instalar la aplicación. Y al menos por ahora, la aplicación se ejecutará el 15, 16, 17, 18, 19, (20, pero eso es para el viejo sistema operativo), 21, 22, 23, 24, 25, 26, 27, 28, y así en el futuro (probablemente)
Louis Tsai
33

La compileSdkVersiondebería ser la versión estable más nueva. El targetSdkVersiondebe ser completamente probado y menos o igual a compileSdkVersion.

androidwifi
fuente
14
¿Alguna razón específica para decir que targetSdkVersion sea menor que compileSdkVersion? Creo que es una declaración equivocada
Sufian
66
Supongo que el punto es que la última versión es compatible con versiones anteriores, por lo que la última versión de API puede "comportarse" como las anteriores, si configura la versión anterior targetSdkVersion. Por lo tanto, targetSdkVersiondebe ser el que ha probado y conocer el comportamiento exacto, y puede ser <= la última versión estable.
Dielson Sales
Creo que su declaración ' compileSdkVersiondebería ser la versión estable más nueva' debería tener el sufijo 'de las cuales usa las características de la API'. No tiene sentido compilar con la API 27 (la última API estable de hoy) si solo usa características de versión de API más bajas. Sin embargo, la última versión estable podría incluir algunas características que mejoran automáticamente, por ejemplo, seguridad mejorada o compilación eficiente con compatibilidad con versiones anteriores. Por lo tanto, es aconsejable utilizar la última versión estable o al menos una versión estable reciente, pero "no debería" ser la última versión per se .
Erik
27

Al final del juego ... y hay varias respuestas excelentes arriba, esencialmente, esa compileSdkVersiones la versión de la API con la que se compila la aplicación, mientras que targetSdkVersionindica la versión con la que se probó la aplicación.

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

  1. Eso targetSdkVersionafecta la forma en que se solicitan los permisos :

    • Si el dispositivo ejecuta Android 6.0 (nivel de API 23) o superior, y la aplicación targetSdkVersiones 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 la aplicación targetSdkVersiones 22 o inferior, el sistema le pide al usuario que otorgue los permisos cuando el usuario instala la aplicación.
  2. Si compileSdkVersiones superior a la versión declarada por su aplicación targetSdkVersion, el sistema puede habilitar comportamientos de compatibilidad para garantizar que su aplicación continúe funcionando de la manera esperada. ( 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, aunque a targetSdkVersionmenudo es (inicialmente) menor que el compileSdkVersion, no es raro ver una aplicación bien mantenida / establecida contargetSdkVersion > compileSdkVersion
Austin D
fuente
55
Re: su segundo punto, no creo que el documento de referencias lo diga explícitamente. Dice "Sin embargo, si el nivel de API de la plataforma es superior a la versión declarada por targetSdkVersion de su aplicación, el sistema puede habilitar comportamientos de compatibilidad para garantizar que su aplicación continúe funcionando de la manera que espera". Creo que esto significa que si el nivel de API del dispositivo en el que está ejecutando es más nuevo que el suyo targetSdkVersion, puede ver comportamientos de compatibilidad. No creo que tenga nada que ver con el compileSdkVersion.
Jeremy
20

The CompileSdkVersion es la versión de la plataforma SDK con la que trabaja 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 API que está usando

ingrese la descripción de la imagen aquí

Verá esto en su build.gradlearchivo:

ingrese la descripción de la imagen aquí

targetSdkVersion:contiene la información que envía su aplicación DESPUÉS del proceso de desarrollo a la tienda de aplicaciones que lo permite TARGET the SPECIFIED version of the Android platform. Dependiendo de la funcionalidad de su aplicación, puede apuntar a versiones de API inferiores a la actual; por ejemplo, puede apuntar a API 18 incluso si la versión actual es 23.

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

Ojonugwa Jude Ochalifu
fuente
9

Veo muchas diferencias compiledSdkVersionen las respuestas anteriores, así que intentaré aclarar un poco aquí, siguiendo la página web de Android.

A - Lo que dice Android

De acuerdo con https://developer.android.com/guide/topics/manifest/uses-sdk-element.html :

Selección de una versión de plataforma y un nivel de API Cuando desarrolle su aplicación, deberá elegir la versión de plataforma con la que compilará la aplicación. En general, debe compilar su aplicación con la versión más baja posible de la plataforma que su aplicación puede admitir.

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 compilada más alta disponible. Se debe a que dependerán de las sugerencias de código para verificar si están utilizando características API más nuevas que minSdkVersion, por lo tanto, cambiar el código para no usarlas o verificar la versión de la API del usuario en tiempo de ejecución para usarlas condicionalmente con retrocesos para versiones API más antiguas.

Las sugerencias sobre usos obsoletos también aparecerían 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 su aplicación.

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

Si ya sabe qué hay de nuevo o viejo y está desarrollando una aplicación única que seguramente nunca se actualizará, o está seguro de que no va a ofrecer nuevas funciones API condicionalmente, entonces use la opción A. No se molestará con sugerencias desaprobadas y nunca podrá utilizar las nuevas funciones de la API, incluso si tiene la tentación de hacerlo.

CGodo
fuente
2
No creo que el consejo de Android sea diferente. Hay una diferencia entre "compilar su aplicación con la versión más baja posible" y compilar con una versión particular de SDK. En general, debe compilar (compileSdkVersion) con la última versión, establecer su min (minSdkVersion) lo más bajo posible y establecer su objetivo (targetSdkVersion) lo más alto posible, sujeto a pruebas u otros problemas de compatibilidad.
Caltor
Buen punto @ Caltor. Deseo que actualicen ese documento para aclarar la diferencia. La <uses-sdk>documentación es extremadamente vaga y ambigua.
Jeremy
2

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

En cuanto a la "versión de destino", simplemente se refiere a lo que planeó apuntar en primer lugar y que posiblemente haya probado. Si no ha realizado la diligencia debida, esta es la manera de informar a Android que necesita realizar algunas verificaciones adicionales antes de implementar su aplicación dirigida "Lollipop", digamos "Oreo".

Por lo tanto, la "versión de destino" obviamente no es inferior a su "versión mínima de SDK", pero no puede ser superior a su "versión compilada".

pcodex
fuente
1

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 compileSDKVersiony targetSDKVersion.

ingrese la descripción de la imagen aquí

sshturma
fuente
0

compiledSdkVersion ==> qué versión de SDK debe compilar su código para bytecode (que usa en el entorno de desarrollo) punto: es mejor usar la última versión de SDK.

minSdkVersion ==> estos usos de elementos para la instalación del APK (se utiliza en el entorno de producción). Por ejemplo:

if(client-sdk-version   <   min-sdk-versoin )
    client-can-not-install-apk;
else
    client-can-install-apk;
M.Namjo
fuente
0

Sumario rápido:

Para minSDKversion, consulte la última entrada en el identificador de Twitter: https://twitter.com/minSdkVersion

TargetSDKversion: vea la última entrada en el identificador de Twitter: https://twitter.com/targtSdkVersion o use el último nivel de API como se indica en el desarrollo https://developer.android.com/guide/topics/manifest/uses-sdk-element. html

Versión compilada: hazlo igual que TargetSDKversion

maxSdkVersion: el consejo de Android es no configurar esto, ya que no desea limitar su aplicación para que no funcione en futuras versiones de Android

kush
fuente
0

La configuración de la aplicación de las propiedades de un proyecto de Android en Visual Studio 2017 (15.8.5) las combina:

ingrese la descripción de la imagen aquí

Sam es
fuente