Quando si tratta di sviluppare applicazioni per Android, qual è la differenza tra la versione Min e Target SDK? Eclipse non mi permetterà di creare un nuovo progetto a meno che le versioni Min e Target siano uguali!
Quando si tratta di sviluppare applicazioni per Android, qual è la differenza tra la versione Min e Target SDK? Eclipse non mi permetterà di creare un nuovo progetto a meno che le versioni Min e Target siano uguali!
Risposte:
Android: minSdkVersion
Un numero intero che designa il livello API minimo richiesto per l'esecuzione dell'applicazione. Il sistema Android impedirà all'utente di installare l'applicazione se il livello API del sistema è inferiore al valore specificato in questo attributo. Dovresti sempre dichiarare questo attributo.
Android: targetSdkVersion
Un numero intero che designa il livello API a cui l'applicazione si rivolge.
Con questo attributo impostato, l'applicazione afferma che è in grado di funzionare su versioni precedenti (fino a minSdkVersion), ma è stato esplicitamente testato per funzionare con la versione specificata qui. La specifica di questa versione di destinazione consente alla piattaforma di disabilitare le impostazioni di compatibilità che non sono necessarie per la versione di destinazione (che potrebbero altrimenti essere attivate per mantenere la compatibilità futura) o di abilitare le nuove funzionalità che non sono disponibili per le applicazioni precedenti. Ciò non significa che è possibile programmare diverse funzionalità per diverse versioni della piattaforma: informa semplicemente la piattaforma che è stata testata rispetto alla versione di destinazione e la piattaforma non dovrebbe eseguire alcun lavoro aggiuntivo per mantenere la compatibilità futura con la versione di destinazione.
Per ulteriori informazioni, consultare questo URL:
http://developer.android.com/guide/topics/manifest/uses-sdk-element.html
Il commento postato dall'OP alla domanda (in sostanza affermando che targetSDK non influisce sulla compilazione di un'app) è completamente sbagliato! Mi dispiace essere schietto.
In breve, ecco lo scopo di dichiarare un targetSDK diverso dal minSDK: significa che stai utilizzando funzionalità di un SDK di livello superiore rispetto al minimo, ma hai assicurato la compatibilità con le versioni precedenti . In altre parole, immagina di voler utilizzare una funzione che è stata introdotta solo di recente, ma che non è fondamentale per la tua applicazione. Dovresti quindi impostare targetSDK sulla versione in cui è stata introdotta questa nuova funzionalità e il minimo su qualcosa di inferiore in modo che tutti possano ancora utilizzare la tua app.
Per fare un esempio, supponiamo che tu stia scrivendo un'app che fa ampio uso del rilevamento dei gesti. Tuttavia, ogni comando che può essere riconosciuto da un gesto può essere eseguito anche da un pulsante o dal menu. In questo caso, i gesti sono un "bel extra" ma non sono richiesti. Pertanto, impostare sdk di destinazione su 7 ("Eclair" quando è stata introdotta la libreria GestureDetection) e il minimo SDK su livello 3 ("Cupcake") in modo che anche le persone con telefoni molto vecchi possano utilizzare la tua app. Tutto quello che dovresti fare è assicurarti che la tua app abbia verificato la versione di Android su cui era in esecuzione prima di provare a utilizzare la libreria dei gesti, per evitare di provare a usarla se non esistesse. (È vero che questo è un esempio datato poiché quasi nessuno ha ancora un telefono v1.5, ma c'è stato un tempo in cui mantenere la compatibilità con v1.
Per fare un altro esempio, è possibile utilizzare questo se si desidera utilizzare una funzionalità di Gingerbread o Honeycomb. Alcune persone riceveranno presto gli aggiornamenti, ma molte altre, in particolare con hardware precedente, potrebbero rimanere bloccate con Eclair fino a quando non acquistano un nuovo dispositivo. Ciò ti consentirebbe di utilizzare alcune delle nuove fantastiche funzionalità, ma senza escludere parte del tuo possibile mercato.
C'è un ottimo articolo dal blog dello sviluppatore Android su come utilizzare questa funzione e, in particolare, su come progettare il codice "controlla che la funzione esista prima di usarla" che ho menzionato sopra.
All'OP: l'ho scritto principalmente per il beneficio di chiunque capita di incappare in questa domanda in futuro, poiché mi rendo conto che la tua domanda è stata posta molto tempo fa.
Quando imposti targetSdkVersion = "xx", stai certificando che la tua app funziona correttamente (ad esempio, è stata accuratamente e correttamente testata) a livello di API xx.
Una versione di Android in esecuzione a un livello API superiore a xx applicherà automaticamente il codice di compatibilità per supportare tutte le funzionalità su cui potresti fare affidamento che erano disponibili al precedente livello API xx, ma che sono ora obsolete al livello superiore di quella versione Android.
Al contrario, se si sta utilizzando tutte le funzioni che sono diventati obsoleti in o prima a livello di xx, il codice di compatibilità sarà non essere applicata automaticamente da versioni del sistema operativo a livelli più alti di API (che non comprendono più quelle caratteristiche) per supportare tali usi. In tale situazione, il proprio codice deve avere clausole speciali di casi che prova il livello di API e, se il livello di sistema operativo rilevato è uno superiore che non ha più la funzione API data, il codice deve utilizzare funzioni alternative che sono disponibili presso i esecuzione del sistema operativo Livello API.
Se non riesce a farlo, alcune funzioni dell'interfaccia potrebbero semplicemente non apparire che normalmente attiverebbero eventi all'interno del tuo codice e potresti non avere una funzionalità di interfaccia critica di cui l'utente ha bisogno per attivare quegli eventi e accedere alle loro funzionalità (come nel esempio sotto).
Come indicato in altre risposte, è possibile impostare targetSdkVersion su un valore superiore a minSdkVersion se si desidera utilizzare alcune funzioni API inizialmente definite a livelli API superiori rispetto a minSdkVersion e si sono presi provvedimenti per assicurarsi che il codice sia in grado di rilevare e gestire l'assenza di tali funzionalità in livelli inferiori rispetto a targetSdkVersion.
Per avvertire gli sviluppatori di testare in modo specifico il livello minimo di API richiesto per utilizzare una funzione, il compilatore genererà un errore (non solo un avviso) se il codice contiene una chiamata a qualsiasi metodo definito a un livello API successivo rispetto a minSdkVersion, anche se targetSdkVersion è maggiore o uguale al livello API in cui il metodo è stato reso disponibile per la prima volta. Per rimuovere questo errore, la direttiva del compilatore
@TargetApi(nn)
dice al compilatore che il codice che rientra nell'ambito di applicazione di tale direttiva (che precederà un metodo o una classe) è stato scritto per testare un livello API di almeno nn prima di chiamare qualsiasi metodo che dipende dal fatto di avere almeno quel livello API . Ad esempio, il codice seguente definisce un metodo che può essere chiamato dal codice all'interno di un'app che ha una minSdkVersion inferiore a 11 e una targetSdkVersion di 11 o superiore:
@TargetApi(11)
public void refreshActionBarIfApi11OrHigher() {
//If the API is 11 or higher, set up the actionBar and display it
if(Build.VERSION.SDK_INT >= 11) {
//ActionBar only exists at API level 11 or higher
ActionBar actionBar = getActionBar();
//This should cause onPrepareOptionsMenu() to be called.
// In versions of the API prior to 11, this only occurred when the user pressed
// the dedicated menu button, but at level 11 and above, the action bar is
// typically displayed continuously and so you will need to call this
// each time the options on your menu change.
invalidateOptionsMenu();
//Show the bar
actionBar.show();
}
}
Si potrebbe anche voler dichiarare un targetSdkVersion più elevato se si fosse provato a quel livello più elevato e tutto ha funzionato, anche se sono stati non utilizzano tutte le funzioni da un livello di API superiore al vostro minSdkVersion. Questo sarebbe solo per evitare il sovraccarico di accedere al codice di compatibilità destinato ad adattarsi dal livello target fino al livello minimo, dal momento che si sarebbe confermato (attraverso i test) che tale adattamento non era richiesto.
Un esempio di una funzionalità dell'interfaccia utente che dipende dalla destinazione targetSdkVersion sarebbe il pulsante del menu a tre punti verticali che appare sulla barra di stato delle app con targetSdkVersion inferiore a 11, quando tali app sono in esecuzione con API 11 e successive. Se la tua app ha una targetSdkVersion di 10 o inferiore, si presume che l'interfaccia della tua app dipenda dall'esistenza di un pulsante di menu dedicato, quindi il pulsante a tre punti sembra prendere il posto dell'hardware dedicato precedente e / o delle versioni su schermo di quel pulsante (ad esempio, come si vede in Gingerbread) quando il sistema operativo ha un livello API più elevato per il quale non è più previsto un pulsante di menu dedicato sul dispositivo. Tuttavia, se imposti targetSdkVersion della tua app su 11 o superiore, si presume che tu abbia sfruttato le funzionalità introdotte a quel livello che sostituiscono il pulsante di menu dedicato (e. g., la barra delle azioni) o che hai altrimenti eluso la necessità di avere un pulsante del menu di sistema; di conseguenza, il "pulsante di compatibilità" del menu a tre punti verticali scompare. In tal caso, se l'utente non riesce a trovare un pulsante di menu, non può premerlo e ciò, a sua volta, significa che il comando onCreateOptionsMenu (menu) della tua attività potrebbe non essere mai richiamato, il che, a sua volta, significa che una parte significativa della funzionalità della tua app potrebbe essere privata della sua interfaccia utente. A meno che, naturalmente, non sia stata implementata la barra delle azioni o altri mezzi alternativi per consentire all'utente di accedere a queste funzionalità. non trova un pulsante menu, non può premerlo e ciò, a sua volta, significa che la sostituzione della tua attività onCreateOptionsMenu (menu) potrebbe non essere mai invocata, il che, a sua volta, significa che una parte significativa della funzionalità della tua app potrebbe essere privato della sua interfaccia utente. A meno che, naturalmente, non sia stata implementata la barra delle azioni o altri mezzi alternativi per consentire all'utente di accedere a queste funzionalità. non trova un pulsante menu, non può premerlo e ciò, a sua volta, significa che la sostituzione della tua attività onCreateOptionsMenu (menu) potrebbe non essere mai invocata, il che, a sua volta, significa che una parte significativa della funzionalità della tua app potrebbe essere privato della sua interfaccia utente. A meno che, naturalmente, non sia stata implementata la barra delle azioni o altri mezzi alternativi per consentire all'utente di accedere a queste funzionalità.
minSdkVersion, al contrario, afferma che la versione del sistema operativo di un dispositivo deve avere almeno quel livello API per eseguire la tua app. Ciò influisce su quali dispositivi sono in grado di vedere e scaricare la tua app quando si trova nell'app store di Google Play (e possibilmente anche in altri store di app). È un modo per affermare che l'app si basa su funzionalità del sistema operativo (API o altro) stabilite a quel livello e non ha un modo accettabile per gestire l'assenza di tali funzionalità.
Un esempio di utilizzo di minSdkVersion per garantire la presenza di una funzionalità non correlata all'API potrebbe essere l'impostazione di minSdkVersion su 8 per garantire che l'app venga eseguita solo su una versione abilitata per JIT dell'interprete Dalvik (dall'introduzione di JIT all'interprete Android a livello di API 8). Poiché le prestazioni di un interprete abilitato per JIT possono essere fino a cinque volte superiori a quelle che mancano di tale funzionalità, se l'app fa un uso intensivo del processore, potrebbe essere necessario richiedere il livello API 8 o superiore per garantire prestazioni adeguate.
Un concetto può essere fornito meglio con esempi, sempre . Ho avuto difficoltà a comprendere questi concetti fino a quando non ho approfondito il codice sorgente del framework Android e fatto alcuni esperimenti, anche dopo aver letto tutti i documenti nei siti degli sviluppatori Android e i relativi thread stackoverflow. Condividerò due esempi che mi hanno aiutato molto a comprendere appieno questi concetti.
Un DatePickerDialog avrà un aspetto diverso in base al livello inserito nel targetSDKversion ( <uses-sdk android:targetSdkVersion="INTEGER_VALUE"/>
) del file AndroidManifest.xml . Se imposti il valore 10 o inferiore, DatePickerDialog apparirà come a sinistra. D'altra parte, se si imposta il valore 11 o superiore, un DatePickerDialog avrà l'aspetto giusto, con lo stesso codice .
Il codice che ho usato per creare questo esempio è semplicissimo. MainActivity.java
sembra :
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onClickButton(View v) {
DatePickerDialog d = new DatePickerDialog(this, null, 2014, 5, 4);
d.show();
}
}
E activity_main.xml
guarda:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClickButton"
android:text="Button" />
</RelativeLayout>
Questo è tutto. Questo è davvero ogni codice di cui ho bisogno per testarlo.
E questo cambiamento nell'aspetto è cristallino quando vedi il codice sorgente del framework Android . Va come:
public DatePickerDialog(Context context,
OnDateSetListener callBack,
int year,
int monthOfYear,
int dayOfMonth,
boolean yearOptional) {
this(context, context.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.HONEYCOMB
? com.android.internal.R.style.Theme_Holo_Light_Dialog_Alert
: com.android.internal.R.style.Theme_Dialog_Alert,
callBack, year, monthOfYear, dayOfMonth, yearOptional);
}
Come puoi vedere, il framework ottiene targetSDKversion attuale e imposta temi diversi. Questo tipo di frammento di codice ( getApplicationInfo().targetSdkVersion >= SOME_VERSION
) può essere trovato qua e là nel framework Android.
Un altro esempio riguarda la classe WebView . I metodi pubblici della classe Webview devono essere chiamati sul thread principale e, in caso contrario, il sistema di runtime genera a RuntimeException
, quando si imposta targetSDKversion 18 o versione successiva. Questo comportamento può essere chiaramente espresso con il suo codice sorgente . È scritto così.
sEnforceThreadChecking = context.getApplicationInfo().targetSdkVersion >=
Build.VERSION_CODES.JELLY_BEAN_MR2;
if (sEnforceThreadChecking) {
throw new RuntimeException(throwable);
}
Il documento Android dice: " Man mano che Android si evolve con ogni nuova versione, alcuni comportamenti e persino aspetti potrebbero cambiare ". Quindi, abbiamo osservato il cambiamento di comportamento e aspetto e il modo in cui tale cambiamento viene realizzato.
In breve, il documento Android dice " Questo attributo (targetSdkVersion) informa il sistema che hai testato rispetto alla versione di destinazione e il sistema non dovrebbe abilitare alcun comportamento di compatibilità per mantenere la compatibilità diretta della tua app con la versione di destinazione ". Questo è davvero chiaro con il caso WebView. Era OK fino al rilascio di JELLY_BEAN_MR2 per chiamare il metodo pubblico della classe WebView sul thread non principale. Non ha senso se il framework Android genera un'eccezione RuntimeException sui dispositivi JELLY_BEAN_MR2. Non dovrebbe solo consentire comportamenti di recente introduzione per il suo interesse, che causano risultati fatali. Quindi, ciò che dobbiamo fare è verificare se tutto è OK su determinati targetSDKversions. Otteniamo vantaggi come il miglioramento dell'aspetto con l'impostazione di target più alti SDKversion,
EDIT: disclaimer. Il costruttore DatePickerDialog che imposta temi diversi in base all'attuale targetSDKversion (che ho mostrato sopra) è stato effettivamente modificato nel commit successivo . Tuttavia ho usato quell'esempio, perché la logica non è stata modificata e quel frammento di codice mostra chiaramente il concetto targetSDKversion.
Per chi desidera un riepilogo,
android:minSdkVersion
è la versione minima fino a quando l'applicazione non supporta. Se il tuo dispositivo ha una versione precedente di Android, l'app non verrà installata.
mentre,
android:targetSdkVersion
è il livello API fino al quale l'app è progettata per funzionare. Significa che il sistema del tuo telefono non deve usare alcun comportamento di compatibilità per mantenere la compatibilità futura perché hai testato fino a questa API.
La tua app continuerà a funzionare su versioni di Android superiori a quelle fornite, targetSdkVersion
ma si avvierà il comportamento di compatibilità di Android.
Freebie -
android:maxSdkVersion
se la versione dell'API del dispositivo è successiva, l'app non verrà installata. Vale a dire. questa è l'API massima fino alla quale si consente l'installazione dell'app.
vale a dire. per MinSDK -4, maxSDK - 8, targetSDK - 8 La mia app funzionerà con un minimo di 1.6 ma ho anche usato funzionalità supportate solo in 2.2 che saranno visibili se è installato su un dispositivo 2.2. Inoltre, per maxSDK - 8, questa app non verrà installata sui telefoni utilizzando API> 8.
Al momento della stesura di questa risposta, la documentazione di Android non stava facendo un ottimo lavoro per spiegarla. Ora è molto ben spiegato. Controlla qui
Se ricevi alcuni errori di compilazione, ad esempio:
<uses-sdk
android:minSdkVersion="10"
android:targetSdkVersion="15" />
.
private void methodThatRequiresAPI11() {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Config.ARGB_8888; // API Level 1
options.inSampleSize = 8; // API Level 1
options.inBitmap = bitmap; // **API Level 11**
//...
}
Viene visualizzato l'errore di compilazione:
Il campo richiede il livello API 11 (l'attuale minimo è 10): android.graphics.BitmapFactory $ Opzioni # inBitmap
Dalla versione 17 di Android Development Tools (ADT) esiste un'annotazione nuova e molto utile @TargetApi
che può risolverlo molto facilmente. Aggiungilo prima del metodo che racchiude la dichiarazione problematica:
@TargetApi
private void methodThatRequiresAPI11() {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Config.ARGB_8888; // API Level 1
options.inSampleSize = 8; // API Level 1
// This will avoid exception NoSuchFieldError (or NoSuchMethodError) at runtime.
if (Integer.valueOf(android.os.Build.VERSION.SDK) >= android.os.Build.VERSION_CODES.HONEYCOMB) {
options.inBitmap = bitmap; // **API Level 11**
//...
}
}
Nessun errore di compilazione ora e verrà eseguito!
EDIT: Ciò comporterà un errore di runtime a livello API inferiore a 11. Su 11 o superiore verrà eseguito senza problemi. Quindi devi essere sicuro di chiamare questo metodo su un percorso di esecuzione protetto dal controllo della versione. TargetApi ti consente solo di compilarlo ma lo esegui a tuo rischio e pericolo.
android:minSdkVersion
ed android:targetSdkVersion
entrambi sono valori interi che dobbiamo dichiarare nel file manifest di Android ma entrambi hanno proprietà diverse.
android:minSdkVersion:
Questo è il livello API minimo richiesto per eseguire un'app Android. Se installeremo la stessa app su una versione dell'API inferiore, verrà visualizzato l'errore parser e verrà visualizzato il problema relativo all'applicazione non supportata.
android:targetSdkVersion:
La versione sdk di destinazione consiste nell'impostare il livello di app dell'API di destinazione. se questo attributo non è dichiarato in manifest, la versione minSdk sarà la tua versione TargetSdk. Questo è sempre vero che "l'installazione del supporto app su tutte le versioni successive dell'API che abbiamo dichiarato come versione TargetSdk". Per rendere il target limitato all'app dobbiamo dichiarare maxSdkVersion nel nostro file manifest ...
Se stai creando app che richiedono autorizzazioni pericolose e imposti targetSDK su 23 o superiore, devi fare attenzione. Se non si controllano le autorizzazioni in fase di esecuzione, si ottiene SecurityException e se si utilizza il codice all'interno di un blocco try, ad esempio aprire la telecamera, può essere difficile rilevare errori se non si controlla logcat.
Target sdk è la versione che si desidera targetizzare e min sdk è la versione minima.