Jaka jest różnica między wersją min SDK / docelową wersją SDK a wersją kompilowaną SDK?

214

Jakie są różnice między „minimalną wersją SDK / docelową wersją SDK” a „kompilacją wersji SDK”? Wiem, co oznacza min i docelowy SDK, ale co oznacza kompilacja wersji SDK?

W Eclipse mam min / max i docelowy SDK, ale w Android Studio są te trzy ustawienia.

Tobiasz
źródło
Obecnie pracuję nad aplikacją, w której używałem targetdkversion jako 12, a wszystkie moje układy działają bardzo nieprawidłowo, a następnie zmieniam z powrotem na 23 i działa to jak urok, więc myślę, że wersja targetdk musi być zawsze taka sama jak wersja skompilowana
Shahid Sarwar,

Odpowiedzi:

232

Wersja min sdk to najwcześniejsza wersja zestawu Android SDK, na którym aplikacja może działać. Zwykle jest to spowodowane problemem z wcześniejszymi interfejsami API, brakiem funkcjonalności lub innym problemem związanym z zachowaniem.

Wersja docelowa SDK jest wersja aplikacji został skierowany do pracy na. Idealnie wynika to z pewnego rodzaju optymalnych warunków pracy. Jeśli miałbyś „stworzyć swoją aplikację dla wersji 19”, to właśnie tutaj by to zostało określone. Może działać na wcześniejszych lub późniejszych wersjach, ale do tego właśnie dążyłeś. Ma to głównie na celu wskazanie aktualności Twojej aplikacji na rynku itp.

Wersja kompilacji SDK jest wersja android IDE (lub inne środki kompilacji przypuszczam) używa się, aby swoją aplikację podczas publikowania .apkpliku. Jest to przydatne do testowania aplikacji, ponieważ często trzeba ją kompilować podczas jej opracowywania. Ponieważ będzie to wersja do skompilowania w APK, będzie to oczywiście wersja Twojego wydania. Podobnie wskazane jest, aby dopasować to do docelowej wersji SDK.

Matt
źródło
Moja kompilacyjna wersja SDK i docelowa wersja SDK są takie same. To 21. Moja aplikacja ulega awarii, gdy uruchamiam ją na urządzeniach z niższym poziomem API. Jestem nowym użytkownikiem Androida, jak mam teraz postępować?
prgmrDev
2
@prgmrDev Jeśli aplikacja zawiesza się w wersjach niższych niż 21, prawdopodobnie powinieneś ustawić swoją minimalną wersję SDK na 21. To nie naprawi twojej aplikacji na celach niższych niż 21, po prostu zauważysz, że twoja aplikacja nie jest obsługiwana w niższych wersjach. Masz również możliwość ustalenia, co dokładnie psuje twoją aplikację (co zmieniło się w wersji 21) i dodaj wsparcie, aby zająć się tą zależnością, ale podejrzewam, że będzie to dużo pracy i nie będzie w zakresie początkującego Androida projekt.
Matt
1
Co się stanie, jeśli ustawię minSdkVersion = 14; targetSdkVersion = 23; i skompilować SDK do 19?
thadeuszlay 20.04.16
5
@ thadeuszlay twoje pytanie jest nieistotne, ponieważ powinieneś pomyśleć trochę, że jeśli chcesz uruchomić wersję 23, to jak można ją skompilować z 19! Postępuj zgodnie ze wzorem minSdkVersion <= targetSdkVersion <= compileSdkVersion
Asad
@Matt może się zdarzyć, że na przykład podczas korzystania z compileVersion 26 przypadkowo używam funkcji lub interfejsu API języka Java, który nie jest obsługiwany w wersji 21, czyli min sdk? przepraszam, ale nie
mam
83

Wzór jest następujący

minSdkVersion <= targetSdkVersion <= compileSdkVersion

minSdkVersion - to znacznik określający minimalną wersję Androida, na której aplikacja będzie mogła zostać zainstalowana. Jest także używany przez Linta, aby uniemożliwić wywołanie API, które nie istnieje. Ma również wpływ na czas kompilacji. Możesz więc użyć smaków kompilacji, aby zastąpić minSdkVersion do maksimum podczas programowania. Pomoże to przyspieszyć kompilację przy użyciu wszystkich ulepszeń, które zapewnia nam zespół Androida. Na przykład niektóre funkcje Java 8 są dostępne tylko w określonej wersji minSdkVersion.

