Gestore sandbox Sdk

public final class SdkSandboxManager
extends Object

java.lang.Object
   ↳ android.app.sdksandbox.SdkSandboxManager


Fornisce le API per caricare SDKs nel processo sandbox dell'SDK e quindi interagirvi.

La sandbox dell'SDK è un processo Java in esecuzione in un intervallo UID separato. Ogni app può avere il proprio processo sandbox dell'SDK.

L'app deve prima dichiarare gli SDK da cui dipende nel file manifest utilizzando il tag <uses-sdk-library>. Le app possono caricare nella sandbox dell'SDK solo gli SDK da cui dipendono.

Riepilogo

Classi nidificate

interface SdkSandboxManager.SdkSandboxProcessDeathCallback

Un callback per il monitoraggio degli eventi di interruzione della sandbox dell'SDK. 

Costanti

String EXTRA_DISPLAY_ID

Il nome della chiave da utilizzare nei campi Bundle di requestSurfacePackage(java.lang.String, android.os.Bundle, java.util.concurrent.Executor, android.os.OutcomeReceiver), il suo valore deve definire l'ID numero intero della visualizzazione logica per visualizzare SurfacePackage.

String EXTRA_HEIGHT_IN_PIXELS

Il nome della chiave da utilizzare nei campi Bundle di requestSurfacePackage(java.lang.String, android.os.Bundle, java.util.concurrent.Executor, android.os.OutcomeReceiver). Il suo valore deve definire l'altezza intera di SurfacePackage in pixel.

String EXTRA_HOST_TOKEN

Il nome della chiave da utilizzare nei campi Bundle di requestSurfacePackage(java.lang.String, android.os.Bundle, java.util.concurrent.Executor, android.os.OutcomeReceiver), il suo valore dovrebbe presentare il token restituito da SurfaceView.getHostToken() una volta che SurfaceView è stato aggiunto alla gerarchia delle visualizzazioni.

String EXTRA_SURFACE_PACKAGE

Il nome della chiave nel bundle che viene passato alla funzione onResult di OutcomeReceiver, che è il campo requestSurfacePackage(java.lang.String, android.os.Bundle, java.util.concurrent.Executor, android.os.OutcomeReceiver), il cui valore presenta il valore SurfacePackage richiesto.

String EXTRA_WIDTH_IN_PIXELS

Il nome della chiave da utilizzare nei campi Bundle di requestSurfacePackage(java.lang.String, android.os.Bundle, java.util.concurrent.Executor, android.os.OutcomeReceiver); il suo valore deve definire la larghezza intera di SurfacePackage in pixel.

int LOAD_SDK_ALREADY_LOADED

L'SDK è già stato caricato.

int LOAD_SDK_INTERNAL_ERROR

Errore interno durante il caricamento dell'SDK.

int LOAD_SDK_NOT_FOUND

SDK non trovato.

int LOAD_SDK_SDK_DEFINED_ERROR

Errore SDK dopo il caricamento.

int LOAD_SDK_SDK_SANDBOX_DISABLED

La sandbox dell'SDK è disattivata.

int REQUEST_SURFACE_PACKAGE_INTERNAL_ERROR

Errore interno durante la richiesta di SurfacePackage.

int REQUEST_SURFACE_PACKAGE_SDK_NOT_LOADED

L'SDK non è stato caricato durante la richiesta di un SurfacePackage.

int SDK_SANDBOX_PROCESS_NOT_AVAILABLE

La procedura sandbox dell'SDK non è disponibile.

String SDK_SANDBOX_SERVICE

Da utilizzare con Context#getSystemService(String) per recuperare un SdkSandboxManager per interagire con gli SDK appartenenti a questa applicazione client.

int SDK_SANDBOX_STATE_DISABLED

La sandbox dell'SDK è disattivata.

int SDK_SANDBOX_STATE_ENABLED_PROCESS_ISOLATION

La sandbox dell'SDK è attivata.

Metodi pubblici

void addSdkSandboxProcessDeathCallback(Executor callbackExecutor, SdkSandboxManager.SdkSandboxProcessDeathCallback callback)

Aggiunge un callback che viene registrato per gli eventi del ciclo di vita della sandbox dell'SDK, come l'interruzione della sandbox dell'SDK.

void addSyncedSharedPreferencesKeys(Set<String> keys)

