Przejrzałem dokumentację dotyczącą budowania z Gradle, ale wciąż nie jestem pewien, jaka jest różnica między compileSdkVersion
i targetSdkVersion
.
Wszystko co mówi to:
compileSdkVersion
Właściwość określa cel kompilacji.
Czym jest „cel kompilacji”?
Widzę dwa możliwe sposoby interpretacji tego:
compileSdkVersion
Jest to wersja kompilatora stosowanych w budowaniu aplikacji, podczas gdytargetSdkVersion
jest „poziom API celów aplikacyjnych” . (Gdyby tak było, zakładam, żecompileSdkVersion
musi być większa lub równatargetSdkVersion
?- Oni oznaczają to samo. „cel kompilacji” == „poziom interfejsu API, na który jest kierowana aplikacja”
- Coś innego?
Widzę, że to pytanie zostało zadane wcześniej, ale jedna odpowiedź po prostu cytuje dokument, co jest dla mnie niejasne.
android
sdk
android-gradle-plugin
android-build
coder123
źródło
źródło
Odpowiedzi:
compileSdkVersion
Jest
compileSdkVersion
to 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śćcompileSdkVersion
15, pojawi się błąd kompilacji. Jeśli ustawisz wartośćcompileSdkVersion
16, 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
targetSdkVersion
ma to nic wspólnego z kompilacją aplikacji ani z interfejsami API, których możesz użyć. MatargetSdkVersion
to 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 :
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ć
targetSdkVersion
najnowszą wersję API. Dzięki temu Twoja aplikacja będzie wyglądać jak najlepiej na najnowszych urządzeniach z Androidem. Jeśli nie określisztargetSdkVersion
, domyślnie będzie tominSdkVersion
.źródło
targetSdkVersion
najprawdopodobniej będzie wyższycompileSdkVersion
i 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śćtargetSdkVersion
do 21, aby wskazać, że system operacyjny Android może zastosować dowolne style Lollipop, które mogą istnieją w Twojej aplikacji.compileSdkVersion
na 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ćcompileSdkVersion
na 21. Jednak aplikacja prawdopodobnie będzie działać dobrze na API 21 w takim stanie, w jakim się znajduje, więc zmienisztargetSdkVersion
aby 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), dlategocompileSdkVersion
w tym przykładzie możesz pozostać przy 15.Jako przewodnik oneliner:
Idealnie:
Przeczytaj więcej z tego wspaniałego postu autorstwa Iana Lake
źródło
minSdkVersion
oznacza, że działa aplikacja najniższego poziomu interfejsu APIcan
? Przypuszczalnie dlatego, że używa pewnych API dostępnych odminSdkVersion
początku?minSdkVersion
jest 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)compileSdkVersion
Powinna być najnowsza wersja stabilna.targetSdkVersion
Powinny być w pełni przetestowane i mniejsza lub równacompileSdkVersion
.źródło
targetSdkVersion
niższą. WięctargetSdkVersion
powinien być tym, który przetestowałeś i znasz dokładne zachowanie, i może być <= najnowsza stabilna.compileSdkVersion
powinna 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 .Późno do gry .. i jest kilka świetnych odpowiedzi powyżej - zasadniczo, że
compileSdkVersion
jest to wersja interfejsu API, z którą aplikacja jest skompilowana, podczas gdytargetSdkVersion
wskazuje wersję, z którą aplikacja została przetestowana.Chciałbym uzupełnić te odpowiedzi następującymi uwagami:
Że
targetSdkVersion
wpływa na sposób, w jaki uprawnienia są wymagane :targetSdkVersion
ma 23 lub więcej, aplikacja żąda uprawnień od użytkownika w czasie wykonywania.targetSdkVersion
ma 22 lub mniej, system prosi użytkownika o przyznanie uprawnień, gdy użytkownik zainstaluje aplikację.Jeśli
compileSdkVersion
jest 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 )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 platformycompileSdkVersion
, z drugiej strony, nie trzeba go zmieniać, chyba że dodasz funkcje wyłącznie do nowej wersji platformytargetSdkVersion
często (początkowo) jest niższy niżcompileSdkVersion
, często zdarza się, że dobrze utrzymana / ustanowiona aplikacja ztargetSdkVersion > compileSdkVersion
źródło
targetSdkVersion
możesz zobaczyć zachowania zgodności. Nie wierzę, że to ma coś wspólnego zcompileSdkVersion
.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 APIZobaczysz to w swoim
build.gradle
pliku:targetSdkVersion:
zawiera informacje, z którymi aplikacja jest dostarczana PO zakończeniu procesu programowania do sklepu z aplikacjami, który pozwala na toTARGET 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 .
źródło
Widzę wiele różnic
compiledSdkVersion
w 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 :
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ę.
źródło
<uses-sdk>
Dokumentacja jest bardzo niejasne i niejednoznaczne.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”.
źródło
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
compileSDKVersion
itargetSDKVersion
.źródło
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:
źródło
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
źródło
Ustawienia aplikacji właściwości projektu Android w Visual Studio 2017 (15.8.5) łączą je:
źródło