Lisanslama Referansı

LVL Sınıfları ve Arayüzleri

Tablo 1'de, Android SDK üzerinden kullanılabilen Lisans Doğrulama Kitaplığı'ndaki (LVL) tüm kaynak dosyalar listelenmiştir. Tüm dosyalar com.android.vending.licensing paketinin bir parçasıdır.

Tablo 1. LVL kitaplık sınıflarının ve arayüzlerinin özeti.

Kategori Ad Açıklama
Lisans kontrolü ve sonucu Lisans Kontrolü Lisans kontrolü başlatmak için örneklediğiniz (veya alt sınıf) sınıf.
LisansCheckerCallback Lisans kontrolünün sonucunu işlemek için uyguladığınız arayüz.
Politika Politika Lisans yanıtına göre uygulamaya erişime izin verilip verilmeyeceğini belirlemek için uyguladığınız arayüz.
Sunucuyla Yönetilen Politika Varsayılan Policy uygulaması. Lisans verilerinin yerel olarak depolanmasını, lisans geçerliliğini ve yeniden denemeyi yönetmek için lisanslama sunucusu tarafından sağlanan ayarları kullanır.
Katı Politika Alternatif Policy uygulaması. Yalnızca sunucudan alınan doğrudan lisans yanıtına göre lisanslamayı zorunlu kılar. Önbelleğe alma yok veya yeniden deneme isteğinde bulunulmuyor.
Veri kod karartma
(isteğe bağlı)
Gizleyici Lisans yanıt verilerini kalıcı depolama alanında önbelleğe alan bir Policy (ServerManagedPolicy gibi) kullanıyorsanız uyguladığınız arayüz. Yazılan veya okunan verileri kodlamak ve bu verilerin kodunu çözmek için kod karartma algoritması uygular.
AESObfuscator Verilerde kod karartmak/kodun kodunu kaldırmak için AES şifreleme/şifre çözme algoritması kullanan varsayılan Gizleyici uygulaması.
Cihaz sınırlaması
(isteğe bağlı)
DeviceLimiter Bir uygulamanın kullanımını belirli bir cihazla sınırlamak istediğinizde uyguladığınız arayüz. LicenseValidator çağrısı yapıldı. Bir arka uç sunucusu gerektirdiği ve dikkatli bir şekilde tasarlanmadığı takdirde kullanıcının lisanslı uygulamalara erişimi kaybetmesine neden olabileceği için DeviceLimiter birçok uygulama için önerilmez.
BoşCihaz Sınırlayıcısı İşlem gerektirmeyen (tüm cihazlara erişime izin veren) varsayılan DeviceLimiter uygulaması.
Kitaplık çekirdeği, entegrasyon gerekmez Yanıt Verileri Lisans yanıtı alanlarını içeren sınıf.
Lisans Doğrulayıcı Lisanslama sunucusundan alınan yanıtların şifresini çözen ve doğrulayan sınıf.
Doğrulamaİstisnası Gizleyici tarafından yönetilen verilerin bütünlüğünü doğrularken oluşan hataları gösteren sınıftır.
Tercih Gizleyici Karartılmış verileri sistemin SharedPreferences deposuna yazan/okuyan yardımcı sınıfı.
İNCELEMEHizmeti Lisans kontrolü isteğinin Google Play istemcisine iletildiği tek yönlü IPC arayüzü.
LisansSonuçListesi Uygulamanın, lisanslama sunucusundan eşzamansız yanıt aldığı tek yönlü IPC geri çağırma uygulaması.

Sunucu Yanıtı

Tablo 2'de, lisanslama sunucusu tarafından döndürülen tüm lisans yanıtı alanları listelenmiştir.

Tablo 2. Google Play sunucusu tarafından döndürülen lisans yanıtı alanlarının özeti.

Alan Açıklama
responseCode Lisanslama sunucusu tarafından döndürülen yanıt kodu. Yanıt kodları Sunucu Yanıtı Kodları'nda özetlenmiştir.
signedData Lisanslama sunucusu tarafından döndürülen verileri tutan bir dizeyi şu şekilde birleştirme: responseCode|nonce|packageName|versionCode|userId|timestamp:extras.
  • responseCode: Lisanslama sunucusu tarafından döndürülen yanıt kodu.
  • nonce: İsteğin Nonce tanımlayıcısı.
  • packageName: Lisansının kontrol edileceği uygulamanın paket adı.
  • versionCode: Lisansının kontrol edileceği uygulamanın sürüm kodu.
  • userId: Her uygulama için kullanıcının benzersiz kimliği. Aynı kullanıcı, farklı bir uygulama için farklı bir kimlik alır.
  • timestamp: 01.01.1970 00:00:00 UTC döneminden isteğe kadar geçen milisaniye sayısı.
  • extras: Uygulamanın lisans yönetimine yardımcı olacak ek bilgiler. Ek alanlar Sunucu Yanıtı Ekstraları bölümünde belirtilmiştir.