Aggiunge chiavi al set di chiavi in fase di sincronizzazione dal SharedPreferences predefinito dell'app alla sandbox dell'SDK.

List<AppOwnedSdkSandboxInterface> getAppOwnedSdkSandboxInterfaces()

Recupera un elenco di AppOwnedSdkSandboxInterface registrati per un'app

List<SandboxedSdk> getSandboxedSdks()

Recupera le informazioni sugli SDK caricati nella sandbox.

static int getSdkSandboxState()

Restituisce lo stato attuale della disponibilità della funzionalità sandbox dell'SDK.

Set<String> getSyncedSharedPreferencesKeys()

Restituisce le chiavi impostate che vengono sincronizzate dal valore predefinito dell'app SharedPreferences alla sandbox dell'SDK.

void loadSdk(String sdkName, Bundle params, Executor executor, OutcomeReceiver<SandboxedSdkLoadSdkException> receiver)

Carica l'SDK in un processo Java della sandbox dell'SDK.

void registerAppOwnedSdkSandboxInterface(AppOwnedSdkSandboxInterface appOwnedSdkSandboxInterface)

Registra AppOwnedSdkSandboxInterface per un processo dell'app.

void removeSdkSandboxProcessDeathCallback(SdkSandboxManager.SdkSandboxProcessDeathCallback callback)

Rimuove un elemento SdkSandboxProcessDeathCallback precedentemente aggiunto tramite addSdkSandboxProcessDeathCallback(java.util.concurrent.Executor, android.app.sdksandbox.SdkSandboxManager.SdkSandboxProcessDeathCallback)

void removeSyncedSharedPreferencesKeys(Set<String> keys)

Rimuove le chiavi dal gruppo di chiavi aggiunte utilizzando addSyncedSharedPreferencesKeys(java.util.Set)

Le chiavi rimosse verranno cancellate dalla sandbox dell'SDK se sono già state sincronizzate.

void requestSurfacePackage(String sdkName, Bundle params, Executor callbackExecutor, OutcomeReceiver<BundleRequestSurfacePackageException> receiver)

Invia una richiesta di pacchetto della piattaforma all'SDK.

void startSdkSandboxActivity(Activity fromActivity, IBinder sdkActivityToken)

Avvia un'istanza Activity nella sandbox dell'SDK.

void unloadSdk(String sdkName)

Consente di annullare il caricamento di un SDK caricato in precedenza dal chiamante.

void unregisterAppOwnedSdkSandboxInterface(String name)

Consente di annullare la registrazione di ERROR(/AppOwnedSdkSandboxInterfaces) per il processo di un'app.

Metodi ereditati

Costanti

ID_DISPLAY_EXTRA

public static final String EXTRA_DISPLAY_ID

Il nome della chiave da utilizzare nei campi Bundle di requestSurfacePackage(java.lang.String, android.os.Bundle, java.util.concurrent.Executor, android.os.OutcomeReceiver), il suo valore deve definire l'ID numero intero della visualizzazione logica per visualizzare SurfacePackage.

Valore costante: "android.app.sdksandbox.extra.DISPLAY_ID"

EXTRA_HEIGHT_IN_PIXELS

public static final String EXTRA_HEIGHT_IN_PIXELS

Il nome della chiave da utilizzare nei campi Bundle di requestSurfacePackage(java.lang.String, android.os.Bundle, java.util.concurrent.Executor, android.os.OutcomeReceiver). Il suo valore deve definire l'altezza intera di SurfacePackage in pixel.

Valore costante: "android.app.sdksandbox.extra.HEIGHT_IN_PIXELS"

EXTRA_HOST_TOKEN

public static final String EXTRA_HOST_TOKEN

Il nome della chiave da utilizzare nei campi Bundle di requestSurfacePackage(java.lang.String, android.os.Bundle, java.util.concurrent.Executor, android.os.OutcomeReceiver), il suo valore dovrebbe presentare il token restituito da SurfaceView.getHostToken() una volta che SurfaceView è stato aggiunto alla gerarchia delle visualizzazioni. Per attivare i report ANR è accettato solo un valore non null.

Valore costante: "android.app.sdksandbox.extra.HOST_TOKEN"

PACCHETTO_EXTRA_SURFACE

public static final String EXTRA_SURFACE_PACKAGE

