Uygulamanıza İstemci Tarafı Lisans Doğrulamasını Ekleme

Uyarı: Uygulamanız, açısından güvenli değilse, potansiyel saldırganların verileri değiştirmesi veya kaldırması bu doğrulama süreciyle ilişkili mantığın da üstesinden gelebilir.

Bu nedenle, size yardımcı olmak için aşağıdakileri önemle öneririz: sunucu tarafında performans göster lisans doğrulamasını kullanın.

Bir yayıncı hesabı ve geliştirme ortamı oluşturduktan sonra (Lisanslamaya Yönelik Ayarlama bölümüne bakın), artık uygulamanızı Lisans Doğrulama Kitaplığı (LVL) ile doğrulayın.

LVL ile lisans doğrulaması eklemek şu görevleri içerir:

  1. Uygulamanızın manifest dosyasına lisanslama iznini ekleyin.
  2. Politika Uygulama: LVL'de sağlanan eksiksiz uygulamalardan birini seçebilir veya kendi uygulamanızı oluşturabilirsiniz.
  3. Policy herhangi bir öğeyi önbelleğe alacaksa bir Bilgi Grafiği Uygulama lisans yanıt verileri.
  4. Uygulamanızın ana sayfasında lisansı kontrol etmek için kod ekleme Etkinlik'e dokunun.
  5. DeviceLimiter uygulama (isteğe bağlıdır ve için geçerlidir).

Aşağıdaki bölümlerde bu görevler açıklanmaktadır. uygulamanızı başarılı bir şekilde derleyebiliyor ve hızlı bir Testi Ayarlama konusunda açıklandığı gibi teste başlayabilirsiniz Ortam.

LVL'ye dahil edilen kaynak dosyaların tamamına genel bir bakış için LVL Sınıflarının Özeti bölümüne bakın ve Arayüzler.

Lisanslama İznini Ekleme

Google Play uygulamasını kullanarak uygulamanızın uygun izni istemesi gerekir. com.android.vending.CHECK_LICENSE Uygulamanız lisanslama iznini beyan etmez ancak lisans kontrolü başlatmaya çalışırsa LVL bir güvenlik istisnası uygular.

Uygulamanızda lisanslama izni istemek için bir <uses-permission> beyan edin. öğesini aşağıdaki gibi <manifest> alt öğesi olarak kullanın:

<uses-permission android:name="com.android.vending.CHECK_LICENSE" />

Örneğin, LVL örnek uygulamasının izni şu şekilde beyan ettiğini görebilirsiniz:

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android" ...">
    <!-- Devices >= 3 have version of Google Play that supports licensing. -->
    <uses-sdk android:minSdkVersion="3" />
    <!-- Required permission to check licensing. -->
    <uses-permission android:name="com.android.vending.CHECK_LICENSE" />
    ...
</manifest>

Not: Şu anda LVL kitaplığı projesinin manifest dosyasında CHECK_LICENSE iznini kullan, Çünkü SDK Araçları, bunları bağımlı öğelerin manifest dosyalarında izin verir. Bunun yerine izni her bağımlı öğede beyan etmeniz gerekir. manifestosunu ekleyin.

Politika Uygulama

Google Play lisanslama hizmeti, belirli bir lisansa sahip olan kullanıcıya uygulamanıza erişim izni verilmelidir. Aksine, bu sorumluluk sizin sağladığınız bir Policy uygulamasına aittir tercih edebilirsiniz.

Politika, LVL tarafından beyan edilen ve sonuca bağlı olarak, kullanıcı erişimine izin verme veya vermeme mantığı olabilir. LVL'yi kullanmak için uygulamanız Policy uygulanması.

