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.