Il nome della chiave nel bundle che viene passato alla funzione onResult di OutcomeReceiver, che è il campo requestSurfacePackage(java.lang.String, android.os.Bundle, java.util.concurrent.Executor, android.os.OutcomeReceiver), il cui valore presenta il valore SurfacePackage richiesto.

Valore costante: "android.app.sdksandbox.extra.SURFACE_PACKAGE"

EXTRA_WIDTH_IN_PIXELS

public static final String EXTRA_WIDTH_IN_PIXELS

Il nome della chiave da utilizzare nei campi Bundle di requestSurfacePackage(java.lang.String, android.os.Bundle, java.util.concurrent.Executor, android.os.OutcomeReceiver); il suo valore deve definire la larghezza intera di SurfacePackage in pixel.

Valore costante: "android.app.sdksandbox.extra.WIDTH_IN_PIXELS"

LOAD_SDK_ALREADY_LOADED

public static final int LOAD_SDK_ALREADY_LOADED

L'SDK è già stato caricato.

Questo indica che l'applicazione client ha tentato di ricaricare lo stesso SDK chiamando loadSdk(java.lang.String, android.os.Bundle, java.util.concurrent.Executor, android.os.OutcomeReceiver) dopo essere stato caricato correttamente.

Valore costante: 101 (0x00000065)

LOAD_SDK_INTERNAL_ERROR

public static final int LOAD_SDK_INTERNAL_ERROR

Errore interno durante il caricamento dell'SDK.

Indica che si è verificato un errore interno generico durante l'applicazione della chiamata dall'applicazione client.

Valore costante: 500 (0x000001f4)

CARICA_SDK_NOT_FOUND

public static final int LOAD_SDK_NOT_FOUND

SDK non trovato.

Questo indica che l'applicazione client ha tentato di caricare un SDK non esistente chiamando loadSdk(java.lang.String, android.os.Bundle, java.util.concurrent.Executor, android.os.OutcomeReceiver).

Valore costante: 100 (0x00000064)

LOAD_SDK_SDK_DEFINED_ERROR

public static final int LOAD_SDK_SDK_DEFINED_ERROR

Errore SDK dopo il caricamento.

Questo indica che l'SDK ha riscontrato un errore durante l'inizializzazione post-caricamento. I dettagli possono essere ottenuti dal bundle restituito in LoadSdkException tramite il codice OutcomeReceiver trasmesso a SdkSandboxManager#loadSdk.

Valore costante: 102 (0x00000066)

LOAD_SDK_SDK_SANDBOX_DISABILITATO

public static final int LOAD_SDK_SDK_SANDBOX_DISABLED

La sandbox dell'SDK è disattivata.

Questo indica che la sandbox dell'SDK è disattivata. Anche eventuali tentativi successivi di caricare SDK in questo avvio non andranno a buon fine.

Valore costante: 103 (0x00000067)

REQUEST_SURFACE_PACKAGE_INTERNAL_ERROR

public static final int REQUEST_SURFACE_PACKAGE_INTERNAL_ERROR

Errore interno durante la richiesta di SurfacePackage.

Indica che si è verificato un errore interno generico durante la richiesta di SurfacePackage.

Valore costante: 700 (0x000002bc)

REQUEST_SURFACE_PACKAGE_SDK_NOT_LOADED

public static final int REQUEST_SURFACE_PACKAGE_SDK_NOT_LOADED

L'SDK non è stato caricato durante la richiesta di un SurfacePackage.

Ciò indica che l'SDK per il quale viene richiesta l'API SurfacePackage non è stato caricato, perché la sandbox non è più disponibile o perché non è stato caricato inizialmente.

Valore costante: 701 (0x000002bd)

SDK_SANDBOX_PROCESS_NOT_AVAILABLE

public static final int SDK_SANDBOX_PROCESS_NOT_AVAILABLE

La procedura sandbox dell'SDK non è disponibile.

Ciò indica che il processo sandbox dell'SDK non è disponibile, perché è terminato, è disconnesso o non è stato creato inizialmente.

Valore costante: 503 (0x000001f7)

SDK_SANDBOX_SERVICE

public static final String SDK_SANDBOX_SERVICE

Da utilizzare con Context#getSystemService(String) per recuperare un SdkSandboxManager per interagire con gli SDK appartenenti a questa applicazione client.