Policy arayüzünde iki yöntem açıklanmaktadır: allowAccess() ve LicenseChecker tarafından çağrılan processServerResponse() lisans sunucusundan alınan yanıtın işlenmesine neden olur. Ayrıca, lisans yanıtını belirten LicenseResponse adlı enum değer, çağrılarda processServerResponse() öğesine iletildi.

  • processServerResponse(), ham yanıtı önceden işlemenizi sağlar veri izni alıp almayacağına karar vermeden önce, erişim.

    Tipik bir uygulama, lisanstaki alanların bir kısmını veya tamamını ayıklar verileri yerel olarak kalıcı bir depoda depolama ve (örneğin, SharedPreferences depolama alanı (verilerin depolandığından emin olmak için) uygulama çağrıları ve cihaz kapatma döngülerinde erişilebilir. Örneğin, Policy, son başarılı lisans kontrolünün zaman damgasını korur. yeniden deneme sayısını, lisansın geçerlilik süresini ve değerleri sıfırlamak yerine kalıcı bir depolama alanına kullanıma sunuldu.

    Yanıt verileri yerel olarak depolanırken Policy, verilerin şurada olduğundan emin olmalıdır: kod karartılmış (bkz. Gizleme Aracı'nı uygulama, bölümüne bakın).

  • allowAccess(), kullanıcıya lisans yanıt verilerine göre ( sunucu veya önbellek üzerinden) ya da uygulamaya özel diğer bilgiler olabilir. Örneğin, örnek olarak, allowAccess() uygulamanızın kullanım veya bir arka uç sunucusuna gidin. Her durumda, allowAccess() uygulanması true, yalnızca kullanıcının lisanslama sunucusu tarafından belirlendiği şekliyle veya ağ veya sistem sorunu nedeniyle lisans kontrolünün tamamlanmasını engelleyen bir durumdur. İçinde Bu tür durumlarda uygulamanız, yeniden deneme yanıtlarının sayısını koruyabilir ve bir sonraki lisans kontrolü tamamlanana kadar erişime geçici olarak izin vermeniz gerekir.

Uygulamanıza lisans ekleme sürecini basitleştirmek ve Policy nasıl tasarlanması gerektiğini gösteren bir örnek, LVL'de veya değişiklik yapmadan kullanabileceğiniz iki tam Policy göre uyarlayabilirsiniz:

  • ServerManagedPolicy, esnek bir Policy erişimi yönetmek için sunucu tarafından sağlanan ayarları ve önbelleğe alınan yanıtları kullanan çeşitli ağ koşulları ve
  • StrictPolicy: Hiçbir yanıtı önbelleğe almayan ve yalnızca sunucu lisanslı bir dosya döndürürse erişim izni tıklayın.

Çoğu uygulamada ServerManagedPolicy'nin kullanımı önerilir. ServerManagedPolicy, LVL varsayılanıdır ve LVL örnek uygulamasını kullanın.

Özel politika kuralları

Lisanslama uygulamanızda, Google Ads'in kendi lisansı için LVL'de (ServerManagedPolicy veya StrictPolicy) sağlananları ya da özel politika. Her tür özel politika için birkaç önemli tasarım vardır göz önünde bulundurmanız gereken birkaç noktaya değineceğiz.

Lisanslama sunucusu, aşırı kullanıma karşı koruma sağlamak için genel istek sınırlarını uygular neden olabilir. Başvuru, lisans sunucusu bir 503 yanıtı döndürür ve uygulamanıza genel bir sunucu hatası olarak aktarılır. Yani hayır, lisans yanıtı, sınır sıfırlanana kadar kullanıcıya sunulur. Kullanıcıyı belirsiz bir süre boyunca etkileyebilir.

Özel bir politika tasarlıyorsanız Policy şunları öneririz:

  1. En son başarılı lisans yanıtını önbelleğe alır (ve düzgün bir şekilde görüntüler) depolama alanı sunar.
  2. Tüm lisans kontrolleri için önbelleğe alınan yanıtı, önbelleğe alınmış yanıtın geçerli olup olmadığı, lisanslama sunucusuna istekte bulunmaktan ibaret değildir. Yanıt geçerliliğini sunucu tarafından sağlanan VT değerine göre ayarlama şiddetle önerilir. Sunucu Yanıtı Ekstraları bölümüne bakın konulu videomuzu izleyin.
  3. Bir istek yeniden denendiğinde eksponansiyel geri yükleme süresi kullanılır. hatalar. Google Play istemcisinin otomatik olarak yeniden denemelerinin başarısız olduğunu unutmayın Bu nedenle, çoğu durumda Policy cihazınızın bu işlemleri yeniden denemesine gerek yoktur.
  4. "Ek süre" sağlar kullanıcının sınırlı bir süre veya kullanım sayısı için başvurulması durumunda, bu esnada yeniden denendi. Ek süre, kullanıcıya bir sonraki bir lisans kontrolünün başarıyla tamamlandığını gösterir ve geçerli bir lisans yanıtı olmadığında uygulamanıza erişimi kesin olarak sınırlayın kullanılabilir.

Policy cihazınızı yukarıda listelenen yönergelere göre tasarlamanız çok önemlidir. çünkü size en iyi deneyimi sunarken kullanıcılara da mümkün olan en iyi deneyimi hata koşullarında bile uygulamanız üzerinde etkili kontrol sahibi olmanızı sağlar.

Tüm Policy verilerinin, lisanslama sunucusu tarafından sağlanan ayarları kullanarak şu işlemleri yapabileceğini unutmayın: geçerlilik ve önbelleğe almayı yönetmenize, ek süreyi yeniden denemenize ve daha fazlasına yardımcı olabilir. Bu Sunucu tarafından sağlanan ayarlar oldukça basittir ve önerilir. Nasıl yapılacağına dair bir örnek için ServerManagedPolicy uygulamasını ve ekstraları kullanın. Sunucu ayarları listesi ve nasıl kullanılır? Sunucu Yanıtı Ekstralar.

ServerManagedPolicy

LVL, Policy öğesinin eksiksiz ve önerilen bir şekilde uygulanmasını içerir ServerManagedPolicy adlı bir arayüz oluşturuyor. Uygulama, LVL sınıfları ve kitaplıkta varsayılan Policy olarak kullanılır.

ServerManagedPolicy, lisansla ilgili tüm işlemleri sağlar ve yeniden deneyin tıklayın. Yanıt verilerinin tamamını bir önbellekte SharedPreferences dosyasına ait dosyayı Obfuscator uygulanması. Bu, lisans yanıtının veriler güvenlidir ve cihazın güç döngüsü boyunca saklanır. ServerManagedPolicy arayüz yöntemlerinin somut uygulamalarını sunar processServerResponse(), allowAccess() ve ayrıca Lisans yönetimine ilişkin bir dizi destekleyici yöntem ve tür içerir tıklayın.

Daha da önemlisi, ServerManagedPolicy'nin temel özelliklerinden biri, lisanslama yönetiminde temel oluşturmak için, sunucu tarafından sağlanan ayarlar geri ödeme süresi ve çeşitli ağ ile hata koşulları arasında bağlantı kurabilir. Bir uygulama lisans kontrolü için Google Play sunucusuyla iletişim kurduğunda sunucu belirli öğelerin ekstralar alanına anahtar/değer çifti olarak lisans yanıt türleri. Örneğin, sunucu uygulamanın lisans geçerlilik süresi, yeniden deneme ek süresi ve izin verilen maksimum süre ve yeniden deneme sayısı gibi özellikler bulunur. ServerManagedPolicy, lisans yanıtının processServerResponse() yönteminde ve kontrollerinde bunları allowAccess() yönteminde gerçekleştirir. Sunucu tarafından sağlanan ServerManagedPolicy tarafından kullanılan ayarlara bakın için Sunucu Yanıtı Ekstralar.

Kolaylık, en iyi performans ve lisans ayarlarını kullanmanın avantajı için Policy lisansının alınması kesinlikle önerilir.

Google tarafından sağlanan lisans yanıt verilerinin güvenliğiyle ilgili yerel olarak SharedPreferences içinde depolanıyorsa daha güçlü bir kod karartma veya lisans verilerini depolamayan daha sıkı bir Policy tasarlayın. LVL böyle bir Policy örneğini içerir. Daha fazla bilgi için StrictPolicy'ye bakın.

ServerManagedPolicy'yi kullanmak için Etkinliğinize aktarın, oluşturabilir ve LicenseChecker Bkz. LisansChecker'ı Örneklendirme ve LicenseCheckerCallback hakkında daha fazla bilgi edinin.

Katı Politika

LVL, Policy arayüzünün alternatif bir tam uygulamasını içerir. strictPolicy olarak adlandırılır. StrictPolicy uygulaması, daha kısıtlayıcı bir ServerManagedPolicy yerine, kullanıcının içeriğe erişmesine gereken zamanda sunucudan bir lisans yanıtı alınmadığı takdirde, Kullanıcının lisanslı olduğunu gösteren erişim zamanı.

StrictPolicy'nin ana özelliği, hiçbir yerel olarak, kalıcı bir depoda lisans yanıtı verilerini sunar. Veriler depolanmadığından Yeniden deneme istekleri izlenmez ve önbelleğe alınan yanıtlar, istekleri karşılamak için kullanılamaz lisans kontrolleri. Policy yalnızca şu durumlarda erişim izni verir:

  • Lisans yanıtı, lisanslama sunucusundan alınır ve
  • Lisans yanıtı, kullanıcının bir uygulamadır.

Öncelikli endişeniz aşağıdakileri sağlamaksa, StrictPolicy'yi kullanmak uygundur: hiçbir zaman, kullanıcı kabul edilmediği sürece kullanım sırasında kullanıcının lisanslı olduğu onaylanır. Ayrıca, Politika, ServerManagedPolicy'den biraz daha fazla güvenlik sağlar yerel olarak önbelleğe alınmış veri yoktur, kötü amaçlı bir kullanıcının değişiklik yapması mümkün değildir. verilerine geri dönmesini ve uygulamaya erişim elde etmesini sağlar.

Aynı zamanda bu Policy, normal kullanıcılar için de bir zorluk teşkil eder çünkü Bu durumda, ağ bağlantısı olmadığında uygulamaya erişemezler. (hücresel veya kablosuz) bağlantı var. Başka bir yan etki de, daha fazla lisans kontrolü isteği gönderir. Bunun nedeni bu mümkün değildir.

Genel olarak bu politika, kullanıcılara bir dereceye kadar kolaylıktan ödün vermektedir. erişim üzerinde mutlak güvenlik ve kontrol sağlar. Dengeyi iyice düşünün kullanın.Policy

StrictPolicy'yi kullanmak için Etkinliğinize aktarın, bir örnek oluşturun ve ve LicenseChecker oluştururken buna bir referans iletin. Görüntüleyin LisansChecker ve LicenseCheckerCallback'i Örneklendirme konulu videomuzu izleyin.

Tipik bir Policy uygulamasının lisans yanıt verilerini kaydetmesi gerekir. bir uygulamayı kalıcı depoya yükleyebilir ve böylece bu uygulamanın cihaz kapatma döngüleri veya uygulama çağrıları gibi. Örneğin, Policy son başarılı lisans kontrolünün zaman damgasını, yeniden deneme sayısını ve lisansın geçerlilik süresi ve kalıcı bir mağazada bulunan benzer bilgiler, bunun yerine değerleri yeniden başlatabilirsiniz. İlgili içeriği oluşturmak için kullanılan LVL'ye dahil edilen varsayılan Policy, ServerManagedPolicy, lisans yanıtını depolar SharedPreferences örneğindeki verileri değiştirebilirsiniz. Böylece, kalıcıdır.

Çünkü Policy, lisanslarla ilgili bilgilerin saklanıp saklanmadığını uygulamaya erişimi izin vermemek veya engellemek için tüm depolanan veriler güvenlidir ve bir kök kullanıcı tarafından tekrar kullanılamaz veya kullanılamaz. olanak tanır. Özellikle, Policy depolamadan önce her zaman verileri karartmalıdır Söz konusu uygulama ve cihaza özel bir anahtar kullanarak. Kodu karartma: hem uygulamaya özgü hem de cihaza özgü bir kod çok önemlidir. karartılmış verilerin uygulamalar arasında paylaşılmasını engeller ve cihazlar.

LVL, uygulamanın lisans yanıt verilerini güvenli ve kalıcı bir şekilde dönüştürmektir. Öncelikle, bir Obfuscator sağlar uygulamanızın kod karartma algoritmasını sağlamasına olanak tanıyan tercih edilir. Bu bilgiler ışığında LVL, PreferenceObfuscator, Google Ad Manager'ın ve kodu karartılmış verileri bir cihazda okuma ve yazma için Obfuscator SharedPreferences örneği.

LVL, tek bir Obfuscator uygulaması için Verileri karartmak için AES şifrelemesini kullanan AESObfuscator. Şunları yapabilirsiniz: AESObfuscator'ı uygulamanızda değiştirmeden kullanın ya da ihtiyaçlarınıza uygun hale getirebilirsiniz. Policy (ör. ServerManagedPolicy), lisans yanıt verilerini önbelleğe alır. Bunun için AESObfuscator'ı temel olarak Obfuscator uygulamanız önemle tavsiye edilir. Daha fazla bilgi edinmek için bir sonraki bölümü inceleyin.

AESObfuscator

LVL, Obfuscator öğesinin eksiksiz ve önerilen bir şekilde uygulanmasını içerir bir arayüz oluşturuyor. Uygulama, LVL örnek uygulaması ve kitaplıkta varsayılan Obfuscator olarak kullanılır.

AESObfuscator, aşağıdaki işlemler için AES kullanarak verilerde güvenli kod karartma sağlar: verileri yazma veya depolama alanından okunurken şifreleme ve şifrelerini çözme. Obfuscator, sağlanan üç veri alanını kullanarak şifrelemeyi başlatır uygulama tarafından:

  1. takviye değer: Her kod karartma işlemi için (an) kullanılan rastgele bayt dizisi.
  2. Bir uygulama tanımlayıcısı dizesi (genellikle uygulamanın paket adı).
  3. Cihaza özgü birçok kaynaktan türetilen bir cihaz tanımlayıcı dizesi olabildiğince benzersiz hale getirmektir.

AESObfuscator'ı kullanmak için önce onu Etkinliğinize aktarın. Özel olduğunu bildir takviye baytlarını tutacak ve rastgele 20'ye başlatacak statik son dizi oluşturulan baytlardan oluşur.

Kotlin

// Generate 20 random bytes, and put them here.
private val SALT = byteArrayOf(
        -46, 65, 30, -128, -103, -57, 74, -64, 51, 88,
        -95, -45, 77, -117, -36, -113, -11, 32, -64, 89
)

Java

...
    // Generate 20 random bytes, and put them here.
    private static final byte[] SALT = new byte[] {
     -46, 65, 30, -128, -103, -57, 74, -64, 51, 88, -95,
     -45, 77, -117, -36, -113, -11, 32, -64, 89
     };
    ...

Ardından, cihaz tanımlayıcısını barındıracak bir değişken tanımlayın ve bu bilgilerden yararlanabilirsiniz. Örneğin, LVL'ye dahil edilen örnek uygulama sistem ayarlarını sorgular: Her cihaz için benzersiz olan android.Settings.Secure.ANDROID_ID.

Kullandığınız API'lere bağlı olarak uygulamanızın Cihaza özel bilgiler edinmek için ek izinler isteyebilir. Örneğin, elde etmek için TelephonyManager veya ilgili veriler varsa uygulamanın ayrıca Manifest dosyasında android.permission.READ_PHONE_STATE iznini bulunmalıdır.

Tek amaç edinme amacıyla yeni izin istemeden önce Obfuscator cihazınızda kullanılmak üzere cihaza özel bilgileri bunun uygulamanızı veya Google Play'deki filtrelemesini nasıl etkileyebileceği (bazı izinler, SDK derleme araçlarının ilişkilendirilmiş <uses-feature>).

Son olarak, AESObfuscator'ın bir örneğini oluşturun. uygulama tanımlayıcısı ve cihaz tanımlayıcısı bulunur. Örneği Policy ve LicenseChecker oluştururken doğrudan kullanabilirsiniz. Örnek:

Kotlin

    ...
    // Construct the LicenseChecker with a Policy.
    private val checker = LicenseChecker(
            this,
            ServerManagedPolicy(this, AESObfuscator(SALT, packageName, deviceId)),
            BASE64_PUBLIC_KEY
    )
    ...

Java

    ...
    // Construct the LicenseChecker with a Policy.
    checker = new LicenseChecker(
        this, new ServerManagedPolicy(this,
            new AESObfuscator(SALT, getPackageName(), deviceId)),
        BASE64_PUBLIC_KEY // Your public licensing key.
        );
    ...

Tam bir örnek için LVL örnek uygulamasındaki MainActivity bölümüne bakın.

Bir Etkinlikten Lisansı Kontrol Etme

Uygulamanıza erişimi yönetmek için bir Policy uyguladığınızda, Sonraki adım, uygulamanıza bir lisans denetimi eklemektir. Bu denetim, lisanslama sunucusuna bağlıdır ve uygulamaya erişimi lisans yanıtı. Lisans kontrolünü ekleme ve işleme süreçlerinin tümü yanıt, ana Activity kaynak dosyanızda gerçekleşir.

Lisans kontrolünü eklemek ve yanıtı işlemek için:

  1. İçe aktarma işlemleri ekleme
  2. LisansCheckerCallback'i özel bir iç sınıf olarak uygulayın
  3. LicenseCheckerCallback'ten UI iş parçacığına yayın yayınlamak için bir işleyici oluştur
  4. LisansChecker'ı Örneklendirme ve LicenseCheckerCallback
  5. Lisans kontrolünü başlatmak için checkAccess() komutunu çağırın
  6. Ortak anahtarınızı lisanslama için yerleştirme
  7. IPC bağlantılarını kapatmak için LisansChecker'ınızın onDestroy() yöntemini çağırın.

Aşağıdaki bölümlerde bu görevler açıklanmaktadır.

Lisans kontrolü ve yanıtına genel bakış

Çoğu durumda, lisans kontrolünü uygulamanızın ana Activity: onCreate() yönteminde. Bu kullanıcı doğrudan uygulamanızı başlattığında lisans kontrolünün hemen çağrılır. Bazı durumlarda yerleri de kapsıyor. Örneğin, uygulamanız birden fazla Etkinlik içeriyorsa diğer uygulamaların Intent başlatabileceği bileşenler, lisans kontrolleri ekleyebilirsiniz.

Lisans kontrolü iki ana işlemden oluşur:

  • Lisans kontrolünü başlatmak için bir yönteme yapılan çağrı. LVL'de LicenseChecker nesnesinin checkAccess() yöntemine yapılan çağrı anlatacağım.
  • Lisans kontrolünün sonucunu döndüren bir geri çağırma. LVL'de bu, bir LicenseCheckerCallback arayüzünü görürsünüz. İlgili içeriği oluşturmak için kullanılan arayüz iki yöntem tanımlar: allow() ve dontAllow(), sonucunda belirir. Bu iki yöntemi istediğiniz mantıkla uygulayabilirsiniz. uygulamanıza kullanıcı tarafından erişilmesine izin vermek veya vermemek için ihtiyacınız olan her şey. Lütfen bu yöntemler erişime izin verilip verilmeyeceğini Policy uygulamanızın sorumluluğundadır. Daha ziyade yöntemleri yalnızca uygulama davranışlarını nasıl erişime izin vermeme (ve uygulama hatalarını işleme).

    allow() ve dontAllow() yöntemleri bir "neden" sağlıyor. (Policy değerlerinden biri, LICENSED) olabilir. NOT_LICENSED veya RETRY. Özellikle, müşteri hizmetleri temsilcisinin yöntem, dontAllow() için RETRY yanıtını alır ve kullanıcıya bir "Yeniden dene" düğme; sene boyunca hizmetin mevcut olmamasından isteğinde bulunabilirsiniz.

Şekil 1. tipik lisans kontrolü etkileşimi

Yukarıdaki şemada, tipik bir lisans denetiminin nasıl gerçekleştiği gösterilmektedir:

  1. Uygulamanın ana Etkinlikteki kod LicenseCheckerCallback örneğini oluşturur ve LicenseChecker nesne içeriyor. LicenseChecker oluşturulurken kod, Context, kullanılacak bir Policy uygulaması ve Yayıncı hesabının parametre olarak lisanslama için ortak anahtarı.
  2. Ardından kod,checkAccess() LicenseChecker nesne algılandı. Yöntemin uygulanması, dönüşüm gerçekleştirmesi için Policy yerel olarak önbelleğe alınmış geçerli bir lisans yanıtı olup olmadığını SharedPreferences.
    • Öyleyse checkAccess() uygulaması allow().
    • Aksi takdirde, LicenseChecker, lisans kontrol isteği gönderir. aktarım yapabilirsiniz.

    Not: Lisanslama sunucusu her zaman Taslak bir uygulamanın lisans kontrolünü yaptığınızda LICENSED.

  3. Yanıt alındığında LicenseChecker, aşağıdakileri içeren bir LicenseValidator oluşturur: imzalanan lisans verilerini doğrular ve yanıtın alanlarını çıkarır, ardından ve daha ayrıntılı değerlendirmeler için bunları Policy cihazınıza gönderir.
    • Lisans geçerliyse Policy, yanıtı şurada önbelleğe alır: SharedPreferences ve doğrulayıcıya bildirim göndererek doğrulayıcıyı çağırıyor. LicenseCheckerCallback nesnesinde allow() yöntemi.
    • Lisans geçerli değilse Policy, doğrulayıcıyı bilgilendirir. Bu durumda, LicenseCheckerCallback üzerinde dontAllow() yöntemi.
  4. Kurtarılabilir bir yerel veya sunucu hatası durumunda; örneğin, ağ istek gönderilemiyorsa LicenseChecker, RETRY yanıtını iletir Policy nesnenizin processServerResponse() yöntemi.

    Ayrıca, hem allow() hem de dontAllow() geri çağırma yöntemleri bir reason bağımsız değişkeni. allow() yönteminin nedeni genellikle Policy.LICENSED veya Policy.RETRY, dontAllow() nedeni ise genellikle Policy.NOT_LICENSED veya Policy.RETRY. Bu yanıt değerleri yararlıdır. Böylece, kullanıcı için uygun bir yanıt ("Yeniden dene" gibi) dontAllow(), Policy.RETRY ile yanıt verdiğinde "hizmetten" kaynaklanıyor olabilir. kullanılamıyor.

  5. Bir uygulama hatası olduğunda; örneğin, uygulamanın geçersiz bir paket adı lisansını kontrol edin. LicenseChecker hata veriyor LicenseCheckerCallback'in applicationError() yanıtı için yanıt yöntemidir.

Lisans kontrolünü başlatmaya ve aşağıdaki bölümlerde açıklandığı gibi, uygulamanızın ayrıca bir Politika uygulaması sağlamanız ve Policy bir Obfuscator uygulaması olan yanıt verilerini (ör. ServerManagedPolicy gibi) depolar.

İçe aktarma ekle

İlk olarak uygulamanın ana Etkinlik sayfasına ait sınıf dosyasını açın ve içe aktarma LVL paketinden LicenseChecker ve LicenseCheckerCallback.

Kotlin

import com.google.android.vending.licensing.LicenseChecker
import com.google.android.vending.licensing.LicenseCheckerCallback

Java

import com.google.android.vending.licensing.LicenseChecker;
import com.google.android.vending.licensing.LicenseCheckerCallback;

LVL ile birlikte sağlanan varsayılan Policy uygulamasını kullanıyorsanız, ServerManagedPolicy ile birlikte AESObfuscator ile birlikte içe aktarın. Şu durumda: özel bir Policy veya Obfuscator kullanarak bunun yerine bunları içe aktarın.

Kotlin

import com.google.android.vending.licensing.ServerManagedPolicy
import com.google.android.vending.licensing.AESObfuscator

Java

import com.google.android.vending.licensing.ServerManagedPolicy;
import com.google.android.vending.licensing.AESObfuscator;

LicenseCheckerCallback'i özel bir iç sınıf olarak uygulama

LicenseCheckerCallback, kullanımı için LVL tarafından sağlanan bir arayüzdür sonucuna varır. LVL kullanarak lisanslamayı desteklemek için LicenseCheckerCallback ve sonraki versiyonlarını izin verme veya erişim izni vermemeyi seçebilirsiniz.

Lisans kontrolünün sonucu her zaman Yanıtın doğrulanmasına göre LicenseCheckerCallback yöntem yük, sunucu yanıt kodunun kendisi ve sağlanan ek işlemler Policy cihazınız tarafından. Uygulamanız bu yöntemleri gereken herhangi bir şekilde uygulayabilir. İçinde yöntemleri basit tutmak ve kullanıcı arayüzü yönetimi ile sınırlamak en iyisidir, durum ve uygulama erişimi. Lisansla ilgili daha fazla işlem yapmak isterseniz arka uç sunucusuyla iletişim kurarak veya özel kısıtlamalar uygulayarak yerine kodu Policy uygulamanız yerine LicenseCheckerCallback yöntemlerine yerleştiriyorum.

Çoğu durumda, kalite güvencesi LicenseCheckerCallback, uygulamanızın ana sayfasında özel bir sınıf olarak Etkinlik sınıfı.

allow() ve dontAllow() yöntemlerini şu şekilde uygulayın: gerekir. Öncelikle, basit sonuç işleme davranışlarını kullanarak örneğin bir iletişim kutusunda lisans sonucunu görüntüleyebilirsiniz. Bu sayede yardımcı olabilir. Daha sonra tam olarak istediğiniz davranışları belirlediyseniz, daha karmaşık bir işlem ekleyebilirsiniz.

Şu sayfadaki lisanssız yanıtları işlemeye yönelik bazı öneriler: dontAllow() şunları içerir:

  • "Tekrar dene" mesajının gösterilmesini sağlama açma/kapatma düğmesi içeren bir düğmeyle birlikte kullanıcıya yeni lisans kontrolü, sağlanan reason öğesinin Policy.RETRY olup olmadığını kontrol eder.
  • "Bu uygulamayı satın al" mesajını göster iletişim kutusunu Kullanıcı, uygulamanın Google Play'deki ayrıntılar sayfasına derin bir bağlantı oluşturur. Bu sayfada ise uygulamayı satın alabileceği anlamına gelir. Bu tür ayarların nasıl yapılacağıyla ilgili daha fazla Ürünlerinize Bağlantı Oluşturma bölümüne bakın.
  • Mesajın özelliklerinin belirtildiği bir Toast bildirimi görüntüle Başvurular lisanslı olmadığı için sınırlandırıldı.

Aşağıdaki örnekte, LVL örnek uygulamasının LicenseCheckerCallback: Lisans denetimi sonucunun iletişim kutusu.

Kotlin

private inner class MyLicenseCheckerCallback : LicenseCheckerCallback {

    override fun allow(reason: Int) {
        if (isFinishing) {
            // Don't update UI if Activity is finishing.
            return
        }
        // Should allow user access.
        displayResult(getString(R.string.allow))
    }

    override fun dontAllow(reason: Int) {
        if (isFinishing) {
            // Don't update UI if Activity is finishing.
            return
        }
        displayResult(getString(R.string.dont_allow))

        if (reason == Policy.RETRY) {
            // If the reason received from the policy is RETRY, it was probably
            // due to a loss of connection with the service, so we should give the
            // user a chance to retry. So show a dialog to retry.
            showDialog(DIALOG_RETRY)
        } else {
            // Otherwise, the user isn't licensed to use this app.
            // Your response should always inform the user that the application
            // isn't licensed, but your behavior at that point can vary. You might
            // provide the user a limited access version of your app or you can
            // take them to Google Play to purchase the app.
            showDialog(DIALOG_GOTOMARKET)
        }
    }
}

Java

private class MyLicenseCheckerCallback implements LicenseCheckerCallback {
    public void allow(int reason) {
        if (isFinishing()) {
            // Don't update UI if Activity is finishing.
            return;
        }
        // Should allow user access.
        displayResult(getString(R.string.allow));
    }

    public void dontAllow(int reason) {
        if (isFinishing()) {
            // Don't update UI if Activity is finishing.
            return;
        }
        displayResult(getString(R.string.dont_allow));

        if (reason == Policy.RETRY) {
            // If the reason received from the policy is RETRY, it was probably
            // due to a loss of connection with the service, so we should give the
            // user a chance to retry. So show a dialog to retry.
            showDialog(DIALOG_RETRY);
        } else {
            // Otherwise, the user isn't licensed to use this app.
            // Your response should always inform the user that the application
            // isn't licensed, but your behavior at that point can vary. You might
            // provide the user a limited access version of your app or you can
            // take them to Google Play to purchase the app.
            showDialog(DIALOG_GOTOMARKET);
        }
    }
}

Ayrıca, applicationError() yöntemini çağırır. Bu yöntem, uygulamanızın yeniden denenebilir. Bu tür hataların listesi için Sunucu Lisanslama Referansı'ndaki Yanıt Kodları'nı inceleyin. Tekliflerinizi otomatikleştirmek ve optimize etmek için bu yöntemi kullanabilirsiniz. Çoğu durumda yöntemi, hata kodunu günlüğe kaydetmeli ve dontAllow() yöntemini çağırmalıdır.

LicenseCheckerCallback'ten yayın göndermek için işleyici oluştur kullanıcı arayüzü iş parçacığına

LVL, lisans kontrolü sırasında isteği Google Play'e iletir. lisans sunucusuyla iletişimi yürüten bir uygulamadır. LVL isteği eşzamansız IPC üzerinden aktarır (Binder kullanarak). gerçek işleme ve ağ iletişiminin bir iş parçacığı üzerinde gerçekleşmemesi uygulamanız tarafından yönetilir. Benzer şekilde, Google Play uygulaması sonucu aldığında IPC üzerinden bir geri çağırma yöntemi çağırır. uygulamanızın işleminde bir IPC iş parçacığı havuzunda yürütülür.

LicenseChecker sınıfı, uygulamanızın isteği gönderen çağrı ve isteği gönderen çağrı dahil olmak üzere yanıtı alan geri çağırmayı ifade eder. LicenseChecker, açık lisansı da takip ediyor zaman aşımlarını yönetir.

Böylece zaman aşımlarını düzgün bir şekilde işleyebilir ve gelen yanıtları işleyebilir. uygulamanızın kullanıcı arayüzü iş parçacığını etkilemeden LicenseChecker, örneklendirmede arka plan iş parçacığı. İleti dizisinde, tüm lisans denetimi sonuçları, sonucun sunucudan alınan bir yanıt olup olmadığı bir zaman aşımı hatası olabilir. İşlemenin sonunda LVL, Arka plan ileti dizisinden LicenseCheckerCallback yöntem.

Uygulamanız için bu şu anlama gelir:

  1. LicenseCheckerCallback yöntemleriniz birçok durumda şu cihazdan çağrılır: arka plan ileti dizisi.
  2. Bu yöntemler, mevcut durumu güncelleyemez veya UI iş parçacığında bir İşleyici oluşturmadığınız ve geri çağırmanızı yapmadığınız sürece kullanıcı arayüzü iş parçacığı yöntemlerin İşleyici’ye gönderilmesini sağlayın.

LicenseCheckerCallback yöntemlerinizin kullanıcı arayüzü ileti dizisini güncellemesini isterseniz ana Etkinlik bölümünde bir Handler onCreate() yöntem, aşağıda gösterildiği gibidir. Bu örnekte, LVL örnek uygulamasının LicenseCheckerCallback yöntemleri (yukarıya bakın) şu işlemi yapmak için displayResult() yöntemini çağırır: İşleyici'den kullanıcı arayüzü iş parçacığını post() yöntemi.

Kotlin

    private lateinit var handler: Handler

    override fun onCreate(savedInstanceState: Bundle?) {
        ...
        handler = Handler()
    }

Java

    private Handler handler;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        ...
        handler = new Handler();
    }

Ardından, LicenseCheckerCallback yöntemlerinizde İşleyici yöntemlerini kullanarak şunları yapabilirsiniz: Çalıştırılabilir veya Mesaj nesnelerini İşleyici'ye gönderme. Sana Özel LVL'de yer alan uygulama, kullanıcı arayüzü iş parçacığında bir İşleyici'ye Çalıştırılabilir yayını gönderir tıklayın.

Kotlin

private fun displayResult(result: String) {
    handler.post {
        statusText.text = result
        setProgressBarIndeterminateVisibility(false)
        checkLicenseButton.isEnabled = true
    }
}

Java

private void displayResult(final String result) {
        handler.post(new Runnable() {
            public void run() {
                statusText.setText(result);
                setProgressBarIndeterminateVisibility(false);
                checkLicenseButton.setEnabled(true);
            }
        });
    }

LicenseChecker ve LicenseCheckerCallback'i Örneklendirme

Ana Etkinlik onCreate() yöntem, LicenseCheckerCallback ve LicenseChecker için özel örnekleri oluşturur. Şunu yapmalısınız: önce LicenseCheckerCallback örneğini örneklendirin, çünkü bir referansı iletmeniz gerekir LicenseChecker için oluşturucuyu çağırdığınızda bu örneğe uygulanır.

LicenseChecker öğesini örneklendirdiğinizde şu parametreleri iletmeniz gerekir:

  • Context uygulaması
  • Lisans kontrolü için kullanılacak Policy uygulamasına referans. İçinde çoğu durumda, LVL tarafından sağlanan varsayılan Policy uygulamasını kullanırsınız. ServerManagedPolicy.
  • Yayıncı hesabınızın ortak anahtarını barındıran Dize değişkeni lisanslama.

ServerManagedPolicy kullanıyorsanız sınıfa erişmeniz gerekmez LicenseChecker oluşturucuda örnek oluşturabilirsiniz. aşağıdaki örnekte gösterildiği gibidir. Yeni bir ServerManagedPolicy oluştururken kod karartıcı örneği.

Aşağıdaki örnekte LicenseChecker ve Bir Etkinliğin onCreate() yönteminden LicenseCheckerCallback sınıfını kullanır.

Kotlin

class MainActivity : AppCompatActivity() {
    ...
    private lateinit var licenseCheckerCallback: LicenseCheckerCallback
    private lateinit var checker: LicenseChecker

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        ...
        // Construct the LicenseCheckerCallback. The library calls this when done.
        licenseCheckerCallback = MyLicenseCheckerCallback()

        // Construct the LicenseChecker with a Policy.
        checker = LicenseChecker(
                this,
                ServerManagedPolicy(this, AESObfuscator(SALT, packageName, deviceId)),
                BASE64_PUBLIC_KEY // Your public licensing key.
        )
        ...
    }
}

