Qual è la differenza tra compileSdkVersion e targetSdkVersion?


525

Ho esaminato la documentazione per la costruzione con Gradle, ma non sono ancora sicuro di quale sia la differenza tra compileSdkVersione targetSdkVersion.

Tutto ciò che dice è:

La compileSdkVersionproprietà specifica il target di compilazione.

Bene, qual è il "target di compilazione"?

Vedo due possibili modi per interpretare questo:

  1. compileSdkVersionè la versione del compilatore utilizzata nella creazione dell'app, mentre targetSdkVersionè il "livello API a cui l'applicazione si rivolge" . (Se così fosse, suppongo che compileSdkVersiondebba essere maggiore o uguale a targetSdkVersion?
  2. Intendono la stessa cosa. "target di compilazione" == "il livello API a cui l'applicazione si rivolge"
  3. Qualcos'altro?

Vedo che questa domanda è stata posta prima, ma l'unica risposta cita solo il documento, il che non è chiaro per me.



2
targetSdkVersion è ciò che il tuo dispositivo è in esecuzione. Quindi, se i tuoi dispositivi funzionano a un livello inferiore a Oreo, non
scegliere come

Risposte:


546

compileSdkVersion

La compileSdkVersionè la versione delle API dell'app è compilato contro. Ciò significa che puoi utilizzare le funzionalità dell'API Android incluse in quella versione dell'API (oltre a tutte le versioni precedenti, ovviamente). Se si tenta di utilizzare le funzionalità API 16 ma si imposta compileSdkVersionsu 15, verrà visualizzato un errore di compilazione. Se si imposta compileSdkVersionsu 16, è comunque possibile eseguire l'app su un dispositivo API 15 purché i percorsi di esecuzione dell'app non tentino di invocare API specifiche per l'API 16.

targetSdkVersion

Non targetSdkVersionha nulla a che fare con il modo in cui viene compilata l'app o quali API è possibile utilizzare. Si targetSdkVersionsuppone che indichi che hai testato la tua app (presumibilmente fino alla versione inclusa). È più simile a una certificazione o firma che stai dando al sistema operativo Android come un suggerimento su come dovrebbe gestire la tua app in termini di funzionalità del sistema operativo.

Ad esempio, come indicato nella documentazione :

Ad esempio, l'impostazione di questo valore su "11" o superiore consente al sistema di applicare un nuovo tema predefinito (Holo) alla tua app durante l'esecuzione su Android 3.0 o versioni successive ...

Il sistema operativo Android, in fase di esecuzione , può modificare il modo in cui l'app viene stilizzata o altrimenti eseguita nel contesto del sistema operativo in base a questo valore. Ci sono alcuni altri esempi noti che sono influenzati da questo valore e che l'elenco probabilmente aumenterà solo nel tempo.

Per tutti gli scopi pratici, la maggior parte delle app vorrà impostare targetSdkVersionl'ultima versione rilasciata dell'API. Questo assicurerà che la tua app sia il più bella possibile sui dispositivi Android più recenti. Se non si specifica targetSdkVersion, il valore predefinito è minSdkVersion.


14
No, targetSdkVersionmolto probabilmente sarà superiore compileSdkVersione giustamente. Ciò significa che, sebbene tu abbia progettato un'app per l'API di destinazione 16, ad esempio, funziona ancora bene sull'API 21 (Lollipop) e dovresti targetSdkVersionpassare a 21 per indicare che va bene per il sistema operativo Android applicare tutti gli stili di Lollipop che potrebbero esiste nella tua app.
Jeff Mixon,

24
Fondamentalmente, non capisco come potresti scegliere come target un SDK superiore all'SDK che hai compilato.
coder123,