Valore costante: "sdk_sandbox"

SDK_SANDBOX_STATE_DISABLED

public static final int SDK_SANDBOX_STATE_DISABLED

La sandbox dell'SDK è disattivata.

SdkSandboxManager API sono nascoste. Tentativi di chiamata daranno luogo a UnsupportedOperationException.

Valore costante: 0 (0x00000000)

SDK_SANDBOX_STATE_ENABLED_PROCESS_ISOLATION

public static final int SDK_SANDBOX_STATE_ENABLED_PROCESS_ISOLATION

La sandbox dell'SDK è attivata.

L'app può utilizzare le API SdkSandboxManager per caricare l'elemento SDKs in base al processo corrispondente nel processo sandbox dell'SDK corrispondente.

Valore costante: 2 (0x00000002)

Metodi pubblici

addSdkSandboxProcessDeathCallback

public void addSdkSandboxProcessDeathCallback (Executor callbackExecutor, 
                SdkSandboxManager.SdkSandboxProcessDeathCallback callback)

Aggiunge un callback che viene registrato per gli eventi del ciclo di vita della sandbox dell'SDK, come l'interruzione della sandbox dell'SDK. Se la sandbox non è stata ancora creata quando viene richiamata, la richiesta viene archiviata fino alla creazione di una sandbox, dopodiché viene attivata per quella sandbox. È possibile aggiungere più callback per rilevare la morte e non verranno rimossi quando la sandbox si esaurisce.

Parametri
callbackExecutor Executor: il valore Executor sul quale richiamare il callback Questo valore non può essere null. Gli eventi di callback e di listener vengono inviati tramite questo Executor, offrendo un modo semplice per controllare quale thread viene utilizzato. Per inviare eventi tramite il thread principale della tua applicazione, puoi utilizzare Context.getMainExecutor(). In caso contrario, specifica un Executor che verrà inviato al thread appropriato.

callback SdkSandboxManager.SdkSandboxProcessDeathCallback: SdkSandboxProcessDeathCallback che riceverà gli eventi del ciclo di vita della sandbox dell'SDK. Questo valore non può essere null.

addSyncedSharedPreferencesKeys

public void addSyncedSharedPreferencesKeys (Set<String> keys)

Aggiunge chiavi al set di chiavi in fase di sincronizzazione dal SharedPreferences predefinito dell'app alla sandbox dell'SDK.

I dati sincronizzati saranno disponibili per gli SDK per la lettura utilizzando l'API SdkSandboxController.getClientSharedPreferences().

Per interrompere la sincronizzazione di qualsiasi chiave aggiunta utilizzando questa API, utilizza removeSyncedSharedPreferencesKeys(java.util.Set).

La sincronizzazione si interrompe se l'app si riavvia e l'utente deve richiamare nuovamente l'API per ricreare il pool di chiavi per la sincronizzazione.

Nota: questo corso non supporta l'utilizzo in più processi.

Parametri
keys Set: set di chiavi che verrà sincronizzato con la sandbox. Questo valore non può essere null.

getAppOwnedSdkSandboxInterfaces

public List<AppOwnedSdkSandboxInterface> getAppOwnedSdkSandboxInterfaces ()

Recupera un elenco di AppOwnedSdkSandboxInterface registrati per un'app

Ritorni
List<AppOwnedSdkSandboxInterface> elenco vuoto se parlando di Info non trovato nella mappa, altrimenti un elenco di AppOwnedSdkSandboxInterface Questo valore non può essere null.

GetSandboxedSdks

public List<SandboxedSdk> getSandboxedSdks ()

Recupera le informazioni sugli SDK caricati nella sandbox.

Ritorni
List<SandboxedSdk> Elenco di SandboxedSdk contenente tutti gli SDK attualmente caricati. Questo valore non può essere null.

getSdkSandboxState

public static int getSdkSandboxState ()

Restituisce lo stato attuale della disponibilità della funzionalità sandbox dell'SDK.

Ritorni
int Il valore è SDK_SANDBOX_STATE_DISABLED o SDK_SANDBOX_STATE_ENABLED_PROCESS_ISOLATION

getSyncedSharedPreferencesKeys

public Set<String> getSyncedSharedPreferencesKeys ()

