Riferimento per le licenze

Classi e interfacce LVL

La tabella 1 elenca tutti i file sorgente nella sezione Verifica licenza Libreria (LVL) disponibile tramite l'SDK Android. Tutti i file fanno parte di il pacchetto com.android.vending.licensing.

Tabella 1. Riepilogo della libreria LVL e interfacce.

Categoria Nome Descrizione
Controllo della licenza e risultato Controllore licenza Classe per cui crei un'istanza (o sottoclasse) per avviare un controllo della licenza.
Callback controllo licenza Interfaccia che implementi per gestire i risultati del controllo delle licenze.
Norme Norme Interfaccia che implementi per determinare se consentire l'accesso all'applicazione, in base alla risposta della licenza.
Criterio gestito dal server Implementazione predefinita di Policy. Utilizza le impostazioni fornite dalla server di licenze per gestire l'archiviazione locale dei dati delle licenze, la validità delle licenze riprova.
Criteriorigoroso Implementazione alternativa di Policy. Obbliga le licenze sulla base di una solo la risposta alla licenza dal server. Nessuna memorizzazione nella cache o richiesta di nuovo tentativo.
Offuscamento dei dati
(facoltativo)
Offuscatore Interfaccia che implementi se utilizzi un Policy (ad esempio ServerManagedPolicy) che memorizza nella cache i dati delle risposte alle licenze in un archivio permanente. Applica un algoritmo di offuscamento per codificare e decodificare i dati scritti o lette.
AESOoffuscatore Implementazione predefinita dell'offuscatore che utilizza la crittografia/decrittografia AES per offuscare/non offuscare i dati.
Limitazioni del dispositivo
(facoltativo)
Limite di dispositivi Interfaccia che implementi se vuoi limitare l'utilizzo di un su un dispositivo specifico. Chiamata da LicenseValidator. Implementazione DeviceLimiter non è consigliato per la maggior parte delle applicazioni perché richiede un server di backend e potrebbe causare la perdita dell'accesso da parte dell'utente alle applicazioni concesse in licenza, a meno che non siano state progettate con cura.
NullDeviceLimiter L'implementazione predefinita di DeviceLimiter è indipendente (consente l'accesso a tutti dispositivi).
Base della libreria, nessuna integrazione necessaria Dati di risposta Classe che contiene i campi di una risposta alla licenza.
Strumento di convalida licenze Classe che decripta e verifica una risposta ricevuta dalla licenza o server web.
Eccezione convalida Classe che indica gli errori che si verificano durante la convalida dell'integrità dei dati gestite da un Offuscatore.
Offuscatore Preference Classe di utilità che scrive/legge dati offuscati nel SharedPreferences negozio.
Servizio di sicurezza Interfaccia IPC unidirezionale su cui viene passata una richiesta di controllo della licenza client di Google Play.
ILicenseResultListener Implementazione unidirezionale di callback IPC per cui l'applicazione riceve una risposta asincrona dal server di licenze.

Risposta del server

La tabella 2 elenca tutti i campi di risposta alle licenze restituiti dalla server di licenze.

Tabella 2. Riepilogo dei campi di risposta alle licenze restituiti dal server di Google Play.

Campo Descrizione
responseCode Il codice di risposta restituito dal server di licenze. I codici di risposta sono descritti in Codici di risposta del server.
signedData Una concatenazione di stringhe che contiene i dati restituiti dal server di licenze, come segue: responseCode|nonce|packageName|versionCode|userId|timestamp:extras.
  • responseCode: il codice di risposta restituito dal server di licenze.
  • nonce: identificatore nonce della richiesta.
  • packageName: il nome del pacchetto dell'app di cui controllare la licenza.
  • versionCode: il codice di versione dell'app di cui controllare la licenza.
  • userId: un ID univoco per l'utente per ogni app, dove lo stesso utente riceve un per un'altra app.
  • timestamp: il numero di millisecondi dall'epoca di 1970-01-01 00:00:00 UTC alla richiesta.
  • extras: informazioni aggiuntive per la gestione delle licenze dell'app. I campi aggiuntivi sono indicati in Ulteriori risposte al server.
signature La firma di signedData con una chiave specifica dell'app.

Codici di risposta del server

