Referenz zur Lizenzierung

LVL-Klassen und -Schnittstellen

In Tabelle 1 sind alle Quelldateien in der Lizenzüberprüfungsbibliothek (License Verification Library, LVL) aufgeführt, die über das Android SDK verfügbar ist. Alle Dateien sind Teil des Pakets com.android.vending.licensing.

Tabelle 1 Zusammenfassung der LVL-Bibliotheksklassen und -Schnittstellen

Kategorie Name Beschreibung
Lizenzprüfung und -ergebnis Lizenzprüfer Klasse, die du instanziierst (oder abgeleitete Klasse), um eine Lizenzprüfung zu starten.
LicenseCheckerCallback Schnittstelle, die Sie zur Verarbeitung des Ergebnisses der Lizenzprüfung implementieren.
Richtlinie Richtlinie Schnittstelle, die Sie implementieren, um anhand der Lizenzantwort zu bestimmen, ob der Zugriff auf die Anwendung zugelassen wird.
ServerManagedPolicy Standardimplementierung von Policy. Nutzt die vom Lizenzierungsserver vorgegebenen Einstellungen, um die lokale Speicherung von Lizenzdaten, die Gültigkeit der Lizenz und die Wiederholungsversuche zu verwalten.
StrengePolicy Alternative Policy-Implementierung. Die Lizenzierung wird nur anhand einer direkten Lizenzantwort vom Server erzwungen. Kein Caching und keine Wiederholungsanfrage.
Datenverschleierung
(optional)
Obfuscator Schnittstelle, die Sie implementieren, wenn Sie eine Policy (z. B. ServerManagedPolicy) verwenden, die Lizenzantwortdaten in einem nichtflüchtigen Speicher im Cache speichert. Wendet einen Verschleierungsalgorithmus an, um Daten zu codieren und zu decodieren, die geschrieben oder gelesen werden.
AESObfuscator Standardimplementierung der Verschleierung, die den AES-Verschlüsselungs-/Entschlüsselungsalgorithmus verwendet, um Daten zu verschleiern/unverschleiert zu werden.
Gerätebeschränkung
(optional)
DeviceLimiter Schnittstelle, die Sie implementieren, wenn Sie die Nutzung einer Anwendung auf ein bestimmtes Gerät beschränken möchten. Aufruf von LicenseValidator. Die Implementierung von DeviceLimiter wird für die meisten Anwendungen nicht empfohlen, da sie einen Back-End-Server erfordert und dazu führen kann, dass der Nutzer den Zugriff auf lizenzierte Anwendungen verliert, es sei denn, sie wurden mit Bedacht entwickelt.
NullDeviceLimiter Standardmäßige DeviceLimiter-Implementierung, die keinen Vorgang erfordert (ermöglicht den Zugriff auf alle Geräte).
Library Core, keine Integration erforderlich Antwortdaten Klasse, die die Felder einer Lizenzantwort enthält.
Lizenzvalidierung Klasse, die eine vom Lizenzierungsserver empfangene Antwort entschlüsselt und verifiziert.
Validierungsausnahme Klasse, die Fehler anzeigt, die bei der Validierung der Integrität von Daten, die von einem Obfuscator verwaltet werden, auftreten.
PräferenzObfuscator Dienstprogrammklasse, die verschleierte Daten in den SharedPreferences-Speicher des Systems schreibt/liest.
Lizenzierungsservice Einweg-IPC-Schnittstelle, über die eine Lizenzüberprüfungsanfrage an den Google Play-Client weitergeleitet wird.
ILicenseResultListener Einweg-IPC-Callback-Implementierung, über die die Anwendung eine asynchrone Antwort vom Lizenzierungsserver empfängt.

Serverantwort

In Tabelle 2 sind alle Lizenzantwortfelder aufgelistet, die vom Lizenzierungsserver zurückgegeben werden.

Tabelle 2 Zusammenfassung der vom Google Play-Server zurückgegebenen Lizenzantwortfelder.

