Wersja min. Zestawu SDK systemu Android a docelowa wersja zestawu SDK


442

Jeśli chodzi o tworzenie aplikacji dla Androida, jaka jest różnica między wersją Min i docelową wersją SDK? Eclipse nie pozwoli mi utworzyć nowego projektu, chyba że wersje Min i Target są takie same!


1
Z tego, co czytam, wygląda na to, że wersja docelowego zestawu SDK nie ma wpływu na sposób kompilacji aplikacji. Wystarczy, aby powiedzieć urządzeniu, że aplikacja działa, że ​​nie musi włączać żadnych specjalnych funkcji zgodności, aby aplikacja działała poprawnie. Czy to jest poprawne? Wydaje mi się, że nie wiedziałbyś, jaka jest twoja docelowa wersja SDK, dopóki nie skompilujesz i nie wykonasz wielu testów. Dlaczego kompilator nie może po prostu spojrzeć na kod i dowiedzieć się, z którymi platformami jest kompatybilna Twoja aplikacja?
Michael Novello,

5
Komentator powyżej źle zrozumiał, dlaczego używa się funkcji targetSDK. Zobacz moją odpowiedź poniżej, aby uzyskać więcej informacji.
Steve Haley

157
Przyjęta odpowiedź jest nieprawidłowa. Proszę przeczytać odpowiedź Steve H.
Tylerl

3
@tylerl Ale to nie jest niepoprawne, ale odnosi się do dokumentacji Google Android. Nic nie dodałem.
Vikas Patidar

3
Moim zdaniem odpowiedź Carla jest najbardziej szczegółowa i precyzyjna.
Ilya Kogan

Odpowiedzi:


136

Android: minSdkVersion

Liczba całkowita określająca minimalny poziom API wymagany do uruchomienia aplikacji. System Android uniemożliwi użytkownikowi instalację aplikacji, jeśli poziom interfejsu API systemu jest niższy niż wartość określona w tym atrybucie. Zawsze powinieneś zadeklarować ten atrybut.

android: targetSdkVersion

Liczba całkowita określająca poziom interfejsu API, na który jest kierowana aplikacja.

Dzięki temu zestawowi atrybutów aplikacja mówi, że jest w stanie działać na starszych wersjach (do minSdkVersion), ale została wyraźnie przetestowana do pracy z podaną tutaj wersją. Określenie tej wersji docelowej pozwala platformie na wyłączenie ustawień zgodności, które nie są wymagane dla wersji docelowej (które w przeciwnym razie mogłyby zostać włączone w celu zachowania zgodności z poprzednimi wersjami) lub umożliwić nowsze funkcje, które nie są dostępne dla starszych aplikacji. Nie oznacza to, że możesz zaprogramować różne funkcje dla różnych wersji platformy - po prostu informuje platformę, że przetestowałeś wersję docelową, i platforma nie powinna wykonywać żadnych dodatkowych prac w celu zachowania zgodności z wersją docelową.

Aby uzyskać więcej informacji, zapoznaj się z tym adresem URL:

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


Ogólnie rzecz biorąc, zamierzasz ustawić obie te same rzeczy. Prawdopodobnie niezwykłą sytuacją byłoby ustawienie ich na różne wartości.
jjb

66
Odnośnie komentarza jjb: nie zgadzam się. Istnieje wiele dobrych powodów, dla których możesz mieć inny minSDK i targetSDK. Zobacz moją odpowiedź, aby uzyskać więcej informacji.
Steve Haley

871

Komentarz wysłany przez OP do pytania (w zasadzie stwierdzający, że targetSDK nie wpływa na kompilację aplikacji) jest całkowicie błędny! Przepraszam, że jestem tępy.

Krótko mówiąc, tutaj jest cel zadeklarowania innego targetSDK niż minSDK: Oznacza to, że używasz funkcji z SDK wyższego poziomu niż minimum, ale masz zapewnioną kompatybilność wsteczną . Innymi słowy, wyobraź sobie, że chcesz użyć funkcji, która została niedawno wprowadzona, ale nie jest to krytyczne dla twojej aplikacji. Następnie ustaw targetSDK na wersję, w której ta nowa funkcja została wprowadzona, a minimum na coś niższego, aby wszyscy mogli nadal korzystać z Twojej aplikacji.

