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

Przejrzałem dokumentację do budowania z Gradle, ale nadal nie jestem pewien, jaka jest różnica między compileSdkVersion a targetSdkVersion.

Mówi tylko:

Właściwość compileSdkVersion określa cel kompilacji.

Co to jest "cel kompilacji"?

Widzę dwa możliwe sposoby, aby to zinterpretować:

  1. compileSdkVersion jest wersją kompilatora używaną do budowania aplikacji, natomiast {[1] } jest poziomem API , który cele aplikacji " . (Gdyby tak było, założyłbym, że compileSdkVersion musi być większe lub równe targetSdkVersion?
  2. Mają na myśli to samo. "compilation target" = = "poziom API, który aplikacja ma na celu" Coś jeszcze?

Widzę, że to pytanie było już zadawane, ale jedna odpowiedź cytuje tylko doc, co jest dla mnie niejasne.

Author: Community, 2014-11-02

9 answers

CompileSdkVersion

{[0] } to wersja API, z którą aplikacja jest kompilowana. Oznacza to, że możesz korzystać z funkcji Android API zawartych w tej wersji API (jak również wszystkich poprzednich wersjach, oczywiście). Jeśli spróbujesz użyć funkcji API 16, ale ustawisz compileSdkVersion na 15, pojawi się błąd kompilacji. Jeśli ustawisz compileSdkVersion Na 16, możesz nadal uruchamiać aplikację na urządzeniu API 15, o ile ścieżki uruchamiania aplikacji nie będą próbowały wywołać żadnych interfejsów API specyficznych dla API 16.

TargetSdkVersion

targetSdkVersion nie ma nic wspólnego z tym, jak aplikacja jest kompilowana lub jakie API można wykorzystać. targetSdkVersion ma wskazywać, że przetestowałeś swoją aplikację na (prawdopodobnie do i włącznie) wersji, którą podałeś. Jest to bardziej jak certyfikacja lub wyloguj się, podajesz SYSTEM OPERACYJNY Android jako wskazówkę, jak powinien obsługiwać Twoją aplikację pod względem funkcji systemu operacyjnego.

Na przykład, jak dokumentacja stwierdza:

Dla przykład, ustawienie tej wartości na" 11 " lub wyższą pozwala systemowi zastosować nowy domyślny motyw (Holo) do aplikacji, gdy działa na Androidzie 3.0 lub wyższym...

System operacyjny Android, w czasie wykonywania , może zmienić sposób, w jaki aplikacja jest stylizowana lub wykonywana w inny sposób w kontekście systemu operacyjnego na podstawie tej wartości. Istnieje kilka innych znanych przykładów, na które ma wpływ ta wartość, a lista ta prawdopodobnie wzrośnie z czasem.

Dla wszystkich praktycznych celów, większość aplikacji jest ustaw targetSdkVersion na najnowszą wersję API. Zapewni to, że aplikacja wygląda tak dobrze, jak to możliwe na najnowszych urządzeniach z Androidem. Jeśli nie podasz targetSdkVersion, domyślnie jest to minSdkVersion.

 429
Author: Jeff Mixon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-01 23:17:30

Jako jeden z przewodników:

minSdkVersion <= targetSdkVersion <= compileSdkVersion

Najlepiej:

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

Read more from this great post by Ian Lake

 115
Author: Jimmy Kane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-15 19:03:55

compileSdkVersion powinna być najnowsza stabilna wersja. targetSdkVersion powinny być w pełni przetestowane i mniejsze lub równe compileSdkVersion.

 29
Author: androidwifi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-27 17:49:11

Późno na mecz.. istnieje kilka świetnych odpowiedzi powyżej-zasadniczo, że compileSdkVersion jest wersją API, z którą aplikacja jest kompilowana, podczas gdy targetSdkVersion wskazuje wersję, z którą aplikacja była testowana.

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

  1. Że targetSdkVersion wpływ na sposób, w jaki wymagane są uprawnienia :

    • jeśli urządzenie działa z systemem Android 6.0 (poziom API 23) lub wyższym, W przypadku, gdy użytkownik nie jest zalogowany na swoim koncie, nie ma możliwości zalogowania się do swojego konta.
    • Jeśli urządzenie działa z systemem Android 5.1 (poziom API 22) lub niższy, lub aplikacja targetSdkVersion jest 22 lub niższy, system prosi użytkownika o przyznanie uprawnień, gdy użytkownik instaluje aplikację.
  2. Jeśli compileSdkVersion jest wyższa niż wersja zadeklarowana przez targetSdkVersion aplikacji, system może włączyć zachowanie zgodności, aby upewnić się, że aplikacja będzie nadal działać pracuj tak, jak oczekujesz. (ref)

  3. Z każdym nowym wydaniem Androida...

    • targetSdkVersion należy zwiększyć, aby dopasować najnowszy poziom API, a następnie dokładnie przetestować aplikację na odpowiedniej wersji platformy
    • compileSdkVersion, z drugiej strony, nie musi być zmieniany, chyba że dodajesz funkcje wyłącznie do nowej wersji platformy
    • w rezultacie, podczas gdy targetSdkVersion jest często (początkowo) mniejsza niż compileSdkVersion, nie jest rzadkością zobacz dobrze utrzymaną / ugruntowaną aplikację z targetSdkVersion > compileSdkVersion
 21
