Dokumentacja dotycząca licencjonowania

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.

Tabela 1. Podsumowanie biblioteki LVL za pomocą klas i interfejsów.

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.

Tabela 2. Podsumowanie pól odpowiedzi na temat licencji zwracane przez serwer Google Play.

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
  • responseCode: kod odpowiedzi zwrócony przez serwer licencjonowania.
  • nonce: identyfikator jednorazowy żądania.
  • packageName: nazwa pakietu aplikacji, dla której chcesz sprawdzić licencję.
  • versionCode: kod wersji aplikacji, na którą chcesz sprawdzić licencję.
  • userId: unikalny identyfikator użytkownika danej aplikacji. Ten sam użytkownik otrzymuje inny identyfikator dla innej aplikacji.
  • timestamp: liczba milisekund od początku epoki 1970-01-01 00:00:00 czasu UTC na żądanie.
  • extras: dodatkowe informacje ułatwiające zarządzanie licencjami z samej aplikacji. Dodatkowe pola są opisane w Dodatki do odpowiedzi serwera.
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.

Tabela 3. Podsumowanie kodów odpowiedzi zwracane przez serwer Google Play w odpowiedzi licencji.

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 VTGT, 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.

Tabela 4. Podsumowanie ustawienia zarządzania licencjami określone przez serwer Google Play w licencji. .

ExtraOpis
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 LICENSED_OLD_KEYS, aby Policy mógł określić, ile czas od opublikowania aktualizacji z nowymi kluczami licencyjnymi przed odmawianie użytkownikowi dostępu do aplikacji.

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śli Policy 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 odpowiedzi RETRY i zwiększać liczbę odpowiedzi do RETRY.
  • 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;
}