La tabella 3 elenca tutti i codici di risposta di licenza supportati dalla server di licenze. In generale, un'applicazione dovrebbe gestire tutte queste risposte i codici. Per impostazione predefinita, la classe LicenseValidator in LVL fornisce tutti la gestione necessaria di questi codici di risposta.

Tabella 3. Riepilogo dei codici di risposta restituiti dal server di Google Play in una risposta relativa alla licenza.

Codice di risposta Rappresentazione di valori interi Descrizione Firmato? Extra Commenti
LICENSED 0 L'applicazione è concessa in licenza all'utente. L'utente ha acquistato applicazione o disponi dell'autorizzazione a scaricare e installare la versione alpha o beta dell'applicazione. VT, GT e GR Consenti l'accesso in base ai vincoli Policy.
LICENSED_OLD_KEY 2 L'applicazione è concessa in licenza all'utente, ma è disponibile un'applicazione aggiornata disponibile firmata con una chiave diversa. VT, GT, GR, UT Facoltativamente, consenti l'accesso in base ai vincoli Policy.

Può indicare che la coppia di chiavi utilizzata dell'applicazione non è valida o è compromessa. L'applicazione può consentire l'accesso se necessario o informare l'utente che è disponibile un upgrade e limitarne l'utilizzo fino all'upgrade.

NOT_LICENSED 1 L'applicazione non è concessa in licenza all'utente. No Non consentire l'accesso.
ERROR_CONTACTING_SERVER 257 Errore locale: l'applicazione Google Play non è riuscita a raggiungere il server di licenze, probabilmente a causa di problemi di disponibilità di rete. No Riprova il controllo della licenza in base ai limiti di Policy nuovi tentativi.
ERROR_SERVER_FAILURE 4 Errore del server: il server non è riuscito a caricare la chiave dell'applicazione per la licenza. No Riprova il controllo della licenza in base ai limiti di Policy nuovi tentativi.
ERROR_INVALID_PACKAGE_NAME 258 Errore locale: l'applicazione ha richiesto un controllo delle licenze per un pacchetto. non installato sul dispositivo. No Non riprovare a eseguire il controllo della licenza.

In genere è causato da un errore di sviluppo.

ERROR_NON_MATCHING_UID 259 Errore locale: l'applicazione ha richiesto un controllo delle licenze per un pacchetto. il cui UID (pacchetto, coppia ID utente) non corrisponde a quello della richiesta un'applicazione. No Non riprovare a eseguire il controllo della licenza.

In genere è causato da un errore di sviluppo.

ERROR_NOT_MARKET_MANAGED 3 Errore del server. L'applicazione (nome del pacchetto) non è stata riconosciuta da su Google Play. No Non riprovare a eseguire il controllo della licenza.

Può indicare che l'applicazione non è stata pubblicata tramite Google Play o che sia presente un errore di sviluppo nella licenza implementazione.

Nota: come documentato in Configurazione dell'ambiente di test, il codice di risposta può essere manuale per lo sviluppatore dell'applicazione e per gli eventuali utenti di test registrati tramite Google Play Console.

Nota: in precedenza potevi testare un'app Caricare una "bozza" non pubblicata completamente gestita. Questa funzionalità non è più supportati; devi pubblicarlo nella distribuzione alpha o beta canale. Per ulteriori informazioni, vedi Bozze di app non sono più supportati.

Opzioni per la risposta del server

Per assistere la tua applicazione nella gestione dell'accesso all'applicazione per il rimborso dell'applicazione periodo e fornire altre informazioni, Il server di licenze include diverse parti nelle risposte alle licenze. Nello specifico, il servizio fornisce valori consigliati per periodo di validità della licenza dell'applicazione, periodo di tolleranza per i nuovi tentativi, numero massimo consentito di nuovi tentativi e altro impostazioni. Se la tua applicazione utilizza un APK file di espansione, la risposta include anche i nomi, le dimensioni e gli URL dei file. Il server aggiunge le impostazioni come coppie chiave-valore nella risposta della licenza "extra" .

Qualsiasi implementazione di Policy può estrarre le impostazioni extra dalla licenza della risposta e utilizzarle in base alle esigenze. L'implementazione predefinita di Policy per l'LVL, ServerManagedPolicy, funziona dell'implementazione e un'illustrazione di come ottenere, archiviare e utilizzare impostazioni.