Java

public class MainActivity extends Activity {
    ...
    private LicenseCheckerCallback licenseCheckerCallback;
    private LicenseChecker checker;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
        // Construct the LicenseCheckerCallback. The library calls this when done.
        licenseCheckerCallback = new MyLicenseCheckerCallback();

        // Construct the LicenseChecker with a Policy.
        checker = new LicenseChecker(
            this, new ServerManagedPolicy(this,
                new AESObfuscator(SALT, getPackageName(), deviceId)),
            BASE64_PUBLIC_KEY // Your public licensing key.
            );
        ...
    }
}

LicenseChecker işlevinin, kullanıcı arayüzünden LicenseCheckerCallback yöntemlerini çağırdığını unutmayın iş parçacığı yalnızca yerel olarak önbelleğe alınmış geçerli lisans yanıtı varsa yapılır. Öğe sunucuya lisans kontrolü gönderilirse geri çağırmaların her zaman ağ hataları için bile kullanabilir.

Lisans kontrolünü başlatmak için checkAccess() komutunu çağırın

Ana etkinliğinizde şunun checkAccess() yöntemine bir çağrı ekleyin: LicenseChecker örneği. Görüşmede LicenseCheckerCallback örneğini kullanabilirsiniz. Herhangi bir özel kullanıcı arayüzü efektleri veya durum yönetimi gibi özellikler, işlevini çağırın.checkAccess() Örneğin, LVL checkAccess(), a doCheck() sarmalayıcı yöntemi:

Kotlin

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        ...
        // Call a wrapper method that initiates the license check
        doCheck()
        ...
    }
    ...
    private fun doCheck() {
        checkLicenseButton.isEnabled = false
        setProgressBarIndeterminateVisibility(true)
        statusText.setText(R.string.checking_license)
        checker.checkAccess(licenseCheckerCallback)
    }

Java

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
        // Call a wrapper method that initiates the license check
        doCheck();
        ...
    }
    ...
    private void doCheck() {
        checkLicenseButton.setEnabled(false);
        setProgressBarIndeterminateVisibility(true);
        statusText.setText(R.string.checking_license);
        checker.checkAccess(licenseCheckerCallback);
    }

Ortak anahtarınızı lisanslama için yerleştirme

Google Play hizmeti, her uygulama için otomatik olarak Bu amaçla kullanılacak 2048 bit RSA ortak/özel anahtar çifti lisanslama ve uygulama içi faturalandırma. Anahtar çifti, bir uygulamadır. Uygulamayla ilişkilendirilmiş olsa da anahtar çifti uygulamalarınızı imzalamak için kullandığınız (veya bundan türetilen) anahtarla aynı değildir.

Google Play Console, lisanslama için ortak anahtarı geliştirici Play Console'da oturum açmış ancak özel anahtarı koruyor . Bir uygulama, lisanslama sunucusunda yayınlanan bir uygulama için lisans kontrolü lisans yanıtını, uygulamanızın anahtar çiftinin özel anahtarını kullanarak imzalar. LVL yanıtı aldığında, "lisans yanıtının imzasını doğrulamanızı" öneririz.