Feld Beschreibung
responseCode Der vom Lizenzierungsserver zurückgegebene Antwortcode. Die Antwortcodes sind unter Serverantwortcodes aufgeführt.
signedData Eine String-Verkettung, die die vom Lizenzierungsserver zurückgegebenen Daten enthält: responseCode|nonce|packageName|versionCode|userId|timestamp:extras.
  • responseCode: Der vom Lizenzierungsserver zurückgegebene Antwortcode.
  • nonce: Nonce-ID der Anfrage.
  • packageName: Paketname der App, für die die Lizenz geprüft werden soll.
  • versionCode: Der Versionscode der App, für die die Lizenz geprüft werden soll.
  • userId: Eine eindeutige ID für den Nutzer pro Anwendung, wobei derselbe Nutzer eine andere ID für eine andere Anwendung erhält.
  • timestamp: Die Anzahl der Millisekunden seit der Epoche 1970-01-01 00:00:00 UTC bis zur Anfrage.
  • extras: Zusätzliche Informationen zur Lizenzverwaltung der Anwendung. Die zusätzlichen Felder werden unter Server Response Extras aufgeführt.
signature Die Signatur von signedData mithilfe eines App-spezifischen Schlüssels.

Serverantwortcodes

In Tabelle 3 sind alle Lizenzantwortcodes aufgeführt, die vom Lizenzierungsserver unterstützt werden. Im Allgemeinen sollte eine Anwendung alle diese Antwortcodes verarbeiten können. Standardmäßig bietet die Klasse LicenseValidator in der LVL die erforderliche Verarbeitung dieser Antwortcodes für Sie.

Tabelle 3 Zusammenfassung der vom Google Play-Server in einer Lizenzantwort zurückgegebenen Antwortcodes.

Antwortcode Darstellung als Ganzzahlwert Beschreibung Unterzeichnet? Extras Kommentare
LICENSED 0 Die Anwendung ist für den Nutzer lizenziert. Der Nutzer hat die Anwendung gekauft oder ist berechtigt, die Alpha- oder Betaversion der Anwendung herunterzuladen und zu installieren. Ja VTGT, GR Zugriff gemäß den Policy-Einschränkungen zulassen.
LICENSED_OLD_KEY 2 Die Anwendung ist für den Nutzer lizenziert. Es ist jedoch eine aktualisierte Anwendungsversion verfügbar, die mit einem anderen Schlüssel signiert ist. Ja VT, GT, GR, UT Zugriff optional gemäß den Policy-Einschränkungen zulassen.

Kann darauf hinweisen, dass das von der installierten Anwendungsversion verwendete Schlüsselpaar ungültig ist oder manipuliert wurde. Die Anwendung kann bei Bedarf Zugriff gewähren oder den Nutzer darüber informieren, dass ein Upgrade verfügbar ist, und die weitere Nutzung bis zum Upgrade einschränken.

NOT_LICENSED 1 Die App ist nicht für den Nutzer lizenziert. Nein Zugriff nicht zulassen.
ERROR_CONTACTING_SERVER 257 Lokaler Fehler: Die Google Play-App konnte den Lizenzierungsserver möglicherweise aufgrund von Problemen mit der Netzwerkverfügbarkeit nicht erreichen. Nein Wiederholen Sie die Lizenzprüfung gemäß den Wiederholungslimits von Policy.
ERROR_SERVER_FAILURE 4 Serverfehler: Der Server konnte das Schlüsselpaar der Anwendung nicht zur Lizenzierung laden. Nein Wiederholen Sie die Lizenzprüfung gemäß den Wiederholungslimits von Policy.
ERROR_INVALID_PACKAGE_NAME 258 Lokaler Fehler: Die Anwendung hat eine Lizenzprüfung für ein Paket angefordert, das nicht auf dem Gerät installiert ist. Nein Wiederholen Sie die Lizenzprüfung nicht.