Dla przykładu: załóżmy, że piszesz aplikację, która szeroko wykorzystuje wykrywanie gestów. Jednak każde polecenie, które można rozpoznać po geście, można również wykonać za pomocą przycisku lub z menu. W tym przypadku gesty są „fajnym dodatkiem”, ale nie są wymagane. Dlatego ustawiłeś docelowy sdk na 7 („Eclair”, kiedy wprowadzono bibliotekę GestureDetection), a minimalny SDK na poziom 3 („Cupcake”), aby nawet osoby posiadające naprawdę stare telefony mogły korzystać z Twojej aplikacji. Wszystko, co musisz zrobić, to upewnić się, że aplikacja sprawdziła wersję Androida, na której była uruchomiona, przed próbą użycia biblioteki gestów, aby uniknąć próby jej użycia, jeśli nie istnieje. (Wprawdzie jest to przestarzały przykład, ponieważ prawie nikt nadal nie ma telefonu w wersji 1.5, ale był czas, gdy zachowano zgodność z wersją v1.

Aby dać inny przykład, możesz użyć tego, jeśli chcesz użyć funkcji z piernika lub plastra miodu. Niektóre osoby wkrótce otrzymają aktualizacje, ale wiele innych, szczególnie ze starszym sprzętem, może utknąć w Eclair, dopóki nie kupią nowego urządzenia. Pozwoliłoby to korzystać z niektórych nowych fajnych funkcji, ale bez wykluczania części potencjalnego rynku.

Na blogu programisty Androida jest bardzo dobry artykuł na temat korzystania z tej funkcji, a w szczególności na temat projektowania kodu „sprawdź, czy funkcja istnieje przed użyciem”, o którym wspomniałem powyżej.

Do OP: Napisałem to głównie na korzyść każdego, kto natknie się na to pytanie w przyszłości, ponieważ zdaję sobie sprawę, że twoje pytanie zostało zadane dawno temu.


2
Czy możesz podać dokładne wyjaśnienie, w jaki sposób targetSDKversion wpływa na kompilację aplikacji? Ponieważ wersja kompilacji jest kolejną konfiguracją, którą musisz skonfigurować. Z góry
dziękuję

9
Myślę, że Steve pomylił atrybut manifestu xml android: targetSdkVersion (który nie ma prawdziwego zdania) i właściwość targetu, która znajduje się w pliku project.properties, który reprezentuje to, co powinien zostać skompilowany. Powiem jeszcze raz, xml attr targetSdkVersion nie ma prawdziwego znaczenia !!!
AlikElzin-kilaka

3
@kilaka Połowa twojego komentarza jest prawidłowa, ale druga połowa jest po prostu błędna. Zakładałem, że ktoś używa tej samej wartości w pliku XML i project.properties (dostępnym również poprzez kliknięcie prawym przyciskiem myszy-> właściwości w Eclipse), więc masz rację, wskazując, że są przechowywane w różnych miejscach. Jednak Android Market z pewnością dba o to, jaką wartość umieścisz w atrybucie xml targetSdkVersion. Na przykład używa tego przy określaniu, czy powinieneś mieć ActionBar, czy menu kompatybilności dla Honeycomb i wyżej wymienionych aplikacji.
Steve Haley,

2
@Nate Nie mogłem powiedzieć, o ile wolniej ten „skomplikowany kod” sprawia, że ​​środowisko wykonawcze, ale uważam, że dzielenie i używanie wielu plików APK jest gorsze pod względem złożoności kodu. Teraz musisz pamiętać, aby komentować wejście / wyjście lub scalić więcej gałęzi w kontroli źródła przed wykonaniem każdego eksportu. Podczas konferencji na Androidzie w październiku zeszłego roku powiedzieli, że wprowadzili system wielokrotnego APK jako koncesję, ale byli zadowoleni, że bardzo niewiele osób go używa.
Steve Haley,

2
Ale obsługa wielu wersji jest tym, do czego stworzone są systemy kontroli wersji. To jest to, co znają programiści (większość oprogramowania, mobilnego lub nie, wydaje nieco inne wersje dla różnych platform). Ta „funkcja” Androida nie zmniejsza złożoności. Po prostu wpycha go do działającej aplikacji, co potwierdza ten wątek, powodując zamieszanie. Jasne, Google będzie szczęśliwy, że niewiele osób z niego korzysta ... to pomaga im powiedzieć: „widzimy, że mieliśmy rację, robiąc to pominięcie w pierwszej kolejności”. Ponadto niektórzy go nie używają, ponieważ jeszcze nie wiedzą, że istnieje.
Nate

97

Po ustawieniu targetSdkVersion = "xx" poświadczasz, że Twoja aplikacja działa poprawnie (np. Została dokładnie i pomyślnie przetestowana) na poziomie interfejsu API xx.

Wersja Androida działająca na poziomie API wyższym niż xx automatycznie zastosuje kod zgodności w celu obsługi wszelkich funkcji, na których możesz polegać, które były dostępne na poziomie API xx lub wcześniej, ale które są teraz przestarzałe na wyższym poziomie tej wersji Androida.

I odwrotnie, jeśli używasz żadnych funkcji, które stały się przestarzałe na poziomie xx lub wcześniejszym , kod zgodności nie będzie automatycznie stosowany przez wersje systemu operacyjnego na wyższych poziomach API (które nie zawierają już tych funkcji) do obsługi tych zastosowań. W takiej sytuacji Twój własny kod musi zawierać specjalne klauzule przypadków, które testują poziom API, a jeśli wykryty poziom systemu operacyjnego jest wyższy, który nie ma już danej funkcji API, twój kod musi używać alternatywnych funkcji, które dostępne w uruchomionym systemie operacyjnym Poziom API.

Jeśli tego nie zrobi, niektóre funkcje interfejsu mogą po prostu nie pojawiać się, które normalnie wywoływałyby zdarzenia w kodzie, i może brakować krytycznej funkcji interfejsu, którą użytkownik musi uruchomić te zdarzenia i uzyskać dostęp do ich funkcjonalności (jak w przykład poniżej).

Jak stwierdzono w innych odpowiedziach, możesz ustawić targetSdkVersion na wyższy niż minSdkVersion, jeśli chcesz korzystać z niektórych funkcji API początkowo zdefiniowanych na wyższych poziomach API niż minSdkVersion, i podjąłeś kroki, aby Twój kod mógł wykryć i poradzić sobie z brakiem tych funkcji na niższe poziomy niż targetSdkVersion.

Aby ostrzec programistów przed konkretnym testowaniem minimalnego poziomu interfejsu API wymaganego do korzystania z funkcji, kompilator wygeneruje błąd (nie tylko ostrzeżenie), jeśli kod zawiera wywołanie dowolnej metody zdefiniowanej na późniejszym poziomie interfejsu API niż minSdkVersion, nawet jeśli targetSdkVersion jest większy lub równy poziomowi API, na którym ta metoda została po raz pierwszy udostępniona. Aby usunąć ten błąd, dyrektywa kompilatora

@TargetApi(nn)

informuje kompilator, że kod objęty zakresem tej dyrektywy (który będzie poprzedzał metodę lub klasę) został napisany w celu przetestowania poziomu API co najmniej nn przed wywołaniem dowolnej metody zależnej od posiadania co najmniej tego poziomu API . Na przykład poniższy kod definiuje metodę, którą można wywołać z kodu w aplikacji, która ma minSdkVersion mniejszą niż 11 i targetSdkVersion 11 lub wyższą:

@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();
    }
}

