Versione SDK Android Min vs Versione SDK target


442

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!


1
Da quello che sto leggendo, sembra che la versione dell'SDK di destinazione non abbia alcun impatto sul modo in cui viene compilata l'applicazione. È lì solo per dire al dispositivo che l'applicazione è in esecuzione che non è necessario abilitare alcuna funzionalità di compatibilità speciale per far funzionare correttamente l'applicazione. È giusto? Mi sembra che non sapresti quale sia la tua versione dell'SDK di destinazione fino a dopo aver compilato e fatto molti test. Perché il compilatore non può semplicemente guardare il tuo codice e capire con quali piattaforme l'applicazione è compatibile da sola?
Michael Novello,

5
Il commentatore sopra ha capito male perché si utilizza la funzionalità targetSDK. Vedi la mia risposta di seguito per maggiori dettagli.
Steve Haley,

157
La risposta accettata non è corretta. Si prega di leggere la risposta di Steve H.
Tylerl

3
@tylerl Ma non è un errore, ma si riferisce alle documentazioni di Google Android. Non ho aggiunto nulla.
Vikas Patidar,

3
La risposta di Carl è la più dettagliata e precisa secondo me.
Ilya Kogan,

Risposte:


136

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


Nel complesso, imposterai entrambi sulla stessa cosa. Probabilmente sarebbe una situazione insolita impostarli su valori diversi.
jjb

66
Per quanto riguarda il commento di JJB: non sono d'accordo. Ci sono molte buone ragioni per cui potresti avere un minSDK e targetSDK diversi. Vedi la mia risposta per maggiori dettagli.
Steve Haley,

871

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.


2
Potresti fornire spiegazioni precise su come targetSDKversion influisce sulla compilazione dell'app? Perché la versione della compilation è di nuovo un'altra configurazione che è necessario impostare. Grazie in anticipo
hnviet,

9
Penso che Steve sia confuso tra l'attributo manifest xml android: targetSdkVersion (che non ha una vera voce in capitolo) e tra la proprietà target che risiede nel file project.properties che rappresenta ciò che dovrebbe essere compilato il codice. Ripeto, l'xml attr targetSdkVersion non ha alcun significato reale !!!
AlikElzin-Kilaka,

3
@kilaka La metà del tuo commento è valida, ma l'altra metà è semplicemente sbagliata. Supponevo che qualcuno usasse lo stesso valore nell'XML e in project.properties (accessibile anche tramite un clic destro-> proprietà in Eclipse), quindi hai ragione a sottolineare che sono memorizzati in luoghi diversi. Tuttavia, Android Market sicuramente si preoccupa del valore che attribuisci all'attributo xml targetSdkVersion. Ad esempio, lo utilizza per determinare se è necessario disporre di ActionBar o di un menu di compatibilità per Honeycomb e applicazioni precedenti.
Steve Haley,

2
@Nate Non potrei dire quanto più lentamente questo "codice contorto" runtime, ma penso che dividere e usare più APK sia peggio in termini di complessità del codice. Ora devi ricordare di commentare in / out o unire più rami nel controllo del codice sorgente prima di poter effettuare ogni esportazione. Durante una conferenza Android dello scorso ottobre, hanno affermato di aver introdotto il sistema APK multiplo come concessione, ma erano felici che pochissime persone lo stessero usando.
Steve Haley,

2
Ma gestire più versioni è ciò per cui sono fatti i sistemi di controllo delle versioni. È ciò con cui gli sviluppatori hanno familiarità (la maggior parte dei software, mobili o meno, rilascia versioni leggermente diverse per piattaforme diverse). Questa "funzione" di Android non riduce la complessità. Lo sta semplicemente spingendo nell'applicazione in esecuzione e, come evidenziato da questo thread, crea confusione. Certo, Google sarà felice che poche persone lo stiano usando ... questo li aiuta a dire "vedi, eravamo giusti per fare questa omissione in primo luogo". Inoltre, alcuni non lo usano perché non sanno ancora che esiste.
Nate,

97

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.


Grazie per le istruzioni sull'uso della direttiva TargetApi.
samir105,