signature Uygulamaya özel bir anahtar kullanan signedData imzası.

Sunucu Yanıt Kodları

Tablo 3'te, lisanslama sunucusunun desteklediği tüm lisans yanıt kodları listelenmektedir. Genel olarak, bir uygulama bu yanıt kodlarının tümünü işlemelidir. Varsayılan olarak LVL'deki LicenseValidator sınıfı, bu yanıt kodlarıyla ilgili gerekli tüm işlemleri sizin için sağlar.

Tablo 3. Google Play sunucusu tarafından lisans yanıtında döndürülen yanıt kodlarının özeti.

Yanıt Kodu Tam sayı-değer gösterimi Açıklama İmzalandı mı? Ekstralar Yorumlar
LICENSED 0 Uygulama kullanıcıya verilir. Kullanıcı uygulamayı satın almıştır veya uygulamanın alfa ya da beta sürümünü indirip yükleme yetkisine sahiptir. Evet VT, GT GR Policy kısıtlamaya göre erişime izin ver.
LICENSED_OLD_KEY 2 Uygulama kullanıcıya lisanslandı ancak farklı bir anahtarla imzalanmış güncellenmiş bir uygulama sürümü mevcut. Evet VT, GT, GR, UT İsteğe bağlı olarak Policy kısıtlamalarına göre erişim izni verin.

Yüklü uygulama sürümü tarafından kullanılan anahtar çiftinin geçersiz veya güvenliğinin ihlal edildiğini gösterebilir. Uygulama, gerekirse erişim izni verebilir veya kullanıcıyı bir yükseltmenin olduğu konusunda bilgilendirebilir ve yükseltmeye kadar kullanımı sınırlandırabilir.

NOT_LICENSED 1 Kullanıcıya uygulama için lisans verilmemiş. Hayır Erişime izin verme.
ERROR_CONTACTING_SERVER 257 Yerel hata - Google Play uygulaması, büyük olasılıkla ağ kullanılabilirliği sorunlarından dolayı lisanslama sunucusuna ulaşamamıştır. Hayır Policy yeniden deneme sınırına göre lisans kontrolünü yeniden deneyin.
ERROR_SERVER_FAILURE 4 Sunucu hatası — Sunucu, uygulamanın anahtar çiftini lisanslama için yükleyemedi. Hayır Policy yeniden deneme sınırına göre lisans kontrolünü yeniden deneyin.
ERROR_INVALID_PACKAGE_NAME 258 Yerel hata — Uygulama, cihazda yüklü olmayan bir paket için lisans kontrolü istedi. Hayır Lisans kontrolünü tekrarlamayın.

Genellikle bir geliştirme hatasından kaynaklanır.

ERROR_NON_MATCHING_UID 259 Yerel hata — Uygulama, UID'si (paket, kullanıcı kimliği çifti), istekte bulunan uygulamanınkiyle eşleşmeyen bir paket için lisans kontrolü istedi. Hayır Lisans kontrolünü tekrarlamayın.

Genellikle bir geliştirme hatasından kaynaklanır.

ERROR_NOT_MARKET_MANAGED 3 Sunucu hatası — Uygulama (paket adı) Google Play tarafından tanınmadı. Hayır Lisans kontrolünü tekrarlamayın.

Uygulamanın Google Play'de yayınlanmadığını veya lisanslama uygulamasında bir geliştirme hatası olduğunu gösterebilir.

Not: Test Ortamını Oluşturma bölümünde açıklandığı gibi, yanıt kodu, uygulama geliştiricisi ve tüm kayıtlı test kullanıcıları için Google Play Console aracılığıyla manuel olarak geçersiz kılınabilir.

Not: Önceden, bir uygulamayı yayınlanmamış "taslak" sürümünü yükleyerek test edebiliyordunuz. Bu işlev artık desteklenmemektedir. Bunun yerine, işlevi alfa veya beta dağıtım kanalına yayınlamanız gerekir. Daha fazla bilgi için Taslak Uygulamalar Artık Desteklenmiyor bölümüne göz atın.

Sunucu Yanıtı Ekstraları

