Klasy i interfejsy LVL
Tabela 1 zawiera wszystkie pliki źródłowe objęte weryfikacją licencji
Biblioteka (LVL) dostępna w pakiecie SDK na Androida. Wszystkie pliki są częścią
pakiet com.android.vending.licensing
.
Kategoria | Nazwa | Opis |
---|---|---|
Sprawdzenie licencji i wyniki | Sprawdzanie licencji | Klasa, której instancja (lub podklasa) jest inicjowana w celu zainicjowania sprawdzania licencji. |
LicenseCheckerCallback | Interfejs wdrażany do obsługi wyniku sprawdzania licencji. | |
Zasady | Zasady | Stosowany przez Ciebie interfejs służący do określania, czy zezwolić na dostęp dostępu do aplikacji na podstawie odpowiedzi licencji. |
Zasada zarządzania serwerem | Domyślna implementacja Policy . Używa ustawień skonfigurowanych przez
serwera licencjonowania do zarządzania lokalnym przechowywaniem danych licencji, ważności licencji
spróbuj jeszcze raz. |
|
Rygorystyczne zasady | Alternatywna implementacja Policy . Wymusza stosowanie licencji na podstawie bezpośredniego
odpowiedzi licencyjnej tylko z serwera. Brak buforowania lub ponów próbę żądania. |
|
Zaciemnianie danych (opcjonalnie) |
Zaciemnienie kodu | który implementujesz, jeśli korzystasz z interfejsu Policy (np.
ServerManagedPolicy), który buforuje dane odpowiedzi licencji w magazynie trwałym.
stosuje algorytm zaciemniania kodu do kodowania i dekodowania zapisywanych lub
przeczytaj. |
AESObfuscator | Domyślna implementacja zaciemnionego kodu, która korzysta z szyfrowania/odszyfrowywania AES algorytm do zaciemniania/ukrycia danych. | |
Ograniczenie dotyczące urządzeń (opcjonalne) |
Ograniczenie liczby urządzeń | implementowany interfejs, który pozwala ograniczyć użycie na konkretnym urządzeniu. Wywołano z usługi LicenseValidator. Wdrożenie Nie zalecamy korzystania z funkcji DeviceLimiter w przypadku większości aplikacji, ponieważ wymaga ona serwera backendu i może spowodować utratę dostępu użytkownika do licencjonowanych aplikacji, chyba że projektujesz je z rozwagą. |
Ogranicznik nullDeviceLimit | Domyślna implementacja DeviceLimiter w trybie braku działania (zezwala na dostęp do wszystkich urządzenia). | |
Biblioteka podstawowa, nie wymaga integracji | Dane odpowiedzi | Klasa, która zawiera pola odpowiedzi dotyczącej licencji. |
Sprawdzanie licencji | Klasa, która odszyfrowuje i weryfikuje odpowiedź otrzymaną w ramach licencji serwera. | |
Wyjątek sprawdzania poprawności | Klasa wskazująca błędy, które występują podczas weryfikowania integralności danych zarządzany przez Obfuscator. | |
PreferenceObfuscator, | Klasa narzędziowa, która zapisuje/odczytuje zaciemnione dane w funkcji
SharedPreferences . |
|
ILicensingService | Jednokierunkowy interfejs IPC, przez który żądanie sprawdzenia licencji jest przekazywane do Klient Google Play. | |
ILicenseResultListener | Implementacja jednokierunkowego wywołania zwrotnego IPC, przez którą aplikacja otrzymuje odpowiedzi asynchronicznej z serwera licencjonowania. |
Odpowiedź serwera
Tabela 2 zawiera listę wszystkich pól odpowiedzi dotyczących licencji zwróconych przez serwera licencjonowania.
Pole | Opis |
---|---|
responseCode |
Kod odpowiedzi zwrócony przez serwer licencjonowania. Kody odpowiedzi to opisane w artykule Kody odpowiedzi serwera. |
signedData |
Konkatenacja ciągu tekstowego zawierająca dane zwrócone przez serwer licencjonowania:
responseCode|nonce|packageName|versionCode|userId|timestamp:extras
|
signature |
Podpis signedData za pomocą klucza aplikacji.
|
Kody odpowiedzi serwera
Tabela 3 zawiera listę wszystkich kodów odpowiedzi dotyczących licencji obsługiwanych przez serwera licencjonowania. Ogólnie rzecz biorąc, aplikacja powinna obsługiwać wszystkie te odpowiedzi kodami. Domyślnie klasa LicenseValidator w LVL zawiera wszystkie obsługi tych kodów odpowiedzi.
Kod odpowiedzi | Reprezentacja wartości całkowitej | Opis | Podpisano? | Dodatkowe treści | Komentarze |
---|---|---|---|---|---|
LICENSED |
0 |
Użytkownik ma licencję na aplikację. Użytkownik kupił aplikacji lub ma uprawnienia do pobrania i zainstalowania wersji alfa lub beta od aplikacji. | Tak | VT , GT , GR |
Zezwalaj na dostęp zgodnie z ograniczeniami Policy . |
LICENSED_OLD_KEY |
2 |
Aplikacja jest licencjonowana na podstawie licencji użytkownika, ale istnieje zaktualizowana aplikacja jest dostępna wersja podpisana innym kluczem. | Tak | VT , GT , GR , UT |
Opcjonalnie zezwól na dostęp zgodnie z ograniczeniami Policy .
Może wskazywać, że para kluczy używana przez wersja aplikacji jest nieprawidłowa lub zhakowana. Aplikacja może zezwalać na dostęp w razie potrzeby lub poinformuj użytkownika o dostępności uaktualnienia i ogranicz dalsze użytkowanie do czasu uaktualnienia. |
NOT_LICENSED |
1 |
Użytkownik nie ma licencji na aplikację. | Nie | Nie zezwalaj na dostęp. | |
ERROR_CONTACTING_SERVER |
257 |
Błąd lokalny – aplikacja Google Play nie mogła połączyć się z serwera licencjonowania (prawdopodobnie z powodu problemów z dostępnością sieci). | Nie | Ponów próbę sprawdzenia licencji zgodnie z limitami ponownych prób (Policy ). |
|
ERROR_SERVER_FAILURE |
4 |
Błąd serwera – serwer nie mógł wczytać klucza aplikacji. do licencjonowania. | Nie | Ponów próbę sprawdzenia licencji zgodnie z limitami ponownych prób (Policy ).
|
|
ERROR_INVALID_PACKAGE_NAME |
258 |
Błąd lokalny – aplikacja zażądała sprawdzenia licencji pakietu. niezainstalowanego na urządzeniu. | Nie | Nie próbuj ponownie sprawdzać licencji.
Zwykle jest to spowodowane błędem programistycznym. |
|
ERROR_NON_MATCHING_UID |
259 |
Błąd lokalny – aplikacja zażądała sprawdzenia licencji pakietu. którego identyfikator UID (pakiet, para identyfikatora użytkownika) nie jest zgodny z identyfikatorem użytkownika wysyłającego żądanie aplikacji. | Nie | Nie próbuj ponownie sprawdzać licencji.
Zwykle jest to spowodowane błędem programistycznym. |
|
ERROR_NOT_MARKET_MANAGED |
3 |
Błąd serwera – aplikacja (nazwa pakietu) nie została rozpoznana przez Google Play. | Nie | Nie próbuj ponownie sprawdzać licencji.
Może oznaczać, że aplikacja nie została opublikowana przez Google Play lub w licencjonowaniu wystąpił błąd programistyczny. implementacji. |
Uwaga: jak opisano w Skonfigurowanie środowiska testowego – kod odpowiedzi można dodać ręcznie dla dewelopera aplikacji oraz wszystkich zarejestrowanych użytkowników testowych Konsola Google Play.
Uwaga: wcześniej można było testować aplikację przez przesłanie nieopublikowanej wersji roboczej, wersji. Ta funkcja nie jest już dostępna obsługiwany; musisz go opublikować w wersji alfa lub beta kanał. Więcej informacji znajdziesz w artykule Wersje robocze aplikacji nie są już obsługiwane.
Dodatki do odpowiedzi serwera
Pomoc w zarządzaniu dostępem do aplikacji w ramach zwrotu środków i dostarczanie innych informacji. Serwer licencji zawiera kilka i informacjami w odpowiedziach dotyczących licencji. W szczególności usługa podaje zalecane wartości dla atrybutu okres ważności licencji aplikacji, okres prolongaty ponawiania próby, maksymalna dozwolona liczba ponownych prób i inne ustawieniach. Jeśli aplikacja używa pliku APK rozszerzeń odpowiedź zawiera też nazwy, rozmiary i adresy URL plików. Serwer dołącza ustawienia jako pary klucz-wartość w odpowiedzi licencji „extras” .
Każda implementacja Policy
może wyodrębnić ustawienia dodatków z licencji.
i używać ich w razie potrzeby. Domyślna implementacja LVL Policy
, ServerManagedPolicy
, służy jako działająca
oraz ilustrację tego, jak uzyskać, przechowywać i wykorzystywać
ustawieniach.
Extra | Opis |
---|---|
VT |
Sygnatura czasowa ważności licencji. Określa datę/godzinę bieżącego (w pamięci podręcznej) odpowiedź licencji wygasa i musi zostać sprawdzona na serwerze licencji. Patrz sekcja poniżej znajdziesz informacje o okresie ważności licencji. |
GT |
Sygnatura czasowa okresu prolongaty. Określa koniec okresu, w którym
Zasada może zezwalać na dostęp do aplikacji, nawet jeśli stan odpowiedzi to
RETRY Wartość jest zarządzana przez serwer, ale typowa wartość to 5 lub więcej dni. Patrz sekcja poniżej dotyczących opcji Okres ponawiania prób i maksymalna liczba ponownych prób. |
GR |
Maksymalna liczba ponownych prób. Określa liczbę kolejnych testów licencji RETRY
Policy powinien zezwolić użytkownikowi na dostęp do aplikacji.
Wartość jest zarządzana przez serwer, ale typowa wartość to „10” lub wyższe. Patrz sekcja poniżej dotyczących opcji Okres ponawiania prób i maksymalna liczba ponownych prób. |
UT |
Sygnatura czasowa aktualizacji. Określa dzień i godzinę ostatniej aktualizacji
ta aplikacja została przesłana i opublikowana. Serwer zwraca ten dodatkowy
tylko dla odpowiedzi |
FILE_URL1 lub FILE_URL2 |
Adres URL pliku rozszerzenia (1 oznacza plik główny, a 2 to plik poprawki). Przeznaczenie pobierz plik przez HTTP. |
FILE_NAME1 lub FILE_NAME2 |
Nazwa pliku rozszerzenia (1 oznacza plik główny, a 2 to plik poprawki). Musisz użyć tego nazwę w trakcie zapisywania pliku na urządzeniu. |
FILE_SIZE1 lub FILE_SIZE2 |
Rozmiar pliku w bajtach (1 oznacza plik główny, a 2 to plik poprawki). Przeznaczenie pomaga w pobieraniu i zapewnia wystarczającą ilość miejsca na dysku współdzielonym lokalizację zapisu przed pobraniem. |
Okres ważności licencji
Serwer licencjonowania Google Play ustawia okres ważności licencji dla wszystkich
pobrane aplikacje. Okres określa przedział czasu, w którym
stan licencji aplikacji należy uznać za niezmienny i umożliwiający jej buforowanie przez
licencja Policy
w aplikacji. Serwer licencjonowania zawiera
okresu ważności w odpowiedzi na wszystkie kontrole licencji, z dołączonym atrybutem
sygnatury czasowej końca ważności odpowiedzi, jako dodatku w kluczu VT
. O
Policy
może wyodrębnić wartość klucza VT i użyć jej do warunkowego dostępu do
aplikacji bez ponownego sprawdzania licencji, aż do okresu ich ważności
wygasa.
Ważność licencji jest sygnalizowana firmie Policy
licencyjnej, gdy musi ponownie sprawdzić
z serwerem licencjonowania. Nie służy do sugerowania
czy aplikacja rzeczywiście jest licencjonowana do użytku. Oznacza to, że gdy
ważność licencji na aplikację wygasa, nie oznacza to, że
aplikacji nie ma już licencji do użytku – wskazuje tylko, że
Policy
musi ponownie sprawdzić stan licencji na serwerze. Z tego wynika,
(o ile okres ważności licencji jeszcze nie upłynął, można
Policy
, aby zapisać początkowy stan licencji lokalnie i zwrócić licencję w pamięci podręcznej.
zamiast wysyłać do serwera nowe sprawdzenie licencji.
Serwer licencjonowania zarządza okresem ważności, pomagając prawidłowe egzekwowanie licencji przez okres zwrotu środków oferowany przez Google Play dla płatnych aplikacji. Ustawia okres ważności na podstawie czy aplikacja została kupiona, a jeśli tak, to ile lat temu; Konkretnie: serwer ustawia taki okres ważności:
- W przypadku płatnej aplikacji serwer ustawia początkowy okres ważności licencji.
aby odpowiedź dotycząca licencji była ważna tak długo, jak aplikacja
podlega zwrotowi. Licencjonowany zasób
Policy
w aplikacji może buforować nie trzeba ponownie sprawdzać licencji. aż do upłynięcia okresu ważności. - Gdy aplikacja nie podlega już zwrotowi środków, serwer ustawia dłuższy okres ważności – zwykle kilka dni.
- Dla bezpłatnej aplikacji serwer ustawia bardzo wysoki okres ważności
(
long.MAX_VALUE
). Dzięki temu, jeśliPolicy
ma lokalnej sygnatury czasowej poprawności, nie trzeba jej ponownie sprawdzać stanu licencji aplikacji w przyszłości.
Implementacja ServerManagedPolicy
używa wyodrębnionej sygnatury czasowej
(mValidityTimestamp
) jako głównego warunku określającego, czy
, aby ponownie sprawdzić stan licencji na serwerze przed zezwoleniem użytkownikowi na dostęp do
aplikacji.
Okres ponawiania i maksymalna liczba ponownych prób
W niektórych przypadkach warunki systemu lub sieci mogą uniemożliwić aplikacji przed uzyskaniem dostępu do serwera licencjonowania lub uniemożliwienie odpowiedź przed dotarciem do aplikacji klienckiej Google Play. Na przykład parametr użytkownik może uruchomić aplikację, gdy nie ma sieci komórkowej lub transmisji danych np. w samolocie lub gdy połączenie sieciowe jest niestabilne lub sygnał komórkowy jest słaby.
Jeśli problemy z siecią uniemożliwiają lub przerywają sprawdzanie licencji, Google
Klient Play powiadamia aplikację, zwracając kod odpowiedzi RETRY
do
metody processServerResponse()
operatora Policy
. W przypadku systemu
na przykład wtedy, gdy aplikacja nie jest w stanie powiązać z
implementacji ILicensingService
, biblioteka LicenseChecker
wywołuje funkcję
Metoda processServerResponse()
z kodem odpowiedzi RETRY
.
Ogólnie kod odpowiedzi RETRY
informuje aplikację, że
wystąpił błąd uniemożliwiający ukończenie sprawdzania licencji.
Serwer Google Play pomaga aplikacji w zarządzaniu licencjami
warunki błędu przez ustawienie „okresu prolongaty” ponowienia próby i zalecaną maksymalną
ponownych prób. serwer uwzględnia te wartości we wszystkich odpowiedziach na sprawdzanie licencji,
Dołączam je jako dodatki w kluczach GT
i GR
.
Aplikacja Policy
może wyodrębnić dodatki GT
oraz GR
i użyć ich do
warunkowo zezwól na dostęp do aplikacji w ten sposób:
- W przypadku sprawdzenia licencji, które skutkuje odpowiedzią
RETRY
,Policy
powinien zapisywać w pamięci podręcznej kod odpowiedziRETRY
i zwiększać liczbę odpowiedzi doRETRY
. - Obiekt
Policy
powinien zezwalać użytkownikowi na dostęp do aplikacji, pod warunkiem że: okres prolongaty ponawiania prób jest nadal aktywny albo została osiągnięta maksymalna liczba ponownych prób nie skontaktowaliśmy się z.
ServerManagedPolicy
wykorzystuje dostarczone przez serwer wartości GT
i GR
jako
opisane powyżej. Przykład poniżej pokazuje obsługę warunkową ponawiania
w metodzie allow()
. Liczba odpowiedzi RETRY
to
są przechowywane w metodzie processServerResponse()
, a nie wyświetlane.
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; }