Bir uygulamaya lisanslama eklemek için uygulamanızın ortak anahtarı kullanın ve bunu uygulamanıza kopyalayın. Nasıl bulacağınız aşağıda açıklanmıştır uygulamanızın lisanslama için ortak anahtarı:

  1. Google Play Console'a gidin ve oturum açın. Uygulamayı kullandığınız hesapta oturum açtığınızdan emin olun yayınlandığından (veya yayınlandığında) emin olun.
  2. Uygulama ayrıntıları sayfasında Hizmetler ve API'ler bağlantısını tıklayıp tıklayın.
  3. Hizmetler ve API'ler sayfasındaysa Lisanslama ve Uygulama İçi Faturalandırma bölümüne bakın. için ortak anahtarınız yalnızca Bu Uygulama İçin Lisans Anahtarınız alanına bakın.

Ortak anahtarı uygulamanıza eklemek için anahtar dizesini kopyalayıp yapıştırmanız yeterlidir değerini Dize değişkeninin değeri olarak kullanabilirsiniz. BASE64_PUBLIC_KEY Kopyalama işlemi sırasında Anahtar dizesinin tamamını hiçbir karakter atlamadan seçti.

LVL örnek uygulamasından bir örnek aşağıda verilmiştir:

Kotlin

private const val BASE64_PUBLIC_KEY = "MIIBIjANBgkqhkiG ... " //truncated for this example
class LicensingActivity : AppCompatActivity() {
    ...
}