Lisanslama sunucusu, başvuru geri ödeme süresi boyunca uygulamaya erişimi yönetmesine yardımcı olmak ve diğer bilgileri sağlamak için lisans yanıtlarına çeşitli bilgiler ekler. Hizmet özellikle uygulamanın lisans geçerlilik süresi, yeniden deneme ek süresi, izin verilen maksimum yeniden deneme sayısı ve diğer ayarlar için önerilen değerleri sağlar. Uygulamanız APK genişletme dosyaları kullanıyorsa yanıt, dosya adlarını, boyutlarını ve URL'leri de içerir. Sunucu, ayarları lisans yanıtı "extras" alanına anahtar/değer çiftleri olarak ekler.

Tüm Policy uygulamaları, ek ayarları lisans yanıtından ayıklayabilir ve gerektiğinde kullanabilir. Varsayılan LVL Policy uygulaması (ServerManagedPolicy), çalışan bir uygulamadır ve ayarların nasıl edinileceğini, saklanacağını ve kullanılacağını gösterir.

Tablo 4. Google Play sunucusu tarafından lisans yanıtında sağlanan lisans yönetimi ayarlarının özeti.

EkstraAçıklama
VT Lisans geçerlilik zaman damgası. Geçerli (önbelleğe alınan) lisans yanıtının süresinin dolacağı ve lisanslama sunucusunda yeniden kontrol edilmesi gereken tarihi/saati belirtir. Lisans geçerlilik süresi ile ilgili aşağıdaki bölüme bakın.
GT Ek yayınlanma süresi zaman damgası. Yanıt durumu RETRY olsa bile, Politikanın uygulamaya erişime izin verebileceği dönemin sonunu belirtir.

Değer, sunucu tarafından yönetilir ancak tipik bir değer 5 gün veya daha uzun olur. Aşağıdaki Yeniden deneme süresi ve maksimum yeniden deneme sayısı bölümüne bakın.

GR Maksimum yeniden deneme sayısı. Kullanıcının uygulamaya erişimini reddetmeden önce Policy tarafından izin verilmesi gereken art arda RETRY lisans kontrolü sayısını belirtir.

Değer, sunucu tarafından yönetilir ancak tipik bir değer "10" veya daha yüksek olur. Aşağıdaki Yeniden deneme süresi ve maksimum yeniden deneme sayısı bölümüne bakın.

UT Güncelleme zaman damgası. Bu uygulamada yapılan en son güncellemenin yüklenip yayınlandığı günü/saati belirtir.

Sunucu bu ekstra veriyi yalnızca LICENSED_OLD_KEYS yanıtlarında döndürür. Böylece Policy, kullanıcının uygulamaya erişimini engellemeden önce yeni lisanslama anahtarlarıyla bir güncellemenin yayınlanmasından bu yana ne kadar süre geçtiğini belirleyebilir.

FILE_URL1 veya FILE_URL2 Bir genişletme dosyasının URL'si (1 ana dosya, 2 yama dosyası içindir). Dosyayı HTTP üzerinden indirmek için bunu kullanın.
FILE_NAME1 veya FILE_NAME2 Genişletme dosyasının adı (1 ana dosya, 2 yama dosyası içindir). Dosyayı cihaza kaydederken bu adı kullanmanız gerekir.
FILE_SIZE1 veya FILE_SIZE2 Dosyanın bayt cinsinden boyutu (1 ana dosya, 2 yama dosyası içindir). İndirme işlemine yardımcı olmak ve indirmeden önce cihazın paylaşılan depolama alanında yeterli alan bulunduğundan emin olmak için bunu kullanın.

Lisans geçerlilik süresi

Google Play lisanslama sunucusu, indirilen tüm uygulamalar için bir lisans geçerlilik süresi ayarlar. Bu süre, uygulamadaki lisanslama Policy tarafından bir uygulamanın lisans durumunun değiştirilemez ve önbelleğe alınabilir kabul edilmesi gereken zaman aralığını belirtir. Lisans sunucusu, tüm lisans kontrollerine verdiği yanıta geçerlilik süresini dahil eder ve VT anahtarının altına ekstra bir geçerlilik sonu zaman damgası olarak ekler. A Policy, VT anahtarı değerini ayıklayabilir ve geçerlilik süresi dolana kadar lisansı yeniden kontrol etmeden uygulamaya erişim izni vermek için koşullu olarak kullanabilir.

Lisansın geçerliliği, lisanslama durumunu lisanslama sunucusuyla tekrar kontrol etmesi gerektiğinde Policy lisanslamasına işaret eder. Bir uygulamanın gerçekten kullanım lisansı alıp almadığını ima etmek değildir. Yani bir uygulamanın lisans geçerlilik süresi sona erdiğinde bu, uygulamanın artık kullanım lisansının olmadığı anlamına gelmez. Yalnızca Policy'ın lisans durumunu sunucuyla tekrar kontrol etmesi gerektiğini belirtir. Bu doğrultuda, lisans geçerlilik süresi sona ermediği sürece Policy ürününün ilk lisans durumunu yerel olarak önbelleğe alması ve sunucuya yeni bir lisans denetimi göndermek yerine önbelleğe alınan lisans durumunu döndürmesi kabul edilebilirdir.

