Właściwości wersji pakietu Android SDK

Aplikacje na Androida mogą ustawiać w pliku build.gradle wiele właściwości wersji pakietu SDK. Dokumentacja Androida build.gradle wyjaśnia, co te właściwości oznaczają dla aplikacji. Z tego dokumentu dowiesz się, jak te właściwości wpływają na kompilacje NDK.

compileSdkVersion

Ta właściwość nie ma wpływu na kompilacje NDK. Dostępność interfejsu API w NDK zależy od minSdkVersion. Wynika to z faktu, że symbole C++ są rozwiązywane od razu podczas wczytywania biblioteki, a nie dopiero przy pierwszym wywołaniu (jak w przypadku Javy). Użycie symboli, które nie są dostępne w minSdkVersion, spowoduje, że biblioteka nie będzie się ładować w wersjach systemu operacyjnego, które nie mają nowszego interfejsu API, niezależnie od tego, czy te interfejsy API będą wywoływane.

W przypadku nowej aplikacji wybierz najnowszą dostępną wersję. W przypadku istniejącej aplikacji zaktualizuj ją do najnowszej wersji, gdy będzie to wygodne.

targetSdkVersion

Podobnie jak w przypadku Javy, targetSdkVersion aplikacji może zmienić działanie kodu natywnego w środowisku wykonawczym. Zmiany w działaniu systemu są w miarę możliwości stosowane tylko w przypadku aplikacji, których targetSdkVersion jest większy lub równy wersji systemu operacyjnego, w której wprowadzono zmianę.

W przypadku nowej aplikacji wybierz najnowszą dostępną wersję. W przypadku istniejącej aplikacji zaktualizuj ją do najnowszej wersji, gdy będzie to wygodne (po zaktualizowaniu compileSdkVersion).

Deweloperzy aplikacji zwykle znają targetSdkVersion swojej aplikacji, ale ten interfejs API jest przydatny dla deweloperów bibliotek, którzy nie wiedzą, jakie targetSdkVersion wybiorą ich użytkownicy.

Podczas działania aplikacji możesz uzyskać adres targetSdkVersion używany przez aplikację, wywołując funkcję android_get_application_target_sdk_version(). Ten interfejs API jest dostępny na poziomie interfejsu API 24 i nowszych. Ta funkcja ma następujący podpis:

/**
 * Returns the `targetSdkVersion` of the caller, or `__ANDROID_API_FUTURE__` if
 * there is no known target SDK version (for code not running in the context of
 * an app).
 *
 * The returned values correspond to the named constants in `<android/api-level.h>`,
 * and is equivalent to the AndroidManifest.xml `targetSdkVersion`.
 *
 * See also android_get_device_api_level().
 *
 * Available since API level 24.
 */
int android_get_application_target_sdk_version() __INTRODUCED_IN(24);

Inne zmiany w działaniu mogą zależeć od poziomu interfejsu API urządzenia. Poziom API urządzenia, na którym działa Twoja aplikacja, możesz uzyskać, wywołując android_get_device_api_level(). Ta funkcja ma następujący podpis:

/**
 * Returns the API level of the device we're actually running on, or -1 on failure.
 * The returned values correspond to the named constants in `<android/api-level.h>`,
 * and is equivalent to the Java `Build.VERSION.SDK_INT` API.
 *
 * See also android_get_application_target_sdk_version().
 */
int android_get_device_api_level();

Pobieranie poziomów interfejsu API urządzenia umożliwia dynamiczne rozpoznawanie przez kod NDK zmian w zachowaniu platformy. Pomniejsze poziomy interfejsu API nie są powiązane ze zmianami w działaniu, a obecnie nie planujemy dodawania nowych funkcji NDK na pomniejszych poziomach interfejsu API, dlatego nie można uzyskać pełnego poziomu interfejsu API urządzenia bezpośrednio z wywołania NDK.

Możesz używać silnych lub słabych odwołań do interfejsu API, aby wywoływać nowsze interfejsy API niż te, które określa minSdkVersion.dlopen()dlsym()

maxSdkVersion

Ta właściwość nie ma wpływu na kompilacje NDK.

minSdkVersion

Wartość minSdkVersion ustawiona w pliku build.gradle określa, które interfejsy API są dostępne w czasie kompilacji (zobacz compileSdkVersion, aby dowiedzieć się, dlaczego różni się to od kompilacji w języku Java), i określa minimalną wersję systemu operacyjnego, z którą Twój kod będzie zgodny.

minSdkVersion jest używany przez NDK do określania funkcji, których można używać podczas kompilowania kodu. Na przykład ta właściwość określa, które funkcje FORTIFY są używane w bibliotece libc, a także może poprawić wydajność lub rozmiar (np. hasze GNU lub RELR) w przypadku plików binarnych, które nie są zgodne ze starszymi wersjami Androida. Nawet jeśli nie używasz żadnych nowych interfejsów API, ta właściwość nadal określa minimalną obsługiwaną wersję systemu operacyjnego w Twoim kodzie.

W przypadku nowej aplikacji dane o dystrybucji użytkowników znajdziesz w Kreatorze nowego projektu w Android Studio lub na stronie apilevels.com. Wybierz odpowiedni kompromis między potencjalnym udziałem w rynku a kosztami utrzymania. Im niższy jest Twój minSdkVersion, tym więcej czasu poświęcisz na rozwiązywanie starych błędów i dodawanie funkcji rezerwowych do funkcji, które nie zostały jeszcze wdrożone.

W przypadku istniejącej aplikacji zwiększaj minSdkVersion, gdy stare poziomy interfejsu API przestają być warte kosztów utrzymania, lub zmniejszaj go, jeśli użytkownicy tego wymagają i jest to warte nowych kosztów utrzymania. Konsola Play zawiera dane dotyczące dystrybucji użytkowników Twojej aplikacji.

minSdkVersion aplikacji jest udostępniana preprocesorowi za pomocą makra __ANDROID_MIN_SDK_VERSION__ (starsze makro __ANDROID_API__ jest identyczne, ale zalecamy używanie pierwszego z nich, ponieważ jego znaczenie jest bardziej oczywiste). To makro jest automatycznie definiowane przez Clang, więc nie musisz dołączać nagłówka, aby go używać. W przypadku kompilacji NDK to makro jest zawsze zdefiniowane.