Możesz również zadeklarować wyższy celSdkVersion, jeśli testowałeś na tym wyższym poziomie i wszystko działało, nawet jeśli nie korzystałeś z żadnych funkcji z poziomu API wyższego niż minSdkVersion. Byłoby to po prostu, aby uniknąć narzutu związanego z dostępem do kodu zgodności, który ma zostać dostosowany z poziomu docelowego do poziomu minimalnego, ponieważ potwierdziłbyś (poprzez testowanie), że taka adaptacja nie była wymagana.

Przykładem funkcji interfejsu użytkownika, która zależy od zadeklarowanego targetSdkVersion, jest przycisk menu z trzema pionowymi kropkami, który pojawia się na pasku stanu aplikacji mających wartość docelową SDKVersion mniejszą niż 11, gdy aplikacje te działają pod API 11 i wyższym. Jeśli twoja aplikacja ma docelową wersję 10 lub mniej, zakłada się, że interfejs aplikacji zależy od istnienia dedykowanego przycisku menu, więc przycisk z trzema kropkami wydaje się zastępować wcześniejsze dedykowane wersje sprzętowe i / lub ekranowe tego przycisku (np. jak widać w Gingerbread), gdy system operacyjny ma wyższy poziom API, dla którego nie jest już zakładany dedykowany przycisk menu na urządzeniu. Jeśli jednak ustawisz docelową wersję aplikacji na 11 lub wyższą, zakłada się, że skorzystałeś z funkcji wprowadzonych na tym poziomie, które zastępują dedykowany przycisk menu (np. g., pasek akcji) lub że w inny sposób ominąłeś potrzebę posiadania przycisku menu systemowego; w konsekwencji „przycisk zgodności” z trzema pionowymi kropkami znika. W takim przypadku, jeśli użytkownik nie może znaleźć przycisku menu, nie może go nacisnąć, a to z kolei oznacza, że ​​zastąpienie onCreateOptionsMenu (menu) Twojej aktywności może nigdy nie zostać wywołane, co z kolei oznacza, że znaczna część funkcjonalności aplikacji może zostać pozbawiona interfejsu użytkownika. O ile oczywiście nie zaimplementowałeś paska akcji lub innych alternatywnych sposobów uzyskiwania dostępu do tych funkcji przez użytkownika. Aby znaleźć przycisk menu, nie może go nacisnąć, a to z kolei oznacza, że ​​przesłonięcie Twojej aktywności onCreateOptionsMenu (menu) może nigdy nie zostać wywołane, co z kolei oznacza, że ​​znaczna część funkcjonalności aplikacji może być pozbawiony interfejsu użytkownika. O ile oczywiście nie zaimplementowałeś paska akcji lub innych alternatywnych sposobów uzyskiwania dostępu do tych funkcji przez użytkownika. Aby znaleźć przycisk menu, nie może go nacisnąć, a to z kolei oznacza, że ​​przesłonięcie Twojej aktywności onCreateOptionsMenu (menu) może nigdy nie zostać wywołane, co z kolei oznacza, że ​​znaczna część funkcjonalności aplikacji może być pozbawiony interfejsu użytkownika. O ile oczywiście nie zaimplementowałeś paska akcji lub innych alternatywnych sposobów uzyskiwania dostępu do tych funkcji przez użytkownika.

