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:
- Uygulamanızın manifest dosyasına lisanslama iznini ekleyin.
- Politika Uygulama: LVL'de sağlanan eksiksiz uygulamalardan birini seçebilir veya kendi uygulamanızı oluşturabilirsiniz.
Policy
herhangi bir öğeyi önbelleğe alacaksa bir Bilgi Grafiği Uygulama lisans yanıt verileri.- Uygulamanızın ana sayfasında lisansı kontrol etmek için kod ekleme Etkinlik'e dokunun.
- 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:
- 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.
- 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. - 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. - "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:
- takviye değer: Her kod karartma işlemi için (an) kullanılan rastgele bayt dizisi.
- Bir uygulama tanımlayıcısı dizesi (genellikle uygulamanın paket adı).
- 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:
- İçe aktarma işlemleri ekleme
- LisansCheckerCallback'i özel bir iç sınıf olarak uygulayın
- LicenseCheckerCallback'ten UI iş parçacığına yayın yayınlamak için bir işleyici oluştur
- LisansChecker'ı Örneklendirme ve LicenseCheckerCallback
- Lisans kontrolünü başlatmak için checkAccess() komutunu çağırın
- Ortak anahtarınızı lisanslama için yerleştirme
- 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
nesnesinincheckAccess()
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()
vedontAllow()
, 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ğiniPolicy
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()
vedontAllow()
yöntemleri bir "neden" sağlıyor. (Policy
değerlerinden biri,LICENSED
) olabilir.NOT_LICENSED
veyaRETRY
. Özellikle, müşteri hizmetleri temsilcisinin yöntem,dontAllow()
içinRETRY
yanıtını alır ve kullanıcıya bir "Yeniden dene" düğme; sene boyunca hizmetin mevcut olmamasından isteğinde bulunabilirsiniz.
Yukarıdaki şemada, tipik bir lisans denetiminin nasıl gerçekleştiği gösterilmektedir:
- Uygulamanın ana Etkinlikteki kod
LicenseCheckerCallback
örneğini oluşturur veLicenseChecker
nesne içeriyor.LicenseChecker
oluşturulurken kod,Context
, kullanılacak birPolicy
uygulaması ve Yayıncı hesabının parametre olarak lisanslama için ortak anahtarı. - Ardından kod,
checkAccess()
LicenseChecker
nesne algılandı. Yöntemin uygulanması, dönüşüm gerçekleştirmesi içinPolicy
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
. - Öyleyse
- 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
nesnesindeallow()
yöntemi. - Lisans geçerli değilse
Policy
, doğrulayıcıyı bilgilendirir. Bu durumda,LicenseCheckerCallback
üzerindedontAllow()
yöntemi.
- Lisans geçerliyse
- Kurtarılabilir bir yerel veya sunucu hatası durumunda; örneğin, ağ
istek gönderilemiyorsa
LicenseChecker
,RETRY
yanıtını iletirPolicy
nesnenizinprocessServerResponse()
yöntemi.Ayrıca, hem
allow()
hem dedontAllow()
geri çağırma yöntemleri birreason
bağımsız değişkeni.allow()
yönteminin nedeni genelliklePolicy.LICENSED
veyaPolicy.RETRY
,dontAllow()
nedeni ise genelliklePolicy.NOT_LICENSED
veyaPolicy.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. - Bir uygulama hatası olduğunda; örneğin, uygulamanın
geçersiz bir paket adı lisansını kontrol edin.
LicenseChecker
hata veriyor LicenseCheckerCallback'inapplicationError()
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
öğesininPolicy.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:
LicenseCheckerCallback
yöntemleriniz birçok durumda şu cihazdan çağrılır: arka plan ileti dizisi.- 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ılanPolicy
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ı:
- 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.
- Uygulama ayrıntıları sayfasında Hizmetler ve API'ler bağlantısını tıklayıp tıklayın.
- 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.
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.