Proprietà della versione dell'SDK Android

Le applicazioni Android possono impostare una serie di proprietà della versione dell'SDK nel file build.gradle. La documentazione di Android build.gradle spiega il significato di queste proprietà per l'applicazione in generale. Questo documento spiega in che modo queste proprietà influiscono sulle build NDK.

compileSdkVersion

Questa proprietà non ha alcun effetto sulle build NDK. La disponibilità dell'API per l'NDK è invece regolata da minSdkVersion. Questo perché i simboli C++ vengono risolti in modo eager al momento del caricamento della libreria anziché in modo lazy alla prima chiamata (come in Java). L'utilizzo di simboli non disponibili in minSdkVersion causerà il mancato caricamento della libreria sulle versioni del sistema operativo che non dispongono dell'API più recente, indipendentemente dal fatto che queste API vengano chiamate o meno.

Per una nuova app, scegli la versione più recente disponibile. Per un'app esistente, aggiorna questo valore all'ultima versione quando ti è più comodo.

targetSdkVersion

Analogamente a Java, il targetSdkVersion della tua app può modificare il comportamento del runtime del codice nativo. Quando possibile, le modifiche al comportamento del sistema vengono applicate solo alle app con un targetSdkVersion maggiore o uguale alla versione del sistema operativo che ha introdotto la modifica.

Per una nuova app, scegli la versione più recente disponibile. Per un'app esistente, esegui l'aggiornamento all'ultima versione quando ti è più comodo (dopo l'aggiornamento di compileSdkVersion).

Sebbene gli sviluppatori di applicazioni conoscano generalmente l'targetSdkVersion della propria app, questa API è utile per gli sviluppatori di librerie che non possono sapere quale targetSdkVersion sceglieranno i loro utenti.

In fase di runtime, puoi ottenere targetSdkVersion utilizzato da un'applicazione chiamando android_get_application_target_sdk_version(). Questa API è disponibile nel livello API 24 e versioni successive. Questa funzione ha la seguente firma:

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

Altri cambiamenti di comportamento potrebbero dipendere dal livello API del dispositivo. Puoi ottenere il livello API del dispositivo su cui è in esecuzione la tua applicazione chiamando android_get_device_api_level(). Questa funzione ha la seguente firma:

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

L'ottenimento dei livelli API del dispositivo consente al codice NDK di rilevare dinamicamente le modifiche al comportamento della piattaforma. Poiché i livelli API secondari non sono legati a modifiche del comportamento e al momento non prevediamo di aggiungere nuove funzionalità NDK nei livelli API secondari, non è possibile ottenere il livello API completo del dispositivo direttamente da una chiamata NDK.

Puoi utilizzare riferimenti API dlopen()/dlsym() o deboli per chiamare API più recenti rispetto a quelle specificate in minSdkVersion.

maxSdkVersion

Questa proprietà non ha alcun effetto sulle build NDK.

minSdkVersion

Il valore minSdkVersion impostato nel file build.gradle determina quali API sono disponibili in fase di compilazione (vedi compileSdkVersion per capire perché questo valore è diverso dalle build Java) e determina la versione minima del sistema operativo con cui il codice sarà compatibile.

minSdkVersion viene utilizzato dall'NDK per determinare quali funzionalità possono essere utilizzate durante la compilazione del codice. Ad esempio, questa proprietà determina quali funzionalità di FORTIFY vengono utilizzate in libc e può anche attivare miglioramenti delle prestazioni o delle dimensioni (come hash GNU o RELR) per i tuoi file binari che non sono compatibili con versioni precedenti di Android. Anche se non utilizzi nuove API, questa proprietà governa comunque la versione minima del sistema operativo supportata dal tuo codice.

Per una nuova app, consulta i dati di distribuzione degli utenti nella procedura guidata Nuovo progetto di Android Studio o su apilevels.com. Scegli il giusto equilibrio tra la potenziale quota di mercato e i costi di manutenzione. Più basso è il valore di minSdkVersion, più tempo dovrai dedicare alla risoluzione di bug precedenti e all'aggiunta di comportamenti di fallback per le funzionalità non ancora implementate.

Per un'app esistente, aumenta il valore di minSdkVersion ogni volta che i vecchi livelli API non valgono più i costi di manutenzione o riducilo se i tuoi utenti lo richiedono e vale la pena sostenere i nuovi costi di manutenzione. Play Console dispone di metriche specifiche per la distribuzione degli utenti della tua app.

Il minSdkVersion della tua applicazione viene reso disponibile al preprocessor tramite la macro __ANDROID_MIN_SDK_VERSION__ (la macro __ANDROID_API__ precedente è identica, ma preferisci la prima perché il suo significato è più chiaro). Questa macro viene definita automaticamente da Clang, quindi non è necessario includere alcun header per utilizzarla. Per le build NDK, questa macro è sempre definita.