Java

public class MainActivity extends Activity {
    private static final String BASE64_PUBLIC_KEY = "MIIBIjANBgkqhkiG ... "; //truncated for this example
    ...
}

LicenseChecker'ınızın onDestroy() yöntemini çağırma IPC bağlantılarını kapatmak için

Son olarak, uygulamanızdan önce LVL'nin temizlenmesi için Context değişiklikleri, LicenseChecker adlı kişinin Etkinliğinizden onDestroy() yöntem onDestroy() uygulaması. Çağrı, Google Play'e yönelik açık IPC bağlantılarını düzgün şekilde kapatmak için LicenseChecker uygulamanın ILicensingService'i kullanır ve hizmete yapılan yerel referansları kaldırır anlamına gelir.

LicenseChecker işlevinin onDestroy() yöntemi çağrılamıyor uygulamanızın yaşam döngüsü boyunca sorunlara yol açabilir. Örneğin, kullanıcı, lisans kontrolü etkinken ekran yönünü değiştirirse Context kaldırıldı. Uygulamanız LicenseChecker IPC bağlantısını düzgün şekilde kapatırsanız uygulamanız kilitlenir yanıt alındığında. Benzer şekilde, kullanıcı uygulamanızdan çıkarsa lisans kontrolü devam ederken, yanıt alındığında, Hizmet bağlantısını kesmek için LicenseChecker kullanıcısının onDestroy() yöntemi.