55
Passare compileSdkVersiona una versione successiva significherebbe voler utilizzare alcune nuove API incluse solo in quella versione specifica. Se non prevedi di utilizzare funzionalità specifiche di Lollipop nella tua app, allora non c'è davvero (di solito) alcun motivo per impostare mai compileSdkVersionsu 21. Tuttavia, la tua app probabilmente funzionerà perfettamente sull'API 21 così com'è, quindi cambi targetSdkVersionper indicare che la tua app viene eseguita come previsto (target) su API 21, ma non stai utilizzando API specifiche per 21 (compilazione) e quindi compileSdkVersionpuoi rimanere a 15 in questo esempio.
Jeff Mixon,

19
Un avviso viene segnalato quando lo faccio in Android Studio. Ho "compileSdkVersion 17" e "targetSdkVersion 22" e mi dice "targetSdkVersion non dovrebbe essere superiore a compileSdkVersion". Oh, l'ho appena cambiato e ora mi sta dicendo che targetSdkVersion non è l'ultimo 22 e che la modalità di compatibilità potrebbe attivarsi. Sigh.
Pelpotronic,

18
Questa risposta contraddice ciò che dice Android Studio. targetSdkVersion è importante e dovrebbe essere inferiore o uguale alla compilazioneSkkVersion
ARK

152

Come guida oneliner:

minSdkVersion <= targetSdkVersion <= compileSdkVersion

Idealmente:

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

Leggi di più da questo fantastico post di Ian Lake


Significa che viene eseguita l' minSdkVersion app a livello di dispositivo api più bassa can? Presumibilmente perché utilizza determinate API disponibili minSdkVersionin seguito?
Nitin Bansal,

1
@NitinBansal sì. Ad esempio, se minSdkVersionè 15 (che è ICS ​​4.0.3), i dispositivi con API 14 (che è ICS ​​4.0) non dovrebbero essere in grado di installare l'app. E almeno per ora, l'app funzionerà il 15, 16, 17, 18, 19, (20 ma è per il vecchio sistema operativo), 21, 22, 23, 24, 25, 26, 27, 28 e così via in futuro (probabilmente)
Louis Tsai,

33

Il compileSdkVersiondovrebbe essere più recente versione stabile. Il targetSdkVersiondovrebbe essere interamente testati e minore o uguale a compileSdkVersion.


14
Qualche motivo specifico per dire che targetSdkVersion è inferiore a compileSdkVersion? Credo che sia un'affermazione sbagliata
Sufian,

6
Immagino che il punto sia che l'ultima versione è retrocompatibile, quindi l'ultima versione dell'API può "comportarsi" come una precedente, se la imposti targetSdkVersionsu una inferiore. Quindi targetSdkVersiondovrebbe essere quello che hai testato e conoscere il comportamento esatto e può essere <= l'ultimo stabile.
Vendite Dielson,