Tabella 4. Riepilogo di impostazioni di gestione delle licenze fornite dal server di Google Play in una licenza la risposta corretta.

ExtraDescrizione
VT Timestamp della validità della licenza. Specifica la data/l'ora in cui l'impostazione La risposta alla licenza (memorizzata nella cache) scade e deve essere ricontrollata sul server di licenze. Consulta la sezione di seguito in merito a Periodo di validità della licenza.
GT Timestamp del periodo di tolleranza. Specifica la fine del periodo durante il quale Il criterio potrebbe consentire l'accesso all'applicazione, anche se lo stato della risposta è RETRY.

Il valore è gestito dal server, ma un valore tipico è 5 o più giorni. Consulta la sezione di seguito relative a Periodo di tentativo e numero massimo di nuovi tentativi.

GR Numero massimo di nuovi tentativi. Specifica il numero di controlli consecutivi della licenza RETRY Policy deve consentire l'accesso prima di negare all'utente l'accesso all'applicazione.

Il valore è gestito dal server, tuttavia un valore tipico è "10" o in alto. Consulta la sezione di seguito relative a Periodo di tentativo e numero massimo di nuovi tentativi.

UT Aggiorna timestamp. Specifica il giorno/l'ora in cui è stato eseguito l'aggiornamento più recente a questa applicazione è stata caricata e pubblicata.

Il server restituisce questo extra solo per le risposte LICENSED_OLD_KEYS, per consentire all'app Policy di determinare quanto non è trascorso tempo da quando è stato pubblicato un aggiornamento con nuove chiavi di licenza prima negando l'accesso dell'utente all'applicazione.

FILE_URL1 o FILE_URL2 L'URL per un file di espansione (1 per il file principale, 2 per il file patch). Da utilizzare per: scaricare il file tramite HTTP.
FILE_NAME1 o FILE_NAME2 Il nome del file di espansione (1 per il file principale, 2 per il file patch). Devi utilizzare questo quando salvi il file sul dispositivo.
FILE_SIZE1 o FILE_SIZE2 La dimensione del file in byte (1 è per il file principale, 2 è il file patch). Da utilizzare per: assistere il download e garantire che ci sia spazio sufficiente sui contenuti condivisi del dispositivo posizione di archiviazione prima del download.

Periodo di validità della licenza

Il server di licenze di Google Play imposta un periodo di validità della licenza per tutti le applicazioni scaricate. Il periodo esprime l'intervallo di tempo durante il quale un dello stato della licenza dell'applicazione devono essere considerati non modificabili e memorizzabili nella cache un Policy di licenza nella richiesta. Il server di licenze include periodo di validità in risposta a tutti i controlli delle licenze, aggiungendo timestamp di fine validità alla risposta come extra nella chiave VT. R Policy può estrarre il valore chiave VT e utilizzarlo per consentire l'accesso in modo condizionale la richiesta senza ricontrollarla, fino al periodo di validità scade.

La validità della licenza indica a un Policy di licenze quando deve ricontrollare il stato di licenza con il server di licenze. Non intende sottintendere se un'applicazione è effettivamente concessa in licenza per l'uso. Ovvero, quando scade il periodo di validità della licenza, ciò non significa che l'applicazione non è più concessa in licenza per l'uso, indica piuttosto Policy deve ricontrollare lo stato della licenza con il server. Ne consegue che, a condizione che il periodo di validità della licenza non sia scaduto, è accettabile per le Policy per memorizzare nella cache in locale lo stato iniziale della licenza e restituire la licenza memorizzata nella cache anziché inviare un nuovo controllo delle licenze al server.

