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.