Wird in der Regel durch einen Entwicklungsfehler verursacht.

ERROR_NON_MATCHING_UID 259 Lokaler Fehler: Die Anwendung hat eine Lizenzprüfung für ein Paket angefordert, dessen UID (Paket, Nutzer-ID-Paar) nicht mit der UID der anfragenden Anwendung übereinstimmt. Nein Wiederholen Sie die Lizenzprüfung nicht.

Wird in der Regel durch einen Entwicklungsfehler verursacht.

ERROR_NOT_MARKET_MANAGED 3 Serverfehler: Die App (Paketname) wurde von Google Play nicht erkannt. Nein Wiederholen Sie die Lizenzprüfung nicht.

Ein Hinweis darauf, dass die App nicht über Google Play veröffentlicht wurde oder dass bei der Lizenzierungsimplementierung ein Entwicklungsfehler aufgetreten ist.

Hinweis:Wie unter Testumgebung einrichten beschrieben, kann der Antwortcode für den Anwendungsentwickler und alle registrierten Testnutzer über die Google Play Console manuell überschrieben werden.

Hinweis:Bisher konnten Sie eine Anwendung testen, indem Sie eine unveröffentlichte Entwurfsversion hochgeladen haben. Diese Funktion wird nicht mehr unterstützt. Sie müssen sie stattdessen im Alpha- oder Betavertriebskanal veröffentlichen. Weitere Informationen finden Sie unter App-Entwürfe werden nicht mehr unterstützt.

Server Response Extras

Der Lizenzierungsserver fügt in die Lizenzantworten verschiedene Informationen ein, damit Ihre Anwendung während des Erstattungszeitraums der Anwendung den Zugriff auf die Anwendung verwalten und weitere Informationen angeben kann. Der Dienst bietet insbesondere empfohlene Werte für den Gültigkeitszeitraum der Lizenz, den Kulanzzeitraum für Wiederholungen, die maximal zulässige Anzahl von Wiederholungen und andere Einstellungen. Wenn Ihre Anwendung APK-Erweiterungsdateien verwendet, enthält die Antwort auch die Dateinamen, Größen und URLs. Der Server hängt die Einstellungen als Schlüssel/Wert-Paare im Feld "extras" der Lizenzantwort an.

Jede Policy-Implementierung kann die Einstellungen für die Extras aus der Lizenzantwort extrahieren und nach Bedarf verwenden. Die LVL-Standardimplementierung Policy (ServerManagedPolicy) dient als funktionierende Implementierung und zeigt, wie die Einstellungen abgerufen, gespeichert und verwendet werden.

Tabelle 4 Zusammenfassung der Einstellungen für die Lizenzverwaltung, die vom Google Play-Server in einer Lizenzantwort bereitgestellt werden.

ExtraBeschreibung
VT Zeitstempel der Lizenzgültigkeit. Gibt das Datum und die Uhrzeit an, zu der die aktuelle (im Cache gespeicherte) Lizenzantwort abläuft und auf dem Lizenzierungsserver noch einmal geprüft werden muss. Weitere Informationen finden Sie unten im Abschnitt Gültigkeitsdauer der Lizenz.
GT Zeitstempel des Kulanzzeitraums. Gibt das Ende des Zeitraums an, in dem eine Richtlinie möglicherweise Zugriff auf die Anwendung gewährt, auch wenn der Antwortstatus RETRY ist.

Der Wert wird vom Server verwaltet, ein typischer Wert wäre jedoch 5 oder mehr Tage. Weitere Informationen finden Sie unten im Abschnitt Wiederholungszeitraum und maximale Anzahl von Wiederholungen.

GR Maximale Anzahl der Wiederholungsversuche. Gibt an, wie viele aufeinanderfolgende RETRY-Lizenzprüfungen die Policy zulassen soll, bevor dem Nutzer der Zugriff auf die Anwendung verweigert wird.