Natomiast minSdkVersion określa wymóg, aby wersja systemu operacyjnego urządzenia miała co najmniej ten poziom interfejsu API w celu uruchomienia aplikacji. Wpływa to na to, które urządzenia mogą wyświetlać i pobierać aplikację, gdy jest ona dostępna w sklepie z aplikacjami Google Play (i ewentualnie także w innych sklepach z aplikacjami). Jest to sposób na stwierdzenie, że twoja aplikacja opiera się na funkcjach systemu operacyjnego (API lub innych), które zostały ustanowione na tym poziomie, i nie ma akceptowalnego sposobu radzenia sobie z brakiem tych funkcji.

Przykładem użycia minSdkVersion w celu zapewnienia obecności funkcji niezwiązanej z API byłoby ustawienie minSdkVersion na 8 w celu zapewnienia, że ​​Twoja aplikacja będzie działała tylko w wersji interpretera Dalvik z obsługą JIT (od czasu wprowadzenia JIT do interpretera Androida na poziomie API 8). Ponieważ wydajność interpretera obsługującego JIT może być nawet pięciokrotnie wyższa niż w przypadku tej funkcji, jeśli aplikacja intensywnie wykorzystuje procesor, możesz chcieć wymagać interfejsu API w wersji 8 lub wyższej, aby zapewnić odpowiednią wydajność.


Dziękujemy za instrukcje dotyczące stosowania dyrektywy TargetApi.
samir105

@Carl to znaczy, że mogę zawsze zestaw targetSdkVersion do dowolnej wersji wyższej niż mój minSdkVersion (zwłaszcza zdobyć te ulepszenia interfejsu użytkownika), bez konieczności jakiegokolwiek badania ( per se ) tak długo, jak mogę ograniczyć moje codebase używać tylko API dostępny w moim minSdkVersion ?
Damilola Olowookere

Olowookere Emmanuel: Jeśli dobrze cię rozumiem, to nie, to nie znaczy, że. Zgodnie z moją odpowiedzią „jeśli korzystasz z funkcji, które stały się przestarzałe na poziomie xx lub wcześniejszym, kod zgodności nie będzie automatycznie stosowany przez wersje systemu operacyjnego na wyższych poziomach API”. Jeśli więc Twój kod korzysta z funkcji, która stała się dostępna, powiedzmy, na poziomie API 8, a ta funkcja stała się przestarzała na poziomie 10, to jeśli podniesiesz swój targetSdkVersion do czegoś powyżej 10, kod zgodności nie będzie dostępny, aby dostosować twoje użycie tę funkcję na nowy poziom systemu operacyjnego.
Carl