Il server di licenze gestisce il periodo di validità per aiutare applicare correttamente la licenza per tutto il periodo di rimborso offerto da Google Play per le applicazioni a pagamento. Imposta il periodo di validità in base se l'applicazione è stata acquistata e, in tal caso, da quanto tempo. In particolare, il server imposta un periodo di validità come segue:

  • Per un'applicazione a pagamento, il server imposta il periodo di validità iniziale della licenza in modo che la risposta relativa alla licenza rimanga valida per tutto il tempo della richiesta rimborsabile. Una licenza Policy nell'applicazione potrebbe memorizzare nella cache risultato del controllo iniziale della licenza e non è necessario ricontrollarla fino alla scadenza del periodo di validità.
  • Quando un'applicazione non è più rimborsabile, il server imposta un periodo di validità più lungo, in genere un numero di giorni.
  • Per un'applicazione senza costi, il server imposta il periodo di validità su un intervallo (long.MAX_VALUE). Ciò garantisce che, a condizione che Policy abbia memorizzato nella cache a livello locale, non sarà necessario ricontrollare della licenza dell'applicazione in futuro.

L'implementazione ServerManagedPolicy utilizza il timestamp estratto (mValidityTimestamp) come condizione principale per determinare se per ricontrollare lo stato della licenza con il server prima di consentire all'utente di accedere a per l'applicazione.

Periodo dei nuovi tentativi e numero massimo di nuovi tentativi

In alcuni casi, le condizioni di sistema o di rete possono impedire che il controllo delle licenze non raggiunga il server delle licenze oppure impedisca l'accesso dalla ricezione dell'applicazione client Google Play. Ad esempio, l'utente potrebbe avviare un'applicazione quando non è disponibile una rete cellulare o dati connessione disponibile, ad esempio quando si è in aereo o quando La connessione di rete è instabile o il segnale della rete cellulare è debole.

Quando problemi di rete impediscono o interrompono il controllo delle licenze, il team Il client di Google Play avvisa l'applicazione restituendo un codice di risposta RETRY a il metodo processServerResponse() di Policy. Nel caso di modelli di sistema ad esempio quando l'applicazione non riesce a essere associata al ILicensingService, la libreria LicenseChecker stessa chiama Metodo del criterio processServerResponse() con un codice di risposta RETRY.

In generale, il codice di risposta RETRY segnala all'applicazione che si è verificato un errore che ha impedito il completamento di un controllo delle licenze.

Il server di Google Play aiuta un'applicazione a gestire le licenze in condizioni di errore impostando un "periodo di tolleranza" per un nuovo tentativo e il numero massimo consigliato numero di nuovi tentativi. Il server include questi valori in tutte le risposte del controllo delle licenze. aggiungendoli come extra sotto i tasti GT e GR.

L'applicazione Policy può estrarre gli extra GT e GR e utilizzarli per consentire l'accesso all'applicazione in modo condizionale, come segue:

  • Per un controllo delle licenze che genera una risposta RETRY, Policy deve Memorizza nella cache il codice di risposta RETRY e incrementa il conteggio di RETRY risposte.
  • Policy deve consentire all'utente di accedere all'applicazione, a condizione che il periodo di tolleranza per i nuovi tentativi è ancora attivo oppure il numero massimo di nuovi tentativi è non è stato raggiunto.

ServerManagedPolicy utilizza i valori GT e GR forniti dal server come descritti sopra. L'esempio seguente mostra la gestione condizionale del nuovo tentativo risposte predefinite nel metodo allow(). Il numero di risposte RETRY è mantenuto nel metodo processServerResponse(), non mostrato.

Kotlin

fun allowAccess(): Boolean {
    val ts = System.currentTimeMillis()
    return when(lastResponse) {
        LICENSED -> {
            // Check if the LICENSED response occurred within the validity timeout.
            ts <= validityTimestamp  // Cached LICENSED response is still valid.
        }
        RETRY -> {
            ts < lastResponseTime + MILLIS_PER_MINUTE &&
                    // Only allow access if we are within the retry period
                    // or we haven't used up our max retries.
                    (ts <= retryUntil || retryCount <= maxRetries)
        }
        else -> false
    }
}

Java

public boolean allowAccess() {
    long ts = System.currentTimeMillis();
    if (lastResponse == LicenseResponse.LICENSED) {
        // Check if the LICENSED response occurred within the validity timeout.
        if (ts <= validityTimestamp) {
            // Cached LICENSED response is still valid.
            return true;
        }
    } else if (lastResponse == LicenseResponse.RETRY &&
                ts < lastResponseTime + MILLIS_PER_MINUTE) {
        // Only allow access if we are within the retry period
        // or we haven't used up our max retries.
        return (ts <= retryUntil || retryCount <= maxRetries);
    }
    return false;
}