Android SDK-Versionsattribute

Bei Android-Anwendungen können in der Datei build.gradle eine Reihe von SDK-Versionsattributen festgelegt werden. In der Android-build.gradle-Dokumentation wird erläutert, was diese Eigenschaften im Allgemeinen für die App bedeuten. In diesem Dokument wird erläutert, wie sich diese Eigenschaften auf NDK-Builds auswirken.

CompileSdkVersion

Diese Eigenschaft hat keine Auswirkungen auf NDK-Builds. Die API-Verfügbarkeit für den NDK wird stattdessen von minSdkVersion geregelt. Das liegt daran, dass C++-Symbole, wie sie in Java sind, beim ersten Aufruf direkt aufgelöst werden, wenn die Bibliothek geladen wird. Die Verwendung von Symbolen, die in minSdkVersion nicht verfügbar sind, führt dazu, dass die Bibliothek bei Betriebssystemversionen ohne die neuere API nicht geladen wird. Dabei spielt es keine Rolle, ob diese APIs aufgerufen werden oder nicht.

Wählen Sie für eine neue App die neueste verfügbare Version aus. Wenn es sich um eine vorhandene App handelt, aktualisieren Sie diese bei Bedarf auf die neueste Version.

targetSdkVersion

Ähnlich wie bei Java kann die targetSdkVersion Ihrer Anwendung das Laufzeitverhalten von nativem Code ändern. Verhaltensänderungen im System werden, wenn möglich, nur auf Anwendungen angewendet, deren targetSdkVersion größer oder gleich der Betriebssystemversion ist, in der die Änderung eingeführt wurde.

Wählen Sie für eine neue App die neueste verfügbare Version aus. Bei einer vorhandenen Anwendung aktualisieren Sie gegebenenfalls auf die neueste Version (nach dem Aktualisieren von compileSdkVersion).

Anwendungsentwickler kennen zwar die targetSdkVersion ihrer App im Allgemeinen, diese API ist aber nützlich für Bibliotheksentwickler, die nicht wissen, welche targetSdkVersion ihre Nutzer auswählen.

Zur Laufzeit können Sie den targetSdkVersion, der von einer Anwendung verwendet wird, durch Aufrufen von android_get_application_target_sdk_version() abrufen. Diese API ist ab API-Ebene 24 verfügbar. Diese Funktion hat die folgende Signatur:

/**
 * 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);

Andere Verhaltensänderungen können vom API-Level des Geräts abhängen. Die API-Ebene des Geräts, auf dem deine App ausgeführt wird, erhältst du durch Aufrufen von android_get_device_api_level(). Diese Funktion hat die folgende Signatur:

/**
 * 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();

maxSdkVersion

Diese Eigenschaft hat keine Auswirkungen auf NDK-Builds.

minSdkVersion

Das in Ihrer build.gradle-Datei festgelegte minSdkVersion bestimmt, welche APIs zum Zeitpunkt des Builds verfügbar sind (siehe compileSdkVersion, um zu verstehen, warum dies von Java-Builds abweicht) und bestimmt die Mindestversion des Betriebssystems, mit der Ihr Code kompatibel ist.

Das minSdkVersion wird vom NDK verwendet, um zu bestimmen, welche Features beim Kompilieren des Codes verwendet werden können. Diese Eigenschaft bestimmt beispielsweise, welche FORTIFY-Features in libc verwendet werden, und kann Leistungs- oder Größenverbesserungen (wie GNU-Hashes oder RELR) für Ihre Binärprogramme ermöglichen, die nicht mit älteren Android-Versionen kompatibel sind. Auch wenn Sie keine neuen APIs verwenden, bestimmt dieses Attribut die Mindestversion des Betriebssystems Ihres Codes.

Für eine neue App kannst du die Verteilungsdaten der Nutzer im Neuen Projektassistenten von Android Studio oder auf apilevels.com abrufen. Wähle ein ausgewogenes Verhältnis zwischen potenziellem Marktanteil und Wartungskosten aus. Je niedriger der minSdkVersion, desto mehr Zeit können Sie sich damit aufwenden, alte Fehler zu umgehen und Fallback-Verhalten für Funktionen hinzuzufügen, die noch nicht implementiert wurden.

Erhöhen Sie bei einer vorhandenen Anwendung den minSdkVersion, wenn alte API-Levels die Wartungskosten nicht mehr wert sind, oder senken Sie den Wert, wenn Ihre Nutzer ihn benötigen und sich die neuen Wartungskosten lohnen. Die Play Console enthält Messwerte, die für den Vertrieb Ihrer App spezifisch sind.

Das minSdkVersion Ihrer Anwendung wird dem Präprozessor über das __ANDROID_MIN_SDK_VERSION__-Makro zur Verfügung gestellt. Das Legacy-__ANDROID_API__ ist identisch, wird aber Ersteres bevorzugt, da seine Bedeutung klarer ist. Dieses Makro wird automatisch von Clang definiert, sodass kein Header enthalten sein muss, um es zu verwenden. Bei NDK-Builds ist dieses Makro immer definiert.