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
.
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.
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 .
|
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.
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 | VT , GT , 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.
Extra | Beschreibung |
---|---|
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 |
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, sofernPolicy
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, solltePolicy
denRETRY
-Antwortcode im Cache speichern und die Anzahl derRETRY
-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; }