(Kontynuacja): Jeśli jednak pozostawisz swój targetSdkVersion na poziomie 8, to chociaż nie będziesz mógł korzystać z funkcji wprowadzonych na wyższych poziomach, zastosowany zostanie kod zgodności, aby umożliwić korzystanie z funkcji poziomu 8 po uruchomieniu na wyższe poziomy systemu operacyjnego.
Carl

(Kontynuacja): Pomyśl o tym w ten sposób: Załóżmy, że napisałeś trochę kodu, gdy najwyższy dostępny poziom Androida wynosił 8, i ustawiłeś swój targetSdkVersion na 8 (ponieważ był to wtedy najwyższy poziom). Teraz pojawiają się nowe wersje Androida, a niektóre z używanych funkcji poziomu 8 stają się niedostępne. Użytkownicy, którzy nadal mają stary APK, nie powinni napotykać błędów, prawda? Tak więc, aby się upewnić, że nie, kod zgodności jest automatycznie stosowany w celu dostosowania starych wywołań interfejsu API w celu zrobienia czegoś sensownego po ich wywołaniu, gdy użytkownik korzysta z nowszej wersji systemu operacyjnego.
Carl

50

Zawsze można lepiej dostarczyć koncepcję z przykładami . Miałem problem ze zrozumieniem tej koncepcji, dopóki nie zagłębiłem się w kod źródłowy frameworku Androida i nie przeprowadziłem eksperymentów, nawet po przeczytaniu wszystkich dokumentów w witrynach deweloperów Androida i powiązanych wątków przepływu stosu. Podzielę się dwoma przykładami, które bardzo mi pomogły w pełni zrozumieć te pojęcia.

DatePickerDialog będzie wyglądać inaczej w zależności od poziomu, który można umieścić w targetSDKversion AndroidManifest.xml pliku, ( <uses-sdk android:targetSdkVersion="INTEGER_VALUE"/>). Jeśli ustawisz wartość 10 lub niższą, Twój DatePickerDialog będzie wyglądał jak w lewo. Z drugiej strony, jeśli ustawisz wartość 11 lub wyższą, DatePickerDialog będzie wyglądał dobrze, z tym samym kodem .

Wygląd DatePickerDialog z targetSDKversion 10 lub niższą Wygląd DatePickerDialog z targetSDKversion 11 lub nowszym

Kod, którego użyłem do utworzenia tego przykładu, jest bardzo prosty. MainActivity.javawygląda:

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();       
    }
}

I activity_main.xmlwygląda:

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


Otóż ​​to. To naprawdę każdy kod, którego potrzebuję, aby to przetestować.

Ta zmiana wyglądu jest krystalicznie czysta, gdy zobaczysz kod źródłowy platformy Android . To wygląda tak:

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);
}

Jak widać, środowisko pobiera bieżący targetSDKversion i ustawia inny motyw. Ten rodzaj kodu snippet ( getApplicationInfo().targetSdkVersion >= SOME_VERSION) można znaleźć tu i tam w systemie Android.

Kolejny przykład dotyczy klasy WebView . Metody publiczne klasy Webview powinny być wywoływane w głównym wątku, a jeśli nie, system wykonawczy rzuca a RuntimeException, gdy ustawisz docelową SDKversion 18 lub wyższą. To zachowanie można wyraźnie dostarczyć za pomocą kodu źródłowego . Jest tak napisane.

sEnforceThreadChecking = context.getApplicationInfo().targetSdkVersion >=
            Build.VERSION_CODES.JELLY_BEAN_MR2;

if (sEnforceThreadChecking) {
    throw new RuntimeException(throwable);
}


Dokument na Androida mówi: „ Ponieważ Android ewoluuje z każdą nową wersją, niektóre zachowania, a nawet wygląd mogą się zmienić ”. Sprawdziliśmy więc zmianę zachowania i wyglądu oraz sposób, w jaki ta zmiana została osiągnięta.