Author: Austin D,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-02 23:09:30

The CompileSdkVersion jest to wersja platformy SDK, z którą aplikacja współpracuje do kompilacji, itp. podczas procesu rozwoju (należy zawsze używać najnowszej) jest to dostarczane z wersją API, której używasz

Tutaj wpisz opis obrazka

Zobaczysz to w swoim pliku build.gradle:

Tutaj wpisz opis obrazka

targetSdkVersion: zawiera informacje, które aplikacja zostanie dostarczona po procesie rozwoju do sklepu app store, który umożliwia jej 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ż obecnie.Na przykład, możesz kierować API 18, nawet jeśli aktualna wersja to 23.

Przyjrzyj się dobrze tej oficjalnej stronie Google .

 18
Author: ojonugwa ochalifu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-18 20:24:36

Widzę wiele różnic w compiledSdkVersion w poprzednich odpowiedziach, więc postaram się wyjaśnić trochę tutaj, po stronie Androida.

A - co mówi Android

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

Wybieranie wersji platformy i poziomu API podczas tworzenia swojej aplikacji, trzeba będzie wybrać wersję platformy przed którą skompilujesz aplikację. ogólnie należy skompilować Twoja aplikacja w najniższej możliwej wersji platformy że Twoja aplikacja może wspierać.

Więc to byłaby odpowiednia kolejność według Androida:

compiledSdkVersion = minSdkVersion <= targetSdkVersion

B - co mówią inni

Niektórzy wolą zawsze używać najwyższej skompilowanej wersji skdversion. To dlatego, że będą polegać na podpowiedziach do kodu, aby sprawdzić, czy używają nowszych funkcji API niż minSdkVersion, a więc albo zmieniając kod, aby ich nie używać, albo sprawdzając wersję API użytkownika w czasie wykonywania, aby warunkowo używać ich z zapasami dla starszych wersji API.

Podpowiedzi o przestarzałych zastosowaniach pojawią się również w kodzie, informując cię, że coś jest przestarzałe w nowszych poziomach API, więc możesz odpowiednio zareagować, jeśli chcesz.

Tak więc, według innych byłaby to właściwa kolejność:

minSdkVersion <= targetSdkVersion <= compiledSdkVersion (highest possible)

Co robić?

To zależy od Ciebie i Twojego app.

Jeśli planujesz oferować różne funkcje API w zależności od poziomu API użytkownika w czasie wykonywania, użyj opcji B. otrzymasz wskazówki dotyczące funkcji, których używasz podczas kodowania. Upewnij się tylko, że nigdy nie używasz nowszych funkcji API niż minSdkVersion bez sprawdzania poziomu API użytkownika w czasie wykonywania, w przeciwnym razie Twoja aplikacja ulegnie awarii. To podejście ma również zalety uczenia się, co nowe i co stare podczas kodowania.

Jeśli już wiesz, co jest nowe lub stare i tworzysz jednorazową aplikację to na pewno nigdy nie zostanie zaktualizowane, lub jesteś pewien, że nie będzie oferować nowe funkcje API warunkowo, a następnie użyć opcji A. nie będzie przeszkadzać z przestarzałych podpowiedzi i nigdy nie będzie w stanie korzystać z nowszych funkcji API, nawet jeśli jesteś kuszony, aby to zrobić.

 6
Author: CGodo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-12 11:11:16

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

Jeśli chodzi o "wersję docelową", to po prostu odnosi się do tego, co planowałeś celować w pierwszej kolejności i prawdopodobnie przetestowałeś. Jeśli nie wykonałeś należytej staranności, jest to sposób na poinformowanie Androida, że musi wykonać dodatkowe kontrole przed wdrożeniem twojego powiedzmy "Lollipop" aplikacja ukierunkowana na "Oreo".

Więc" wersja docelowa "nie jest oczywiście niższa niż "minimalna wersja SDK", ale nie może być wyższa niż"wersja skompilowana".

 1
Author: Prab,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-16 02:51:04

Nie odpowiadam 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 compileSDKVersion i targetSDKVersion.

Tutaj wpisz opis obrazka

 1
Author: sshturma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-12 03:03:41

Ustawienia aplikacji Właściwości projektu Android w Visual Studio 2017 (15.8.5) wydają się mieć je połączone lub coś w tym stylu:

Tutaj wpisz opis obrazka

 0
Author: samis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-21 12:50:45