Der Wert wird vom Server verwaltet, ein typischer Wert ist jedoch „10“ oder höher. Weitere Informationen finden Sie unten im Abschnitt Wiederholungszeitraum und maximale Anzahl von Wiederholungen.

UT Zeitstempel aktualisieren. Gibt den Tag und die Uhrzeit an, an dem die letzte Aktualisierung für diese Anwendung hochgeladen und veröffentlicht wurde.

Der Server gibt diese zusätzlichen Werte nur für LICENSED_OLD_KEYS-Antworten zurück, damit Policy feststellen kann, wie viel Zeit seit der Veröffentlichung eines Updates mit neuen Lizenzierungsschlüsseln verstrichen ist, bevor dem Nutzer der Zugriff auf die Anwendung verweigert wird.

FILE_URL1 oder FILE_URL2 Die URL für eine Erweiterungsdatei (1 ist für die Hauptdatei, 2 ist die Patchdatei). Damit laden Sie die Datei über HTTP herunter.
FILE_NAME1 oder FILE_NAME2 Der Name der Erweiterungsdatei (1 ist für die Hauptdatei, 2 ist die Patchdatei). Sie müssen diesen Namen verwenden, wenn Sie die Datei auf dem Gerät speichern.
FILE_SIZE1 oder FILE_SIZE2 Die Größe der Datei in Byte (1 ist für die Hauptdatei, 2 ist die Patchdatei). Hiermit können Sie den Download vorbereiten und dafür sorgen, dass vor dem Download genügend Speicherplatz auf dem gemeinsam genutzten Speicherort des Geräts verfügbar ist.

Gültigkeit der Lizenz

Der Google Play-Lizenzierungsserver legt eine Gültigkeitsdauer der Lizenz für alle heruntergeladenen Apps fest. Der Zeitraum gibt das Zeitintervall an, in dem der Lizenzstatus einer Anwendung von einer Policy-Lizenzierung in der Anwendung als unveränderlich angesehen und im Cache gespeichert werden kann. Der Lizenzierungsserver nimmt den Gültigkeitszeitraum in seine Antwort auf alle Lizenzprüfungen auf und hängt unter dem Schlüssel VT zusätzlich einen Zeitstempel für das Ende der Gültigkeitsdauer an die Antwort an. Ein Policy kann den VT-Schlüsselwert extrahieren und damit bis zum Ablauf des Gültigkeitszeitraums bedingt den Zugriff auf die Anwendung ohne erneute Überprüfung der Lizenz zulassen.

Die Lizenzgültigkeit signalisiert einer Lizenzierung Policy, wenn der Lizenzierungsstatus noch einmal mit dem Lizenzierungsserver geprüft werden muss. Sie sollen nicht andeuten, ob eine App tatsächlich für die Nutzung lizenziert ist. Das heißt, wenn der Lizenzgültigkeitszeitraum einer Anwendung abläuft, bedeutet dies nicht, dass die Anwendung nicht mehr zur Nutzung lizenziert ist. Es bedeutet nur, dass Policy den Lizenzstatus auf dem Server noch einmal prüfen muss. Solange der Gültigkeitszeitraum der Lizenz nicht abgelaufen ist, kann die Policy also den anfänglichen Lizenzstatus lokal im Cache speichern und den im Cache gespeicherten Lizenzstatus zurückgeben, anstatt eine neue Lizenzprüfung an den Server zu senden.