LVL'ye dahil edilen örnek uygulamadan bir örneği aşağıda bulabilirsiniz. mChecker, LicenseChecker örneğidir:

Kotlin

    override fun onDestroy() {
        super.onDestroy()
        checker.onDestroy()
        ...
    }

Java

    @Override
    protected void onDestroy() {
        super.onDestroy();
        checker.onDestroy();
        ...
    }

LicenseChecker öğesini uzatıyor veya değiştiriyorsanız şunu da aramanız gerekebilir: açık IPC'leri temizlemek için LicenseChecker öğesinin finishCheck() yöntemi bağlantılar.

DeviceLimiter Uygulama

Bazı durumlarda, Policy ile gerçek kullanıcı sayısı cihaz kullanma seçeneği sunar. Bu durum, bir kullanıcının lisanslı bir uygulamayı çok sayıda cihaza taşımaktan ve aynı hesap kimliği altında oturum açmanız gerekir. Ayrıca resmî bir kapanış kullanıcının "paylaşım"dan hesap bilgilerini sağlayarak başvuruyu lisansıyla ilişkili diğer kişiler, daha sonra bu kişiler hesabına erişimi ve uygulamanın lisansına erişmelerini isteyebilir.

LVL, cihaz başına lisanslamayı desteklemek için ve tek bir yöntem beyan eden DeviceLimiter arayüzü allowDeviceAccess(). Bir LicenseValidator bir yanıtı işlerken lisans sunucusundan allowDeviceAccess() çağırarak yanıttan çıkarılan kullanıcı kimliği dizesi.