Penso che la tua affermazione " compileSdkVersiondovrebbe essere la versione stabile più recente" dovrebbe essere suffissata con "di cui usi le funzionalità API". Non ha senso compilare contro API 27 (l'ultima API stabile di oggi) se si utilizzano solo funzionalità di versione API inferiori. Tuttavia, l'ultima versione stabile potrebbe includere alcune funzionalità che diventano automaticamente migliori, ad esempio sicurezza avanzata o compilazione efficiente con compatibilità con le versioni precedenti. Pertanto è consigliabile utilizzare la versione stabile più recente o almeno recente, ma "dovrebbe [non] essere" la versione più recente in .
Erik,

27

Verso la fine del gioco ... e ci sono molte grandi risposte sopra - essenzialmente, che compileSdkVersionè la versione dell'API su cui viene compilata l'app, mentre targetSdkVersionindica la versione contro cui l'app è stata testata.

Vorrei integrare queste risposte con le seguenti note:

  1. Ciò targetSdkVersioninfluisce sul modo in cui sono richieste le autorizzazioni :

    • Se il dispositivo esegue Android 6.0 (livello API 23) o successivo e l'app targetSdkVersionè 23 o superiore, l'app richiede autorizzazioni all'utente in fase di esecuzione.
    • Se sul dispositivo è installato Android 5.1 (livello API 22) o precedente o se l'app targetSdkVersionè 22 o precedente, il sistema chiede all'utente di concedere le autorizzazioni quando l'utente installa l'app.
  2. Se la versione compileSdkVersionè superiore alla versione dichiarata dall'app targetSdkVersion, il sistema potrebbe abilitare comportamenti di compatibilità per garantire che l'app continui a funzionare come previsto. ( rif )

  3. Con ogni nuova versione di Android ...

    • targetSdkVersion dovrebbe essere incrementato per corrispondere al livello API più recente, quindi testare accuratamente l'applicazione sulla versione della piattaforma corrispondente
    • compileSdkVersion, d'altra parte, non deve essere modificato a meno che non si aggiungano funzionalità esclusive alla nuova versione della piattaforma
    • Di conseguenza, sebbene targetSdkVersionspesso (inizialmente) sia inferiore a quello compileSdkVersion, non è raro vedere un'app ben mantenuta / consolidata contargetSdkVersion > compileSdkVersion

5
Ri: il tuo secondo punto, non credo che il documento di riferimenti lo dica esplicitamente. Dice "Tuttavia, se il livello API della piattaforma è superiore alla versione dichiarata da targetSdkVersion della tua app, il sistema potrebbe abilitare comportamenti di compatibilità per garantire che la tua app continui a funzionare come previsto". Penso che ciò significhi che se il livello API del dispositivo su cui stai eseguendo è più recente del tuo, targetSdkVersionpotresti vedere comportamenti di compatibilità. Non credo che abbia nulla a che fare con il compileSdkVersion.
Jeremy,

20

The CompileSdkVersion è la versione della piattaforma SDK utilizzata dalla tua app per la compilazione, ecc. DURANTE il processo di sviluppo (dovresti sempre utilizzare l'ultima) Viene fornito con la versione dell'API che stai utilizzando

inserisci qui la descrizione dell'immagine

Vedrai questo nel tuo build.gradlefile:

inserisci qui la descrizione dell'immagine

targetSdkVersion:contiene le informazioni fornite dalla tua app DOPO il processo di sviluppo all'app store che le consente TARGET the SPECIFIED version of the Android platform. A seconda della funzionalità della tua app, può scegliere come target versioni API inferiori alla corrente. Ad esempio, puoi scegliere come target API 18 anche se la versione corrente è 23.

Dai un'occhiata a questa pagina ufficiale di Google .


9

Vedo molte differenze compiledSdkVersionnelle risposte precedenti, quindi cercherò di chiarire un po 'qui, seguendo la pagina web di Android.

A - Cosa dice Android

Secondo https://developer.android.com/guide/topics/manifest/uses-sdk-element.html :

Selezione di una versione della piattaforma e del livello API Quando si sviluppa l'applicazione, sarà necessario scegliere la versione della piattaforma in base alla quale compilare l'applicazione. In generale, è necessario compilare l'applicazione con la versione più bassa possibile della piattaforma supportata dall'applicazione.

Quindi, questo sarebbe l'ordine giusto secondo Android:

compiledSdkVersion = minSdkVersion <= targetSdkVersion

B - Quello che dicono anche gli altri

Alcune persone preferiscono utilizzare sempre la versione compilata più alta disponibile. È perché si affideranno ai suggerimenti sul codice per verificare se stanno utilizzando funzionalità API più recenti rispetto a minSdkVersion, quindi cambiando il codice per non usarle o controllando la versione dell'API utente in fase di runtime per usarle condizionalmente con fallback per versioni API precedenti.

Nel codice compaiono anche suggerimenti sugli usi deprecati, che ti informano che qualcosa è deprecato nei livelli API più recenti, quindi puoi reagire di conseguenza se lo desideri.

Quindi, questo sarebbe l'ordine giusto secondo gli altri:

minSdkVersion <= targetSdkVersion <= compiledSdkVersion (highest possible)

Cosa fare?

Dipende da te e dalla tua app.

Se si prevede di offrire funzionalità API diverse in base al livello API dell'utente in fase di esecuzione, utilizzare l'opzione B. Riceverai suggerimenti sulle funzionalità utilizzate durante la codifica. Assicurati di non utilizzare mai le funzionalità API più recenti di minSdkVersion senza controllare il livello API dell'utente in fase di esecuzione, altrimenti la tua app andrà in crash. Questo approccio ha anche il vantaggio di apprendere ciò che è nuovo e ciò che è vecchio durante la programmazione.

Se sai già cosa c'è di nuovo o di vecchio e stai sviluppando un'app unica che sicuramente non verrà mai aggiornata, o sei sicuro che non offrirai nuove funzionalità API in modo condizionale, quindi usa l'opzione A. Non ti preoccuperai con suggerimenti obsoleti e non sarai mai in grado di utilizzare le funzionalità API più recenti anche se sei tentato di farlo.


2
Non credo che i consigli di Android siano diversi. C'è una differenza tra "compilare la tua applicazione con la versione più bassa possibile" e compilare con una particolare versione dell'SDK. Generalmente dovresti compilare (compileSdkVersion) con la versione più recente, impostare il tuo min (minSdkVersion) il più basso possibile e impostare il tuo target (targetSdkVersion) il più alto possibile soggetto a test o altri problemi di compatibilità.
Caltor,

Buon punto @Caltor. Vorrei che aggiornassero quel documento per chiarire la differenza. La <uses-sdk>documentazione è estremamente vaga e ambigua.
Jeremy,

2

I miei 2 centesimi: compila contro qualsiasi versione dell'SDK, ma fai attenzione a non chiamare alcuna API che la tua "versione minima dell'SDK" non supporta. Ciò significa che "potresti" compilare con l'ultima versione dell'SDK.

Per quanto riguarda la "versione di destinazione", si riferisce semplicemente a ciò che avevi pianificato come target in primo luogo e che probabilmente hai provato. Se non hai fatto la dovuta diligenza, questo è il modo per informare Android che deve eseguire alcuni controlli aggiuntivi prima che distribuisca le tue app "Lollipop" su "Oreo".

Quindi la "versione di destinazione" non è ovviamente inferiore alla tua "versione minima dell'SDK" ma non può essere superiore alla tua "versione compilata".


1

Non rispondendo alle tue domande dirette, poiché ci sono già molte risposte dettagliate, ma vale la pena ricordare che, contrariamente alla documentazione di Android, Android Studio suggerisce di utilizzare la stessa versione per compileSDKVersione targetSDKVersion.

inserisci qui la descrizione dell'immagine


0

compiledSdkVersion ==> quale versione di SDK dovrebbe compilare il codice in bytecode (utilizza nell'ambiente di sviluppo) punto: è meglio usare l'ultima versione di SDK.

minSdkVersion ==> questo articolo utilizza per l'installazione di APK (utilizza nell'ambiente di produzione). Per esempio:

if(client-sdk-version   <   min-sdk-versoin )
    client-can-not-install-apk;
else
    client-can-install-apk;

0

Riepilogo rapido:

Per minSDKversion, vedere l'ultima voce nell'handle di Twitter: https://twitter.com/minSdkVersion

TargetSDKversion: vedi l'ultima voce nell'handle di Twitter: https://twitter.com/targtSdkVersion o usa l'ultimo livello API come indicato su devel https://developer.android.com/guide/topics/manifest/uses-sdk-element. html

Versione compilata: rendilo uguale a TargetSDKversion

maxSdkVersion: il consiglio di Android è di non impostare questo in quanto non si desidera limitare la propria app in modo che non funzioni sulle future versioni di Android


0

Le impostazioni dell'applicazione delle proprietà di un progetto Android in Visual Studio 2017 (15.8.5) le hanno combinate:

inserisci qui la descrizione dell'immagine

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.