Restituisce le chiavi impostate che vengono sincronizzate dal valore predefinito dell'app SharedPreferences alla sandbox dell'SDK.

Ritorni
Set<String> Questo valore non può essere null.

LoadSdk

public void loadSdk (String sdkName, 
                Bundle params, 
                Executor executor, 
                OutcomeReceiver<SandboxedSdkLoadSdkException> receiver)

Carica l'SDK in un processo Java della sandbox dell'SDK.

Carica la libreria SDK con sdkName in un processo sandbox dell'SDK in modo asincrono. Il chiamante riceverà una notifica tramite receiver.

Il chiamante dovrebbe già dichiarare SDKs da cui dipende nel manifest utilizzando il tag <uses-sdk-library>. Il chiamante può caricare solo SDKs a seconda di quale elemento dipende nella sandbox dell'SDK.

Quando l'applicazione client carica il primo SDK, viene creato un nuovo processo sandbox dell'SDK. Se è già stata creata una sandbox per l'applicazione client, nella stessa sandbox verranno caricati SDK aggiuntivi.

Questa API può essere chiamata solo mentre il chiamante è in esecuzione in primo piano. Le chiamate in background restituiranno LoadSdkException in receiver.

Parametri
sdkName String: nome dell'SDK da caricare. Questo valore non può essere null.

params Bundle: parametri aggiuntivi da trasmettere all'SDK sotto forma di Bundle, come concordato tra il client e l'SDK. Questo valore non può essere null.

executor Executor: l'elemento Executor su cui richiamare il destinatario. Questo valore non può essere null. Gli eventi di callback e di listener vengono inviati tramite questo Executor, offrendo un modo semplice per controllare quale thread viene utilizzato. Per inviare eventi tramite il thread principale della tua applicazione, puoi utilizzare Context.getMainExecutor(). In caso contrario, specifica un Executor che verrà inviato al thread appropriato.

receiver OutcomeReceiver: riceve un SandboxedSdk se l'esecuzione è andata a buon fine oppure LoadSdkException. Questo valore non può essere null.

registryAppProprietàSdkSandboxInterface

public void registerAppOwnedSdkSandboxInterface (AppOwnedSdkSandboxInterface appOwnedSdkSandboxInterface)

Registra AppOwnedSdkSandboxInterface per un processo dell'app.

La registrazione di un AppOwnedSdkSandboxInterface con lo stesso nome di un'interfaccia registrata in precedenza genererà IllegalStateException.

AppOwnedSdkSandboxInterface#getName() si riferisce al nome dell'interfaccia.

Parametri
appOwnedSdkSandboxInterface AppOwnedSdkSandboxInterface: l'AppOwnedSdkSandboxInterface da registrare Questo valore non può essere null.

removeSdkSandboxProcessDeathCallback

public void removeSdkSandboxProcessDeathCallback (SdkSandboxManager.SdkSandboxProcessDeathCallback callback)

Rimuove un elemento SdkSandboxProcessDeathCallback precedentemente aggiunto tramite addSdkSandboxProcessDeathCallback(java.util.concurrent.Executor, android.app.sdksandbox.SdkSandboxManager.SdkSandboxProcessDeathCallback)

Parametri
callback SdkSandboxManager.SdkSandboxProcessDeathCallback: SdkSandboxProcessDeathCallback che è stato aggiunto in precedenza utilizzando SdkSandboxManager#addSdkSandboxProcessDeathCallback(Executor, SdkSandboxProcessDeathCallback). Questo valore non può essere null.

removeSyncedSharedPreferencesKeys

public void removeSyncedSharedPreferencesKeys (Set<String> keys)

Rimuove le chiavi dal gruppo di chiavi aggiunte utilizzando addSyncedSharedPreferencesKeys(java.util.Set)

Le chiavi rimosse verranno cancellate dalla sandbox dell'SDK se sono già state sincronizzate.

Parametri
keys Set: insieme di nomi delle chiavi che non devono più essere sincronizzati con la sandbox. Questo valore non può essere null.

requestSurfacePackage

public void requestSurfacePackage (String sdkName, 
                Bundle params, 
                Executor callbackExecutor, 
                OutcomeReceiver<BundleRequestSurfacePackageException> receiver)

Invia una richiesta di pacchetto della piattaforma all'SDK.