Cihaz sınırlamasını desteklemek istemiyorsanız hiçbir işlem gerekli: LicenseChecker sınıfı otomatik olarak varsayılan değeri kullanır adı verilen yeni bir uygulama paketidir. Adından da anlaşılacağı gibi NullDeviceLimiter "işlemsiz"dir allowDeviceAccess() yöntemi basit bir şekilde döndürülen sınıf Tüm kullanıcılar ve cihazlar için LICENSED yanıtı.

Dikkat: Cihaz başına lisanslama, şunlar için önerilmez: çoğu uygulamanın sebebi:

  • Kullanıcıları ve cihazları yönetmek için arka uç sunucusu sağlamanız gerekir gibi pek çok
  • Bu yanlışlıkla, kullanıcının bir başka bir cihazda meşru olarak satın aldıkları uygulamaları ifade eder.

Kodunuzu Gizleme

Uygulamanızın güvenliğini sağlamak için, özellikle ücretli lisanslama ve/veya özel kısıtlamalar ve korumalar kullanan uygulama kodunuzu karartmanız çok önemlidir. kodu, kötü amaçlı bir kullanıcının, uygulamanın (örneğin lisans kontrolünü kaldırarak) veya bayt kodunu, ve sonra yeniden derleyin.

Android uygulamaları için, aşağıdakiler de dahil olmak üzere çeşitli kod karartıcı programları vardır: ProGuard gibi çeşitli araçlar sunar. özellikleri hakkında daha fazla bilgi edinin. Kod karartmak için ProGuard veya benzer bir programın kullanılması Google ürünlerini kullanan tüm uygulamalar için kodunuz kesinlikle önerilir Play Lisansları.

Lisanslı Uygulama Yayınlama

Lisans uygulamanızı test etmeyi tamamladığınızda, uygulamayı Google Play'de yayınlayabilirsiniz. Uygulamayı hazırlamak, imzalamak ve ardından uygulamayı yayınlamak için normal adımları uygulayın.

Nereden Destek Alabilirsiniz?

Uygulama veya dağıtım yaparken sorularınız olursa ya da sorun yaşarsanız kullanıyorsanız lütfen şurada listelenen destek kaynaklarını kullanın: aşağıdaki tabloya bakın. Sorgularınızı doğru foruma yönlendirerek gereken desteği hızlıca sağlayabilirsiniz.

Tablo 2. Geliştirici destek kaynakları Google Play Lisanslama Hizmeti için.

Destek Türü Kaynak Konu Aralığı
Geliştirme ve testlerle ilgili sorunlar Google Grupları: android-developers LVL indirme ve entegrasyonu, kitaplık projeleri, Policy sorular, kullanıcı deneyimi fikirleri, yanıtların ele alınması, Obfuscator, IPC, test ortam kurulumu
Yığın Taşması: http://stackoverflow.com/questions/Tagging/android
Hesaplar, yayınlama ve dağıtım sorunları Google Play Yardım Forumu Yayıncı hesapları, lisanslama anahtarı çifti, test hesapları, sunucu yanıtlar, test yanıtları, uygulama dağıtımı ve sonuçlar
Pazar Lisanslama Desteği ile ilgili SSS
LVL sorunu izleyici Pazar lisanslama proje sorunu izleyicisi Özellikle LVL kaynak kodu sınıflarıyla ilgili hata ve sorun raporları ve arayüz uygulamaları

Yukarıda listelenen gruplarda yayın paylaşma hakkında genel bilgi edinmek için Topluluk Kaynakları bölümüne göz atın sayfasına göz atın.

Ek Kaynaklar

LVL'ye dahil edilen örnek uygulama, Google Etiket Yöneticisi'nin lisans kontrolü başlatmak ve sonucu işlemek için MainActivity sınıf.