targetSdkVersion - mówi system Android, aby włączyć określone zmiany zachowania.

Na przykład:

  • Począwszy od Androida 6.0 (poziom API 23) Runtime Permissionszostały wprowadzone. Jeśli ustawisz wartość targetSdkVersion22 lub niższą, aplikacja nie będzie pytać użytkownika o pozwolenie w czasie wykonywania.

  • Począwszy od Androida 8.0 (poziom API 26), wszystkie notificationsmuszą być przypisane do kanału, inaczej nie pojawi się. Na urządzeniach z Androidem 7.1 (API poziom 25) i niższymi użytkownicy mogą zarządzać powiadomieniami tylko dla poszczególnych aplikacji (w rzeczywistości każda aplikacja ma tylko jeden kanał na Androida 7.1 i niższy).

  • Począwszy Androida 9 (poziom API 28) Web-based data directories separated by process. Jeśli targetSdkVersionmasz 28+ i utworzysz kilka WebViewróżnych procesów, otrzymaszjava.lang.RuntimeException

compileSdkVersion - w rzeczywistości jest to wersja platformy SDK i mówi Gradle, którego zestawu SDK systemu Android używa do kompilacji. Jeśli chcesz korzystać z nowych funkcji lub debugować .javapliki z zestawu SDK systemu Android, powinieneś zadbać o compileSdkVersion. Jeszcze jednym przykładem jest użycie systemu AndroidX, który zmusza do użycia compileSdkVersion- poziom 28. compileSdkVersion nie jest uwzględniony w pakiecie APK : jest używany wyłącznie w compile time. Zmiana metody compileSdkVersion nie zmienia zachowania środowiska wykonawczego. Może generować na przykład nowe ostrzeżenia / błędy nowego kompilatora. Dlatego zdecydowanie zaleca się, aby zawsze kompilować z najnowszym zestawem SDK. Otrzymasz wszystkie korzyści z nowych kontroli kompilacji istniejącego kodu, unikniesz nowo przestarzałych interfejsów API i będziesz gotowy do korzystania z nowych interfejsów API. Jeszcze jeden faktcompileSdkVersion >= Support Library version

Możesz przeczytać więcej na ten temat tutaj . Polecam również przyjrzeć się przykładowi migracji do Androida 8.0.

yoAlex5
źródło
9
Najlepsza odpowiedź tutaj, ponieważ faktycznie wyjaśnia praktyczną różnicę między targetSdkVersion a compileSdkVersion
Dean Wild
@ yoAlex5 Dziękujemy za odpowiedź. Widzę wiele przypadków targetSdkVersion i compileSdkVersion są takie same. Dlaczego Android stworzył dwa jako osobne, jeden nie może być wystarczający do obsługi lub czy jest jakiś konkretny powód, aby wejść w dwa osobne pola?
Manju
@Manju można znaleźć więcej w SO wątku stackoverflow.com/questions/26694108/…
yoAlex5
@ yoAlex5, co masz na myśli „system Android, aby włączyć określone zmiany zachowania”, czy możesz to wyjaśnić?
k_kumar
@atishr „specyficzne zmiany zachowania” są wymienione w bloku „Na przykład”
yoAlex5
74

Wersja min sdk to minimalna wersja systemu operacyjnego Android wymagana do uruchomienia aplikacji.

Wersja docelowa SDK jest wersja Androida, że Twoja aplikacja została stworzona do pracy na.

Wersja kompilacji SDK jest wersja Androida że narzędzia kompilacji zastosowania do kompilowania i budowania aplikacji w celu uwolnienia, biegać, lub debugowania.

Zwykle kompilowana wersja SDK i docelowa wersja SDK są takie same.

anuraagia
źródło
23
A kiedy nie są to te same zalety / wady?
proszek 366 Wrze
4

compileSdkVersion : 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 compileSdkVersion na 15, pojawi się błąd kompilacji. Jeśli ustawisz compileSdkVersion na 16, nadal możesz uruchomić aplikację na urządzeniu API 15.

minSdkVersion : Wersja min sdk to minimalna wersja systemu operacyjnego Android wymagana do uruchomienia aplikacji.

targetSdkVersion : Docelowa wersja SDK to wersja, na której aplikacja ma działać.

Vinay John
źródło