Dopo che l'applicazione client ha ricevuto un indicatore relativo al caricamento dell'SDK riuscito e ha aggiunto un SurfaceView alla gerarchia delle visualizzazioni, potrebbe richiedere in modo asincrono un SurfacePackage per eseguire il rendering di una vista dall'SDK.

Quando SurfacePackage è pronto, verrà richiamato il callback OutcomeReceiver#onResult del receiver passato. Questo callback conterrà un oggetto Bundle, che conterrà la chiave SdkSandboxManager#EXTRA_SURFACE_PACKAGE il cui valore associato è il SurfacePackage richiesto.

Il valore params passato deve contenere le seguenti chiavi: EXTRA_WIDTH_IN_PIXELS, SdkSandboxManager#EXTRA_HEIGHT_IN_PIXELS, SdkSandboxManager#EXTRA_DISPLAY_ID e SdkSandboxManager#EXTRA_HOST_TOKEN. Se una di queste chiavi non è presente o non è valida, verrà generato un valore IllegalArgumentException.

Questa API può essere chiamata solo mentre il chiamante è in esecuzione in primo piano. Le chiamate in background restituiranno RequestSurfacePackageException in receiver.

Parametri
sdkName String: nome dell'SDK caricato nella sandbox dell'SDK. Questo valore non può essere null.

params Bundle: i parametri che l'applicazione client passa all'SDK. Questo valore non può essere null.

callbackExecutor Executor: il valore Executor sul quale richiamare il callback Questo valore non può essere null. Gli eventi di callback e di listener vengono inviati tramite questo Executor, offrendo un modo semplice per controllare quale thread viene utilizzato. Per inviare eventi tramite il thread principale della tua applicazione, puoi utilizzare Context.getMainExecutor(). In caso contrario, specifica un Executor che verrà inviato al thread appropriato.

receiver OutcomeReceiver: in caso di esito positivo, viene restituito un valore Bundle che conterrà la chiave SdkSandboxManager#EXTRA_SURFACE_PACKAGE con un valore SurfacePackage o RequestSurfacePackageException in caso di errore. Questo valore non può essere null.

Tiri
IllegalArgumentException se params non contiene tutte le chiavi richieste.

attivitàstartSdkSandbox

public void startSdkSandboxActivity (Activity fromActivity, 
                IBinder sdkActivityToken)

Avvia un'istanza Activity nella sandbox dell'SDK.

Questa funzione avvierà un nuovo Activity nella stessa attività del fromActivity passato e lo trasmetterà all'SDK che ha condiviso il sdkActivityToken passato che identifica una richiesta di tale SDK per ottenere questo Activity.

Activity non verrà avviato nei seguenti casi:

  • L'app che chiama questa API è in background.
  • Il valore sdkActivityToken passato non è mappato a una richiesta di un Activity dall'SDK che lo ha condiviso con l'app chiamante.
  • L'SDK che ha condiviso l'elemento sdkActivityToken passato ha rimosso la sua richiesta per questo Activity.
  • La sandbox Activity è già stata creata.

Parametri
fromActivity Activity: Activity verrà utilizzato per avviare la nuova sandbox Activity chiamando Activity#startActivity(Intent). Questo valore non può essere null.

sdkActivityToken IBinder: l'identificatore condiviso dall'SDK che richiede l'oggetto Activity. Questo valore non può essere null.

unloadSdk

public void unloadSdk (String sdkName)

Consente di annullare il caricamento di un SDK caricato in precedenza dal chiamante.

Non è garantito che la memoria allocata per questo SDK verrà liberata immediatamente. Tutte le chiamate successive a requestSurfacePackage(java.lang.String, android.os.Bundle, java.util.concurrent.Executor, android.os.OutcomeReceiver) per il sdkName specificato non andranno a buon fine.

Questa API può essere chiamata solo mentre il chiamante è in esecuzione in primo piano. Le chiamate in background generano un SecurityException.

Parametri
sdkName String: nome dell'SDK da scaricare. Questo valore non può essere null.

unregisterAppOwnedSdkSandboxInterface

public void unregisterAppOwnedSdkSandboxInterface (String name)

Consente di annullare la registrazione di ERROR(/AppOwnedSdkSandboxInterfaces) per il processo di un'app.

Parametri
name String: il nome con cui è stata registrata la proprietà AppOwnedSdkSandboxInterface. Questo valore non può essere null.