Der Lizenzierungsserver verwaltet den Gültigkeitszeitraum, damit die App während des von Google Play für kostenpflichtige Apps angebotenen Erstattungszeitraums die Lizenzierung ordnungsgemäß durchsetzen kann. Der Gültigkeitszeitraum hängt davon ab, ob die Anwendung gekauft wurde und wenn ja, wie lange sie her ist. Der Server legt einen Gültigkeitszeitraum so fest:

  • Bei einer kostenpflichtigen Anwendung legt der Server den anfänglichen Gültigkeitszeitraum der Lizenz so fest, dass die Lizenzantwort so lange gültig bleibt, wie die Anwendung erstattungsfähig ist. Eine Lizenzierung Policy in der Anwendung kann das Ergebnis der ersten Lizenzprüfung im Cache speichern und muss die Lizenz erst nach Ablauf des Gültigkeitszeitraums noch einmal prüfen.
  • Wenn eine Anwendung nicht mehr erstattungsfähig ist, legt der Server einen längeren Gültigkeitszeitraum fest, der in der Regel mehrere Tage beträgt.
  • Bei kostenlosen Anwendungen setzt der Server die Gültigkeitsdauer auf einen sehr hohen Wert (long.MAX_VALUE). So wird sichergestellt, dass der Lizenzstatus der Anwendung in Zukunft nicht noch einmal überprüft werden muss, sofern Policy den Gültigkeitszeitstempel lokal im Cache gespeichert hat.

Die Implementierung ServerManagedPolicy verwendet den extrahierten Zeitstempel (mValidityTimestamp) als primäre Bedingung zum Bestimmen, ob der Lizenzstatus mit dem Server noch einmal geprüft werden soll, bevor dem Nutzer Zugriff auf die Anwendung gewährt wird.

Wiederholungszeitraum und maximale Anzahl von Wiederholungen

In einigen Fällen können System- oder Netzwerkbedingungen verhindern, dass die Lizenzprüfung einer Anwendung den Lizenzierungsserver erreicht, oder verhindern, dass die Antwort des Servers die Google Play-Clientanwendung erreicht. Beispielsweise kann der Nutzer eine Anwendung starten, wenn kein Mobilfunknetz oder keine Datenverbindung verfügbar ist – z. B. in einem Flugzeug – oder wenn die Netzwerkverbindung instabil oder das Mobilfunksignal schwach ist.

Wenn Netzwerkprobleme eine Lizenzprüfung verhindern oder unterbrechen, benachrichtigt der Google Play-Client die Anwendung, indem ein RETRY-Antwortcode an die Methode processServerResponse() der Policy zurückgegeben wird. Bei Systemproblemen, z. B. wenn sich die App nicht an die ILicensingService-Implementierung von Google Play binden kann, ruft die LicenseChecker-Bibliothek selbst die Methode processServerResponse() mit einem RETRY-Antwortcode auf.

Im Allgemeinen ist der Antwortcode RETRY ein Signal für die Anwendung, dass ein Fehler aufgetreten ist, durch den eine Lizenzprüfung nicht abgeschlossen werden konnte.

Der Google Play-Server unterstützt eine App bei der Verwaltung der Lizenzierung unter Fehlerbedingungen, indem er einen Kulanzzeitraum für Wiederholungen und eine empfohlene maximale Anzahl von Wiederholungen festlegt. Der Server nimmt diese Werte in alle Antworten zur Lizenzprüfung auf und hängt sie als Extras unter den Schlüsseln GT und GR an.

Die Anwendung Policy kann die Extras GT und GR extrahieren und verwenden, um bedingten Zugriff auf die Anwendung zuzulassen:

  • Bei einer Lizenzprüfung, die zu einer RETRY-Antwort führt, sollte Policy den RETRY-Antwortcode im Cache speichern und die Anzahl der RETRY-Antworten erhöhen.
  • Die Policy sollte dem Nutzer den Zugriff auf die Anwendung ermöglichen, sofern entweder der Kulanzzeitraum für Wiederholungen noch aktiv ist oder die maximale Anzahl an Wiederholungen nicht erreicht wurde.

ServerManagedPolicy verwendet die vom Server bereitgestellten Werte GT und GR wie oben beschrieben. Das folgende Beispiel zeigt die bedingte Verarbeitung der Wiederholungsantworten in der Methode allow(). Die Anzahl der RETRY-Antworten wird in der processServerResponse()-Methode beibehalten (nicht gezeigt).

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;
}