Podsumowując, dokument na Androida mówi: „ Ten atrybut (targetSdkVersion) informuje system, który testowałeś w stosunku do wersji docelowej, i system nie powinien włączać żadnych zachowań kompatybilności w celu utrzymania zgodności aplikacji z wersją docelową ”. Jest to naprawdę jasne w przypadku WebView. Było OK, dopóki JELLY_BEAN_MR2 nie został wydany, aby wywołać metodę publiczną klasy WebView w nie głównym wątku. To nonsens, jeśli system Android zgłasza wyjątek RuntimeException na urządzeniach JELLY_BEAN_MR2. Po prostu nie powinno to umożliwiać nowo wprowadzonych zachowań ze względu na ich zainteresowanie, które powodują fatalne skutki. Musimy więc sprawdzić, czy wszystko jest OK na niektórych docelowychSDKversions. Dostajemy korzyści takie jak poprawa wyglądu dzięki ustawieniu wyższej wartości docelowej SDKversion,

EDYCJA: wyłączenie odpowiedzialności. Konstruktor DatePickerDialog, który ustawia różne kompozycje w oparciu o bieżący targetSDKversion (który pokazałem powyżej), faktycznie został zmieniony w późniejszym zatwierdzeniu . Niemniej jednak użyłem tego przykładu, ponieważ logika nie została zmieniona, a fragment kodu wyraźnie pokazuje koncepcję targetSDKversion.


2
„Dostajemy korzyści takie jak poprawa wyglądu dzięki ustawieniu wyższego docelowego SDKversion, ale wiąże się to z odpowiedzialnością”. Gdyby wspominali o tej linii w dokumentacji, nie szukałbym jej.
pulp_fiction

@ Hab Zajmuję się dwoma pytaniami: 1.) W powyższym przykładzie datepicker, jeśli ustawiłeś targetSdkVersion na 10 lub niższą wersję i uruchomiłeś aplikację na urządzeniu z najnowszym Androidem (np. API 22), czy datepicker nadal będzie wyświetlać się jak stary na lewym zdjęciu? 2.) Czy to oznacza, że ​​zawsze mogę ustawić targetSdkVersion na dowolną wersję wyższą niż moja minSdkVersion (np. W celu uzyskania ulepszeń interfejsu użytkownika, takich jak ten chrupiący datepicker z wyższych interfejsów API) bez potrzeby testowania ( per se ), o ile ograniczę moją bazę kodu używać tylko interfejsów API dostępnych w mojej minSdkVersion?
Damilola Olowookere

@Olowookere 1) Tak. Po prostu biegnij po to. 2) Możesz ustawić targetSDKVersion dowolną wersję, którą lubisz, jeśli jest wyższa niż minSDKVersion. Ale nadal musisz przetestować, czy działa dobrze w wersji docelowej. Nie ma znaczenia, czy trzymasz się interfejsu API minSDKVersion, czy nie. Pomyśl o przykładzie DatePicker.
김준호

Pomyśl o przypadku, w którym ustawiłeś minimalną wersję 14 i docelową wersję SDK na 16, a używasz apis tylko dla wersji 14 lub niższej. Załóżmy, że używałeś TextView, który wprowadza się na poziomie 1 interfejsu API. Co by się stało?
김준호

@ 김준호 Dzięki. Ale dla twojej drugiej odpowiedzi jestem zdezorientowany. Jeśli mój kod używa tylko API w minSdkVersion i kieruję na wyższy SDK, dlaczego muszę testować? Myśląc o przykładzie DatePicker, wysoki celSdkVersion poprawił jedynie wygląd widgetu DatePicker i nic się nie psuje, ponieważ nie użyłem żadnego kodu w API wyższego niż minSdkVersion. Chcę tylko wyższego targetSdkVersion, ponieważ chcę nowy wygląd widgetów, a nie to, że chcę korzystać z nowych funkcji wprowadzonych w wyższym interfejsie API
Damilola Olowookere,

21

Dla tych, którzy chcą podsumowania,

android:minSdkVersion

jest wersją minimalną, dopóki aplikacja nie będzie obsługiwać Jeśli twoje urządzenie ma niższą wersję Androida, aplikacja się nie zainstaluje.

podczas,

android:targetSdkVersion

to poziom interfejsu API, do którego aplikacja ma działać. Oznacza to, że system twojego telefonu nie musi używać żadnych zachowań kompatybilności, aby zachować kompatybilność do przodu, ponieważ testowałeś do tego API.

Twoja aplikacja będzie nadal działać na wersjach Androida wyższych niż podane, targetSdkVersionale rozpocznie się zachowanie kompatybilności z Androidem .

Freebie -

android:maxSdkVersion