Lisans sunucusu, uygulamanın ücretli uygulamalar için Google Play'in sunduğu geri ödeme süresi boyunca lisanslamayı düzgün şekilde yapmasına yardımcı olmak amacıyla geçerlilik süresini yönetir. Geçerlilik süresini, uygulamanın satın alınıp alınmadığına ve satın alındıysa ne kadar süre öncesine bağlı olarak belirler. Özellikle sunucu, geçerlilik süresini aşağıdaki gibi ayarlar:

  • Ücretli bir uygulamada sunucu, ilk lisans geçerlilik süresini ayarlayarak lisans yanıtının uygulama geri ödenebilir olduğu sürece geçerli kalmasını sağlar. Uygulamadaki bir lisanslama Policy, ilk lisans kontrolünün sonucunu önbelleğe alabilir ve geçerlilik süresi sona erene kadar lisansın yeniden kontrol edilmesi gerekmez.
  • Bir uygulamanın ücretinin geri ödemesi artık mümkün olmadığında sunucu daha uzun bir geçerlilik süresi (genellikle gün sayısı) belirler.
  • Ücretsiz uygulamalarda, sunucu geçerlilik süresini çok yüksek bir değere (long.MAX_VALUE) ayarlar. Bu, Policy geçerlilik zaman damgasını yerel olarak önbelleğe aldığı sürece, uygulamanın lisans durumunu ileride yeniden kontrol etmesine gerek kalmamasını sağlar.

ServerManagedPolicy uygulaması, kullanıcının uygulamaya erişmesine izin vermeden önce lisans durumunun sunucuyla tekrar kontrol edilip edilmeyeceğini belirlemek için birincil koşul olarak ayıklanan zaman damgasını (mValidityTimestamp) kullanır.

Yeniden deneme süresi ve maksimum yeniden deneme sayısı

Bazı durumlarda sistem veya ağ koşulları, bir uygulamanın lisans denetiminin lisanslama sunucusuna ulaşmasını ya da sunucu yanıtının Google Play istemci uygulamasına ulaşmasını engelleyebilir. Örneğin, kullanıcı, hücresel ağ veya veri bağlantısı olmadığında (ör. uçaktayken) ya da ağ bağlantısı kararsız olduğunda veya hücre sinyali zayıf olduğunda bir uygulamayı başlatabilir.

Ağ sorunları bir lisans kontrolünü engellediğinde veya kesintiye uğrattığında Google Play istemcisi, Policy processServerResponse() yöntemine RETRY yanıt kodu döndürerek uygulamayı bilgilendirir. Uygulamanın Google Play'in ILicensingService uygulamasına bağlanamaması gibi sistem sorunları durumlarında, LicenseChecker kitaplığının kendisi RETRY yanıt koduyla Politika processServerResponse() yöntemini çağırır.

Genel olarak RETRY yanıt kodu, lisans kontrolünün tamamlanmasını engelleyen bir hata oluştuğunu uygulamaya dair bir sinyaldir.

Google Play sunucusu, yeniden deneme "ek yayınlanma süresi" ve önerilen maksimum yeniden deneme sayısı ayarlayarak bir uygulamanın hata koşulları altında lisanslamayı yönetmesine yardımcı olur. Sunucu bu değerleri tüm lisans kontrolü yanıtlarına ekleyerek GT ve GR anahtarlarının altına ekstra değerler olarak ekler.

Policy uygulaması, GT ve GR ekstralarını ayıklayabilir ve bunları uygulamaya erişime koşullu olarak izin vermek için aşağıdaki gibi kullanabilir:

  • RETRY yanıtıyla sonuçlanan bir lisans kontrolü için Policy, RETRY yanıt kodunu önbelleğe almalı ve RETRY yanıt sayısını artırmalıdır.
  • Policy, yeniden deneme için tanınan ek sürenin hâlâ etkin olması veya maksimum yeniden deneme sayısına ulaşılmamış olması koşuluyla, kullanıcının uygulamaya erişmesine izin vermelidir.

ServerManagedPolicy, yukarıda açıklandığı gibi sunucu tarafından sağlanan GT ve GR değerlerini kullanır. Aşağıdaki örnekte, allow() yöntemindeki yeniden deneme yanıtlarının koşullu olarak işlenmesi gösterilmektedir. RETRY yanıtların sayısı processServerResponse() yönteminde tutulur, gösterilmez.

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