@Carl Significa che posso sempre impostare targetSdkVersion su qualsiasi versione superiore alla mia minSdkVersion (soprattutto per ottenere quei miglioramenti dell'interfaccia utente) senza bisogno di alcun test (di per sé ) purché limiti la mia base di codice per utilizzare solo le API disponibili nella mia minSdkVersion ?
Damilola Olowookere,

Olowookere Emmanuel: Se ti capisco correttamente, allora no, non significa che. Come afferma la mia risposta, "se si utilizzano funzionalità che sono diventate obsolete al livello precedente o precedente a xx, il codice di compatibilità non verrà applicato automaticamente dalle versioni del sistema operativo a livelli API superiori". Quindi, se il tuo codice utilizza una funzionalità che è diventata disponibile, ad esempio, a livello di API 8 e tale funzionalità è diventata obsoleta a livello 10, quindi se aumenti targetSdkVersion a qualcosa al di sopra di 10, non ci sarà alcun codice di compatibilità disponibile per regolare i tuoi usi di quella funzionalità al nuovo livello di sistema operativo.
Carl,

(Continua): considerando che, se lasci targetSdkVersion al livello 8, quindi, mentre non sarai in grado di utilizzare le funzionalità introdotte ai livelli più alti, ci sarà un codice di compatibilità applicato per consentire agli usi delle funzionalità di livello 8 di funzionare quando eseguito su livelli di sistema operativo più elevati.
Carl,

(Continua): pensala in questo modo: supponi di aver scritto del codice quando il livello Android più alto disponibile era 8 e di impostare targetSdkVersion su 8 (perché quello era il livello più alto al momento). Ora vengono rilasciate alcune nuove versioni di Android e alcune delle funzionalità di livello 8 utilizzate non sono più disponibili. Gli utenti che hanno ancora il tuo vecchio APK non dovrebbero riscontrare errori, dovrebbero? Quindi, per garantire che non lo facciano, il codice di compatibilità viene automaticamente applicato per adattare le tue vecchie chiamate API per fare qualcosa di ragionevole quando vengono invocate mentre un utente esegue una versione più recente del sistema operativo.
Carl,

50

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 .

DatePickerDialog guarda con targetSDKversion 10 o inferiore DatePickerDialog guarda con targetSDKversion 11 o versioni successive

Il codice che ho usato per creare questo esempio è semplicissimo. MainActivity.javasembra :

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.xmlguarda:

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


2
"Otteniamo vantaggi come il miglioramento dell'aspetto con la definizione di targetSDKversion più elevato, ma viene fornito con responsabilità". Se avessero menzionato questa linea nei documenti, non lo avrei cercato.
pulp_fiction il

@ 김준호 Ho due domande: 1.) Nell'esempio di datepicker sopra, se hai impostato targetSdkVersion su 10 o inferiore ed hai eseguito l'app su un dispositivo che esegue l'ultimo Android (ad es. API 22) il datepicker mostrerà comunque come quello precedente nella foto a sinistra? 2.) Significa che posso sempre impostare targetSdkVersion su qualsiasi versione superiore alla mia minSdkVersion (ad esempio per ottenere quei miglioramenti dell'interfaccia utente come quel datepicker croccante da API più alte) senza bisogno di alcun test (di per sé ) fintanto che limito la mia base di codice utilizzare solo le API disponibili nella mia minSdkVersion?
Damilola Olowookere,

@Olowookere 1) Sì. Corri e basta. 2) Puoi impostare targetSDKVersion qualsiasi versione che ti piace se è superiore a minSDKVersion. Ma devi ancora testarlo se funziona bene su una versione mirata. Non importa se ti attieni a minSDKVersion api o no. Pensa all'esempio di DatePicker.
김준호

Pensa a un caso in cui hai impostato la versione minima 14 e la versione sdk di destinazione su 16 e hai usato le API solo per 14 o versioni precedenti. Supponiamo che tu abbia usato TextView che viene introdotto nel livello api 1. Cosa succederebbe?
김준호

@ 김준호 Grazie. Ma per la tua seconda risposta sono confuso. Se il mio codice utilizza solo API in minSdkVersion e ho come target un SDK superiore, perché devo testarlo? Pensando all'esempio di DatePicker, l'high targetSdkVersion ha migliorato l'aspetto del widget DatePicker e nulla si interrompe perché non ho usato alcun codice nell'API superiore a minSdkVersion. Voglio solo targetSdkVersion più alto perché voglio il nuovo aspetto grafico dei widget, non che voglio usare le nuove funzionalità introdotte all'API superiore
Damilola Olowookere,

21

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, targetSdkVersionma 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


"è la versione massima da cui l'app ha ereditato le funzionalità." : questo è sbagliato. È la versione minima da cui l'app ha ereditato le funzionalità, ovvero la prima versione che include le funzionalità richieste utilizzate dalla tua app.
RichieHH,

L'inglese è una lingua complicata. Leggi il mio esempio fornito nella risposta. Presumo che abbia un senso lì. :)
Darpan,

Non sono pedante e l'inglese è la lingua di supporto in questo gruppo. Tricky o non dire che è la "versione massima in cui l'app ha supportato le funzionalità" non è solo sbagliato: è totalmente a 180 gradi. È la PRIMA o la versione minima che supporta tutte le funzionalità previste dell'applicazione senza utilizzare le modalità / librerie di compatibilità di fallback.
RichieHH, il

9

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 @TargetApiche 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.


1
Sono confuso su questo. Cosa succede se si esegue l'app in un secondo momento in un sistema con SDK 10?
Fran Marzoa,

Eseguirà le opzioni. L'istruzione Bitmap e l'app dovrebbero funzionare correttamente.
NinjaCoder,

1

android:minSdkVersioned android:targetSdkVersionentrambi 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 ...


0

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.


0

Target sdk è la versione che si desidera targetizzare e min sdk è la versione minima.

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.