jeśli wersja interfejsu API Twojego urządzenia jest wyższa, aplikacja się nie zainstaluje. To znaczy. jest to maksymalny interfejs API, do którego zezwalasz na instalację aplikacji.

to znaczy. dla MinSDK -4, maxSDK - 8, targetSDK - 8 Moja aplikacja będzie działała na minimum 1.6, ale użyłem również funkcji, które są obsługiwane tylko w wersji 2.2, które będą widoczne, jeśli zostaną zainstalowane na urządzeniu 2.2. Ponadto w przypadku wersji maxSDK - 8 ta aplikacja nie będzie instalowana na telefonach z interfejsem API> 8.

W momencie pisania tej odpowiedzi dokumentacja Androida nie była w stanie jej wyjaśnić. Teraz jest to bardzo dobrze wyjaśnione. Sprawdź tutaj


„to maksymalna wersja, z której aplikacja odziedziczyła funkcje”. : To jest źle. Jest to minimalna wersja, z której aplikacja odziedziczyła funkcje - tj. Pierwsza wersja, która zawiera wymagane funkcje używane przez aplikację.
RichieHH,

Angielski jest trudnym językiem. Przeczytaj mój przykład podany w odpowiedzi. Zakładam, że mam tam sens. :)
Darpan

Nie jestem pedantyczny, a angielski jest językiem wsparcia w tej grupie. Podstępne lub nie mówiąc, że jest to „maksymalna wersja, w której aplikacja obsługuje funkcje”, jest nie tylko błędne: jest całkowicie złe o 180 stopni. Jest to PIERWSZA lub minimalna wersja, która obsługuje wszystkie zamierzone funkcje aplikacji bez korzystania z trybów / bibliotek zgodności awaryjnej.
RichieHH

9

Jeśli na przykład występują błędy kompilacji:

<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**
        //...
    }

Pojawia się błąd kompilacji:

Pole wymaga interfejsu API na poziomie 11 (bieżąca wartość to 10): android.graphics.BitmapFactory $ Opcje # inBitmap

Od wersji 17 narzędzi programistycznych Android (ADT) istnieje jedna nowa i bardzo przydatna adnotacja, @TargetApiktóra może to bardzo łatwo naprawić. Dodaj go przed metodą, która zawiera problematyczną deklarację:

@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**
            //...
      }
    }

Teraz nie ma błędów kompilacji i będzie działać!

EDYCJA: Spowoduje to błąd w czasie wykonywania na poziomie API niższym niż 11. Na 11 lub wyższym będzie działał bez problemów. Musisz więc mieć pewność, że wywołasz tę metodę na ścieżce wykonania chronionej przez sprawdzanie wersji. TargetApi pozwala tylko na kompilację, ale uruchamiasz go na własne ryzyko.


1
Jestem tym zdezorientowany. Co się stanie, jeśli później uruchomisz aplikację w systemie z SDK 10?
Fran Marzoa

Będzie oczekiwać opcji.in.initmap instrukcja i aplikacja powinna działać poprawnie.
NinjaCoder

1

android:minSdkVersioni android:targetSdkVersionoba są wartościami całkowitymi, które musimy zadeklarować w pliku manifestu Androida, ale oba mają różne właściwości.

android:minSdkVersion:Jest to minimalny wymagany poziom interfejsu API do uruchomienia aplikacji na Androida. Jeśli zainstalujemy tę samą aplikację na niższej wersji API, pojawi się błąd analizatora składni i pojawi się problem z brakiem obsługi aplikacji.

android:targetSdkVersion:Docelowa wersja SDK to ustawienie docelowego poziomu interfejsu API aplikacji. jeśli ten atrybut nie zostanie zadeklarowany w manifeście, wersja minSdk będzie wersją TargetSdk. Jest to zawsze prawdą, że „instalacja obsługi aplikacji na wszystkich wyższych wersjach API zadeklarowaliśmy jako wersję TargetSdk”. Aby aplikacja była ograniczonym celem, musimy zadeklarować maxSdkVersion w naszym pliku manifestu ...


0

Jeśli tworzysz aplikacje wymagające niebezpiecznych uprawnień i ustaw wartość docelową SDK na 23 lub wyższą , powinieneś zachować ostrożność. Jeśli nie sprawdzisz uprawnień w środowisku wykonawczym, otrzymasz SecurityException, a jeśli używasz kodu wewnątrz bloku próbnego, na przykład otwartej kamery, wykrycie błędu może być trudne, jeśli nie sprawdzisz logcat.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.