Jaka jest różnica między compileSdkVersion a targetSdkVersion?


525

Przejrzałem dokumentację dotyczącą budowania z Gradle, ale wciąż nie jestem pewien, jaka jest różnica między compileSdkVersioni targetSdkVersion.

Wszystko co mówi to:

compileSdkVersionWłaściwość określa cel kompilacji.

Czym jest „cel kompilacji”?

Widzę dwa możliwe sposoby interpretacji tego:

  1. compileSdkVersionJest to wersja kompilatora stosowanych w budowaniu aplikacji, podczas gdy targetSdkVersionjest „poziom API celów aplikacyjnych” . (Gdyby tak było, zakładam, że compileSdkVersionmusi być większa lub równa targetSdkVersion?
  2. Oni oznaczają to samo. „cel kompilacji” == „poziom interfejsu API, na który jest kierowana aplikacja”
  3. Coś innego?

Widzę, że to pytanie zostało zadane wcześniej, ale jedna odpowiedź po prostu cytuje dokument, co jest dla mnie niejasne.



2
targetSdkVersion to urządzenie, na którym działa Twoje urządzenie. Więc jeśli twoje urządzenia działają niżej niż Oreo, to nie
celuj w

Odpowiedzi:


546

compileSdkVersion

Jest compileSdkVersionto wersja interfejsu API, z którą jest kompilowana aplikacja. Oznacza to, że możesz używać funkcji interfejsu API Androida zawartych w tej wersji interfejsu API (a także oczywiście we wszystkich poprzednich wersjach). Jeśli spróbujesz użyć funkcji API 16, ale ustawisz wartość compileSdkVersion15, pojawi się błąd kompilacji. Jeśli ustawisz wartość compileSdkVersion16, możesz nadal uruchamiać aplikację na urządzeniu z interfejsem API 15, o ile ścieżki wykonywania aplikacji nie będą próbowały wywoływać interfejsów API specyficznych dla interfejsu API 16.

targetSdkVersion

Nie targetSdkVersionma to nic wspólnego z kompilacją aplikacji ani z interfejsami API, których możesz użyć. Ma targetSdkVersionto oznaczać, że przetestowałeś aplikację (prawdopodobnie do włącznie) w podanej wersji. To bardziej przypomina certyfikację lub wylogowanie się z systemu operacyjnego Android jako wskazówkę, jak powinien obsługiwać aplikację pod względem funkcji systemu operacyjnego.

Na przykład, jak stwierdzono w dokumentacji :

Na przykład ustawienie tej wartości na „11” lub wyższą pozwala systemowi zastosować nowy domyślny motyw (Holo) do aplikacji, gdy jest uruchomiony na Androidzie 3.0 lub nowszym ...

System operacyjny Android w czasie wykonywania może zmieniać stylizację lub wykonanie aplikacji w kontekście systemu operacyjnego na podstawie tej wartości. Istnieje kilka innych znanych przykładów, na które ta wartość ma wpływ, a lista ta prawdopodobnie wzrośnie z czasem.

Ze względów praktycznych większość aplikacji będzie chciała ustawić targetSdkVersionnajnowszą wersję API. Dzięki temu Twoja aplikacja będzie wyglądać jak najlepiej na najnowszych urządzeniach z Androidem. Jeśli nie określisz targetSdkVersion, domyślnie będzie to minSdkVersion.


14
Nie, targetSdkVersionnajprawdopodobniej będzie wyższy compileSdkVersioni słusznie. Oznacza to, że chociaż zaprojektowałeś aplikację do kierowania na API 16, na przykład nadal działa dobrze na API 21 (Lollipop) i powinieneś podnieść jej wartość targetSdkVersiondo 21, aby wskazać, że system operacyjny Android może zastosować dowolne style Lollipop, które mogą istnieją w Twojej aplikacji.
Jeff Mixon

24
Zasadniczo nie rozumiem, w jaki sposób możesz kierować zestaw SDK wyższy niż zestaw SDK, z którym skompilowałeś.
coder123

55
Przejście compileSdkVersionna wyższą wersję oznaczałoby, że chcesz użyć nowych interfejsów API, które są zawarte tylko w tej konkretnej wersji. Jeśli nie planujesz używać żadnych funkcji specyficznych dla Lollipop w swojej aplikacji, to naprawdę (zwykle) nie ma powodu, aby kiedykolwiek ustawiać compileSdkVersionna 21. Jednak aplikacja prawdopodobnie będzie działać dobrze na API 21 w takim stanie, w jakim się znajduje, więc zmienisz targetSdkVersionaby wskazać, że aplikacja działa zgodnie z oczekiwaniami (docelowymi) w interfejsie API 21, ale nie używasz żadnych interfejsów API specyficznych dla 21 (kompilacja), dlatego compileSdkVersionw tym przykładzie możesz pozostać przy 15.
Jeff Mixon

19
Gdy robię to w Android Studio, pojawia się ostrzeżenie. Mam „compileSdkVersion 17” i „targetSdkVersion 22” i mówi mi, że „targetSdkVersion nie powinien być wyższy niż compileSdkVersion”. Och, właśnie to zmieniłem, a teraz mówi mi, że targetSdkVersion nie jest najnowszą wersją 22 i że tryb kompatybilności może się uruchomić. Westchnienie.
Pelpotronic,

18
Ta odpowiedź jest sprzeczna z tym, co mówi Android Studio. targetSdkVersion ma znaczenie i powinien być mniejszy lub równy compileSdkVersion
ARK

152

Jako przewodnik oneliner:

minSdkVersion <= targetSdkVersion <= compileSdkVersion

Idealnie:

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

Przeczytaj więcej z tego wspaniałego postu autorstwa Iana Lake


Czy minSdkVersion oznacza, że działa aplikacja najniższego poziomu interfejsu API can? Przypuszczalnie dlatego, że używa pewnych API dostępnych od minSdkVersionpoczątku?
Nitin Bansal,

1
@NitinBansal tak. Na przykład jeśli minSdkVersionjest to 15 (czyli ICS 4.0.3), urządzenia z interfejsem API 14 (czyli ICS 4.0) nie powinny móc zainstalować aplikacji. A przynajmniej na razie aplikacja będzie działać w dniach 15, 16, 17, 18, 19, (20, ale dotyczy to starego zużycia), 21, 22, 23, 24, 25, 26, 27, 28 i tak dalej w przyszłości (prawdopodobnie)
Louis Tsai

33

compileSdkVersionPowinna być najnowsza wersja stabilna. targetSdkVersionPowinny być w pełni przetestowane i mniejsza lub równa compileSdkVersion.


14
Czy jest jakiś konkretny powód, aby powiedzieć, że targetSdkVersion jest mniejszy niż compileSdkVersion? Uważam, że to błędne stwierdzenie
Sufian,

6
Chyba chodzi o to, że ostatnia wersja jest kompatybilna wstecz, więc najnowsza wersja API może „zachowywać się” jak starsze, jeśli ustawisz na targetSdkVersionniższą. Więc targetSdkVersionpowinien być tym, który przetestowałeś i znasz dokładne zachowanie, i może być <= najnowsza stabilna.
Dielson Sales

Myślę, że twoje stwierdzenie „ compileSdkVersionpowinna być najnowszą stabilną wersją” powinno być poprzedzone sufiksem „z którego korzystasz z funkcji API”. Kompilacja z API 27 (najnowszym stabilnym API) nie ma sensu, jeśli używasz tylko funkcji niższej wersji API. Jednak najnowsza stabilna wersja może zawierać niektóre funkcje, które automatycznie stają się lepsze, np. Zwiększone bezpieczeństwo lub wydajna kompilacja z kompatybilnością wsteczną. Dlatego wskazane jest użycie najnowszej lub przynajmniej najnowszej stabilnej wersji, ale „nie powinna ona” być najnowszą wersją per se .
Erik

27

Późno do gry .. i jest kilka świetnych odpowiedzi powyżej - zasadniczo, że compileSdkVersionjest to wersja interfejsu API, z którą aplikacja jest skompilowana, podczas gdy targetSdkVersionwskazuje wersję, z którą aplikacja została przetestowana.

Chciałbym uzupełnić te odpowiedzi następującymi uwagami:

  1. Że targetSdkVersionwpływa na sposób, w jaki uprawnienia są wymagane :

    • Jeśli na urządzeniu działa system Android 6.0 (poziom API 23) lub wyższy, a aplikacja targetSdkVersionma 23 lub więcej, aplikacja żąda uprawnień od użytkownika w czasie wykonywania.
    • Jeśli na urządzeniu działa system Android 5.1 (poziom API 22) lub niższy albo aplikacja targetSdkVersionma 22 lub mniej, system prosi użytkownika o przyznanie uprawnień, gdy użytkownik zainstaluje aplikację.
  2. Jeśli compileSdkVersionjest wyższa niż wersja zadeklarowana przez aplikację targetSdkVersion, system może włączyć zachowania zgodności, aby zapewnić, że aplikacja będzie działać zgodnie z oczekiwaniami. ( ref )

  3. Z każdą nową wersją Androida ...

    • targetSdkVersion należy zwiększyć, tak aby pasował do najnowszego poziomu interfejsu API, a następnie dokładnie przetestuj aplikację na odpowiedniej wersji platformy
    • compileSdkVersion, z drugiej strony, nie trzeba go zmieniać, chyba że dodasz funkcje wyłącznie do nowej wersji platformy
    • W rezultacie, choć targetSdkVersionczęsto (początkowo) jest niższy niż compileSdkVersion, często zdarza się, że dobrze utrzymana / ustanowiona aplikacja ztargetSdkVersion > compileSdkVersion

5
Re: Twoja druga uwaga, nie sądzę, żeby dokument referencyjny wyraźnie to powiedział. Mówi: „Jeśli jednak poziom interfejsu API platformy jest wyższy niż wersja zadeklarowana przez targetSdkVersion aplikacji, system może włączyć zachowania zgodności, aby zapewnić, że aplikacja będzie działać zgodnie z oczekiwaniami”. Myślę, że oznacza to, że jeśli poziom interfejsu API urządzenia, na którym pracujesz, jest nowszy niż targetSdkVersionmożesz zobaczyć zachowania zgodności. Nie wierzę, że to ma coś wspólnego z compileSdkVersion.
Jeremy

20

The CompileSdkVersion jest wersją platformy SDK, z którą aplikacja współpracuje w celu kompilacji itp. PODCZAS procesu programowania (zawsze należy używać najnowszej wersji). Jest ona dostarczana z używaną wersją interfejsu API

wprowadź opis zdjęcia tutaj

Zobaczysz to w swoim build.gradlepliku:

wprowadź opis zdjęcia tutaj

targetSdkVersion:zawiera informacje, z którymi aplikacja jest dostarczana PO zakończeniu procesu programowania do sklepu z aplikacjami, który pozwala na to TARGET the SPECIFIED version of the Android platform. W zależności od funkcjonalności aplikacji może ona kierować wersje API niższe niż bieżąca. Na przykład możesz kierować API 18, nawet jeśli bieżąca wersja to 23.

Przyjrzyj się tej oficjalnej stronie Google .


9

Widzę wiele różnic compiledSdkVersionw poprzednich odpowiedziach, więc postaram się tu wyjaśnić, postępując zgodnie ze stroną internetową Androida.

Odp .: Co mówi Android

Według https://developer.android.com/guide/topics/manifest/uses-sdk-element.html :

Wybieranie wersji platformy i poziomu interfejsu API Podczas opracowywania aplikacji musisz wybrać wersję platformy, z którą będziesz kompilować aplikację. Ogólnie rzecz biorąc, należy skompilować aplikację na najniższej możliwej wersji platformy, którą może ona obsługiwać.

To byłaby właściwa kolejność według Androida:

compiledSdkVersion = minSdkVersion <= targetSdkVersion

B - Co mówią także inni

Niektóre osoby wolą zawsze korzystać z najwyższej dostępnej kompilacji SkdVersion. Jest tak, ponieważ będą polegać na wskazówkach do kodu, aby sprawdzić, czy używają nowszych funkcji API niż minSdkVersion, tym samym zmieniając kod, aby ich nie używał, lub sprawdzając wersję interfejsu użytkownika w czasie wykonywania, aby warunkowo używać ich z rezerwami dla starszych wersji API.

Wskazówki dotyczące przestarzałych zastosowań będą również pojawiać się w kodzie, informując, że coś jest przestarzałe na nowszych poziomach API, więc możesz odpowiednio zareagować, jeśli chcesz.

Według innych byłby to właściwy porządek:

minSdkVersion <= targetSdkVersion <= compiledSdkVersion (highest possible)

Co robić?

To zależy od Ciebie i Twojej aplikacji.

Jeśli planujesz oferować różne funkcje API w zależności od poziomu API użytkownika w czasie wykonywania, skorzystaj z opcji B. Otrzymasz wskazówki dotyczące funkcji używanych podczas kodowania. Tylko upewnij się, że nigdy nie używasz nowszych funkcji API niż minSdkVersion bez sprawdzania poziomu interfejsu API użytkownika w czasie wykonywania, w przeciwnym razie aplikacja ulegnie awarii. Podejście to ma również tę zaletę, że uczy się, co nowego, a co starego podczas kodowania.

Jeśli wiesz już, co jest nowe lub stare, i opracowujesz aplikację jednorazową, która z pewnością nigdy nie zostanie zaktualizowana, lub jesteś pewien, że nie zamierzasz oferować nowych funkcji interfejsu API warunkowo, skorzystaj z opcji A. z przestarzałymi podpowiedziami i nigdy nie będziesz mógł korzystać z nowszych funkcji API, nawet jeśli masz na to ochotę.


2
Nie sądzę, że porady na Androida są inne. Istnieje różnica między „kompilacją aplikacji względem najniższej możliwej wersji” a kompilacją z określoną wersją zestawu SDK. Powinieneś generalnie skompilować (compileSdkVersion) z najnowszą wersją, ustawić min (minSdkVersion) tak nisko, jak to możliwe i ustawić swój cel (targetSdkVersion) tak wysoko, jak to możliwe, z zastrzeżeniem testów lub innych problemów ze zgodnością.
Caltor

Dobry punkt @Ctortor. Chciałbym, żeby zaktualizowali ten dokument, aby wyjaśnić różnicę. <uses-sdk>Dokumentacja jest bardzo niejasne i niejednoznaczne.
Jeremy

2

Moje 2 centy: Kompiluj z dowolną wersją zestawu SDK, ale uważaj, aby nie wywoływać żadnych interfejsów API, których nie obsługuje „minimalna wersja zestawu SDK”. Oznacza to, że „można” skompilować z najnowszą wersją zestawu SDK.

Jeśli chodzi o „wersję docelową”, to po prostu odnosi się do tego, co planowałeś w pierwszej kolejności kierować i być może przetestowałeś. Jeśli nie dołożyłeś należytej staranności, jest to sposób na poinformowanie Androida, że ​​musi wykonać kilka dodatkowych kontroli przed wdrożeniem Twojej powiedzonej aplikacji „Lollipop” na „Oreo”.

Zatem „wersja docelowa” nie jest oczywiście niższa niż „minimalna wersja zestawu SDK”, ale nie może być wyższa niż „wersja skompilowana”.


1

Nie odpowiadając na twoje bezpośrednie pytania, ponieważ jest już wiele szczegółowych odpowiedzi, ale warto wspomnieć, że w przeciwieństwie do dokumentacji Androida, Android Studio sugeruje użycie tej samej wersji dla compileSDKVersioni targetSDKVersion.

wprowadź opis zdjęcia tutaj


0

compiledSdkVersion ==> która wersja zestawu SDK powinna skompilować kod do kodu bajtowego (używa go w środowisku programistycznym): lepiej użyć ostatniej wersji zestawu SDK.

minSdkVersion ==> te elementy wykorzystują do instalacji APK (używa w środowisku produkcyjnym). Na przykład:

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

0

Szybkie podsumowanie:

W przypadku minSDKversion zobacz najnowszy wpis w uchwycie Twittera: https://twitter.com/minSdkVersion

TargetSDKversion: zobacz najnowszy wpis w uchwycie Twittera: https://twitter.com/targtSdkVersion lub użyj najnowszego poziomu API, jak wskazano na stronie https://developer.android.com/guide/topics/manifest/uses-sdk-element. HTML

Wersja skompilowana: zrób to samo, co TargetSDKversion

maxSdkVersion: rada od Androida nie ustawiać tego, ponieważ nie chcesz ograniczać aplikacji do działania w przyszłych wersjach Androida


0

Ustawienia aplikacji właściwości projektu Android w Visual Studio 2017 (15.8.5) łączą je:

wprowadź opis zdjęcia tutaj

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.