Bu kılavuzda, uygulama içi reklamların güncellemelerini yerel kod (C veya C++). Uygulamanızda Kotlin programlama dili veya Java programlama ve dilbilginizin uygulama Unity'yi kullanır.
Yerel SDK'ya genel bakış
Play Core Yerel SDK'sı, Play Core'un bir parçasıdır.
SDK ailesi. Yerel
SDK, sarmalayan bir C başlık dosyası (app_update.h
) içeriyor
AppUpdateManager
Java Play Uygulama İçi Güncelleme Kitaplığı'ndan. Bu başlık dosyası, uygulamanızın şunu yapmasına olanak tanır:
uygulama içi güncellemeler için API'yi doğrudan yerel kodunuzdan çağırın.
Geliştirme ortamınızı ayarlama
İndir Play Core Native SDK
İndirmeden önce aşağıdaki şartlar ve koşulları kabul etmeniz gerekir.
Hükümler ve Koşullar
Last modified: September 24, 2020- By using the Play Core Software Development Kit, you agree to these terms in addition to the Google APIs Terms of Service ("API ToS"). If these terms are ever in conflict, these terms will take precedence over the API ToS. Please read these terms and the API ToS carefully.
- For purposes of these terms, "APIs" means Google's APIs, other developer services, and associated software, including any Redistributable Code.
- “Redistributable Code” means Google-provided object code or header files that call the APIs.
- Subject to these terms and the terms of the API ToS, you may copy and distribute Redistributable Code solely for inclusion as part of your API Client. Google and its licensors own all right, title and interest, including any and all intellectual property and other proprietary rights, in and to Redistributable Code. You will not modify, translate, or create derivative works of Redistributable Code.
- Google may make changes to these terms at any time with notice and the opportunity to decline further use of the Play Core Software Development Kit. Google will post notice of modifications to the terms at https://developer.android.com/guide/playcore/license. Changes will not be retroactive.
Aşağıdakilerden birini yapın:
- Android Studio'nun 4.0 veya sonraki bir sürümünü yükleyin. SDK'yı kullanma Android SDK Platformu 10.0 (API düzeyi 29) sürümünü yüklemek için Yönetici kullanıcı arayüzü.
- Android SDK komut satırı araçlarını yükleme
ve yüklemek için
sdkmanager
'ı kullanın Android SDK Platform 10.0 sürümü (API düzeyi 29).
Şunu kullanarak Android Studio'yu yerel geliştirme için hazırlayın: En yeni sürümü yüklemek için SDK Yöneticisi CMake ve Android Yerel Geliştirme Kiti (NDK). Daha fazla bilgi için yerel projeler oluşturmayı veya içe aktarmayı öğrenmek için NDK'yı Kullanmaya Başlama.
ZIP dosyasını indirin ve projenizle birlikte çıkarın.
Bağlantıyı İndir Boyut SHA-256 Sağlaması 36 MiB 782a8522d937848c83a715c9a258b95a3ff2879a7cd71855d137b41c00786a5e Uygulamanızın
build.gradle
dosyasını aşağıda gösterildiği gibi güncelleyin:Eski
// App build.gradle plugins { id 'com.android.application' } // Define a path to the extracted Play Core SDK files. // If using a relative path, wrap it with file() since CMake requires absolute paths. def playcoreDir = file('../path/to/playcore-native-sdk') android { defaultConfig { ... externalNativeBuild { cmake { // Define the PLAYCORE_LOCATION directive. arguments "-DANDROID_STL=c++_static", "-DPLAYCORE_LOCATION=$playcoreDir" } } ndk { // Skip deprecated ABIs. Only required when using NDK 16 or earlier. abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64' } } buildTypes { release { // Include Play Core Library proguard config files to strip unused code while retaining the Java symbols needed for JNI. proguardFile '$playcoreDir/proguard/common.pgcfg' proguardFile '$playcoreDir/proguard/gms_task.pgcfg' proguardFile '$playcoreDir/proguard/per-feature-proguard-files' ... } debug { ... } } externalNativeBuild { cmake { path 'src/main/CMakeLists.txt' } } } dependencies { // Import these feature-specific AARs for each Google Play Core library. implementation 'com.google.android.play:app-update:2.1.0' implementation 'com.google.android.play:asset-delivery:2.2.2' implementation 'com.google.android.play:integrity:1.4.0' implementation 'com.google.android.play:review:2.0.1' // Import these common dependencies. implementation 'com.google.android.gms:play-services-tasks:18.0.2' implementation files("$playcoreDir/playcore-native-metadata.jar") ... }
Kotlin
// App build.gradle plugins { id("com.android.application") } // Define a path to the extracted Play Core SDK files. // If using a relative path, wrap it with file() since CMake requires absolute paths. val playcoreDir = file("../path/to/playcore-native-sdk") android { defaultConfig { ... externalNativeBuild { cmake { // Define the PLAYCORE_LOCATION directive. arguments += listOf("-DANDROID_STL=c++_static", "-DPLAYCORE_LOCATION=$playcoreDir") } } ndk { // Skip deprecated ABIs. Only required when using NDK 16 or earlier. abiFilters.clear() abiFilters += listOf("armeabi-v7a", "arm64-v8a", "x86", "x86_64") } } buildTypes { release { // Include Play Core Library proguard config files to strip unused code while retaining the Java symbols needed for JNI. proguardFile("$playcoreDir/proguard/common.pgcfg") proguardFile("$playcoreDir/proguard/gms_task.pgcfg") proguardFile("$playcoreDir/proguard/per-feature-proguard-files") ... } debug { ... } } externalNativeBuild { cmake { path = "src/main/CMakeLists.txt" } } } dependencies { // Import these feature-specific AARs for each Google Play Core library. implementation("com.google.android.play:app-update:2.1.0") implementation("com.google.android.play:asset-delivery:2.2.2") implementation("com.google.android.play:integrity:1.4.0") implementation("com.google.android.play:review:2.0.1") // Import these common dependencies. implementation("com.google.android.gms:play-services-tasks:18.0.2") implementation(files("$playcoreDir/playcore-native-metadata.jar")) ... }
Uygulamanızın
CMakeLists.txt
dosyalarını aşağıda gösterildiği gibi güncelleyin:cmake_minimum_required(VERSION 3.6) ... # Add a static library called “playcore” built with the c++_static STL. include(${PLAYCORE_LOCATION}/playcore.cmake) add_playcore_static_library() // In this example “main” is your native code library, i.e. libmain.so. add_library(main SHARED ...) target_include_directories(main PRIVATE ${PLAYCORE_LOCATION}/include ...) target_link_libraries(main android playcore ...)
Veri Toplama
Play Core Yerel SDK'sı, Google'ın şunları yapmasına izin vermek için sürümle ilgili verileri toplayabilir: Aşağıdakiler dahil olmak üzere ürünü iyileştirmek için:
- Uygulamanın paket adı
- Uygulamanın paket sürümü
- Play Core Yerel SDK sürümü
Bu veriler, uygulama paketinizi yüklediğinizde toplanır.
Play Console'a yükleyebilirsiniz. Bu veri toplama işlemini devre dışı bırakmak için
Build.gradle dosyasında $playcoreDir/playcore-native-metadata.jar
içe aktarması yapın.
Bu veri toplama işlemi, Play Core Yerel SDK ve Google'ın toplanan verileri kullanımı Google'ın uygulamanızı yüklediğinizde Gradle'da tanımlanan kitaplık bağımlılıkları koleksiyonu Play Console'a geri yükleyebilirsiniz.
Play Core Yerel SDK'sını projenize entegre ettikten sonra API çağrıları içeren dosyalarda aşağıdaki satırı ekleyin:
#include "play/app_update.h"
Uygulama içi güncelleme API'sini başlatma
Uygulama içi güncelleme API'sini her kullanışınızda ilk olarak
AppUpdateManager_init()
aşağıdaki örnekte gösterildiği gibi,
android_native_app_glue.h
:
void android_main(android_app* app) {
app->onInputEvent = HandleInputEvent;
AppUpdateErrorCode error_code =
AppUpdateManager_init(app->activity->vm, app->activity->clazz);
if (error_code == APP_UPDATE_NO_ERROR) {
// You can use the API.
}
}
Güncelleme kullanılabilirliğini kontrol etme
Güncelleme isteğinde bulunmadan önce
uygulamasını indirin.
AppUpdateManager_requestInfo()
lansmanını yapmak için gereken bilgileri toplayan, eş zamansız bir istek başlatır
daha sonra tekrar kontrol edebilirsiniz. APP_UPDATE_NO_ERROR
isteği başarıyla başlatılır.
AppUpdateErrorCode error_code = AppUpdateManager_requestInfo()
if (error_code == APP_UPDATE_NO_ERROR) {
// The request has successfully started, check the result using
// AppUpdateManager_getInfo.
}
Devam eden süreci ve isteğin sonucunu
AppUpdateManager_getInfo()
.
Bu işlev, hata koduna ek olarak,
AppUpdateInfo
güncelleme hakkında bilgi almak için kullanabileceğiniz opaque struct:
isteği gönderin. Örneğin, her oyun döngüsünde bu işlevi
info
için null olmayan bir sonuç döndürene kadar devam eder:
AppUpdateInfo* info;
GameUpdate() {
// Keep calling this in every game loop until info != nullptr
AppUpdateErrorCode error_code = AppUpdateManager_getInfo(&info);
if (error_code == APP_UPDATE_NO_ERROR && info != nullptr) {
// Successfully started, check the result in the following functions
}
...
}
Güncelleme eskiliğini kontrol etme
Bir güncelleme olup olmadığını kontrol etmenin yanı sıra, kullanıcıya bir güncellemenin bildirilmesinden bu yana ne kadar süre geçtiğini kontrol etme Play Store üzerinden satın alabilirsiniz. Bu, bir risk yönetimi planı başlatmanız gerekip gerekmediğine Esnek güncelleme veya anında güncelleme. Örneğin, proje ekibinin Kullanıcıya esnek bir güncellemeyle bildirmeden önce ve bunun ardından birkaç gün ve hemen bir güncelleme gerektirmeden çalışır.
Tekliflerinizi otomatikleştirmek ve optimize etmek için
AppUpdateInfo_getClientVersionStalenessDays()
güncellemenin Play üzerinden kullanıma sunulmasından bu yana geçen gün sayısını kontrol etmek için
Sakla:
int32_t staleness_days = AppUpdateInfo_getClientVersionStalenessDays(info);
Güncelleme önceliğini kontrol edin
Google Play Developer API, her güncellemenin önceliğini belirlemenize olanak tanır. Bu, uygulamanızın kullanıcıya ne kadar önemli bir güncelleme önereceğine karar vermesine olanak tanır. Örneğin, güncelleme önceliğini ayarlamak için aşağıdaki stratejiyi göz önünde bulundurun:
- Kullanıcı arayüzünde küçük iyileştirmeler: Düşük öncelikli güncelleme; ne esnek ne de veya hemen bir güncelleme olması gerekir. Yalnızca kullanıcı etkileşim kurmadığında güncelle nasıl sağlayabileceğini de öğreneceksiniz.
- Performans iyileştirmeleri: Orta öncelikli güncelleme; esnek bir şekilde güncelleyin.
- Kritik güvenlik güncellemesi: Yüksek öncelikli güncelleme; derhal istekte bulunma güncelleyin.
Google Play, önceliği belirlemek için 0 ile 5 arasında bir tam sayı değeri (0) kullanır
5 en yüksek önceliğe sahiptir. Bir
güncellemek için inAppUpdatePriority
alanını kullanın
Edits.tracks.releases
inceleyebilirsiniz. Bu sürüme eklenen tüm yeni sürümler
yayınla aynı önceliğe sahip olduğunu kabul eder. Öncelik yalnızca şu durumlarda ayarlanabilir:
ve daha sonra değiştirilemez.
Önceliği Google Play Geliştirici API'sini kullanarak Play
Geliştirici API'sı
dokümanlarına göz atın.
Şurada uygulama içi güncelleme önceliğini belirtin:
Edit.tracks
kaynak
Edit.tracks: update
yöntemidir. Aşağıdaki örnekte, bir uygulamanın sürüm koduyla yayınlanması gösterilmektedir
88 ve inAppUpdatePriority
5:
{ "releases": [{ "versionCodes": ["88"], "inAppUpdatePriority": 5, "status": "completed" }] }
Uygulamanızın kodunda, belirli bir güncellemenin öncelik düzeyini kontrol etmek için aşağıdakileri kullanabilirsiniz:
AppUpdateInfo_getPriority()
:
int32_t priority = AppUpdateInfo_getPriority(info);
Güncelleme başlatın
Bir güncellemenin olduğunu onayladıktan sonra, şunu kullanarak güncelleme isteğinde bulunabilirsiniz:
AppUpdateManager_requestStartUpdate()
.
Güncelleme isteğinde bulunmadan önce güncel bir AppUpdateInfo
nesnesini alın ve
oluştur
AppUpdateOptions
nesnesini tanımlayın. AppUpdateOptions
nesnesi,
uygulama içi güncelleme akışı seçenekleri de dahil olmak üzere
veya ihtiyaca anında cevap verir.
Aşağıdaki örnek, esnek bir güncelleme için bir AppUpdateOptions
nesnesi oluşturur
akış:
// Creates an AppUpdateOptions configuring a flexible in-app update flow.
AppUpdateOptions* options;
AppUpdateErrorCode error_code = AppUpdateOptions_createOptions(APP_UPDATE_TYPE_FLEXIBLE, &options);
Aşağıdaki örnekte, hemen kullanmak için bir AppUpdateOptions
nesnesi
güncelleme akışı:
// Creates an AppUpdateOptions configuring an immediate in-app update flow.
AppUpdateOptions* options;
AppUpdateErrorCode error_code = AppUpdateOptions_createOptions(APP_UPDATE_TYPE_IMMEDIATE, &options);
AppUpdateOptions
nesnesi ayrıca bir AllowAssetPackDeletion
alanı içeriyor
güncellemenin öğe silmesine izin verilip verilmediğini tanımlayan
paketlerini kullanıma sunmaya dikkat edin. Bu
alanı varsayılan olarak false
değerine ayarlanır, ancak
AppUpdateOptions_setAssetPackDeletionAllowed()
yöntemini kullanarak bunu true
olarak ayarlayın:
bool allow = true;
AppUpdateErrorCode error_code = AppUpdateOptions_setAssetPackDeletionAllowed(options, allow);
Güncel bir AppUpdateInfo
nesneniz ve uygun şekilde yapılandırılmış bir öğeniz olduğunda
AppUpdateOptions
nesnesi, için AppUpdateManager_requestStartUpdate()
öğesini çağırın
bir Android Etkinliği jobject
ileterek eşzamansız olarak güncelleme akışı isteğinde bulunma
nihai parametre için.
AppUpdateErrorCode request_error_code =
AppUpdateManager_requestStartUpdate(info, options, app->activity->clazz);
Kaynakları yer açmak için AppUpdateInfo
ve
Artık ihtiyacınız olmayan AppUpdateOptions
numaralı telefonu arayarak
AppUpdateInfo_destroy()
ve
AppUpdateOptions_destroy()
,
tıklayın.
AppUpdateInfo_destroy(info);
AppUpdateOptions_destroy(options);
Google Play, anında güncelleme akışı için bir kullanıcı onay sayfası gösterir. Kullanıcı isteği kabul ettiğinde Google Play otomatik olarak indirme işlemini ve Güncellemeyi ön planda yükler, ardından uygulamayı güncellenmiş sürümünü de yükleyebilirsiniz.
Esnek güncelleme akışı için güncel AppUpdateInfo
isteğinde bulunmaya devam edebilirsiniz.
kullanıcı güncelleme işlemine devam ederken geçerli güncelleme
uygulamayla etkileşim kurabilir. İndirme işlemi başarıyla tamamlandıktan sonra
öğesini çağırarak güncellemenin tamamlanmasını tetiklemek
AppUpdateManager_requestCompleteUpdate()
,
aşağıdaki örnekte gösterildiği gibi:
AppUpdateStatus status = AppUpdateInfo_getStatus(info);
if (status == APP_UPDATE_DOWNLOADED) {
AppUpdateErrorCode error_code = AppUpdateManager_requestCompleteUpdate();
if (error_code != APP_UPDATE_NO_ERROR)
{
// There was an error while completing the update flow.
}
}
Şu numarayı arayarak kaynakları serbest bırakın:
AppUpdateManager_destroy()
işlevini kullanın.
Hata işleme
Bu bölümde, belirli yapılandırmalar tarafından belirtilen yaygın hataların çözümleri
AppUpdateErrorCode
değerleri:
-110, APP_UPDATE_INITIALIZATION_NEEDED
hata kodu, API başarıyla başlatılamadı.AppUpdateManager_init()
numaralı telefonu arayın: API'yi başlatın.-4, APP_UPDATE_INVALID_REQUEST
hata kodu, bazı durumlarda güncelleme akışı isteğinin parametreleri hatalı biçimlendirilmiş. Kontrol ederekAppUpdateInfo
veAppUpdateOptions
nesneleri boş değil ve doğru biçimlendirilmiş olmalıdır.-5, APP_UPDATE_UNAVAILABLE
hata kodu, geçerli güncelleme mevcut. Hedef sürümün paket adı, uygulama kimliğini, ve imzalama anahtarı. Güncelleme varsa uygulamanın önbelleğini temizleyin veAppUpdateManager_requestAppUpdateInfo()
öğesini tekrar çağırarak sayfayı yenileAppUpdateInfo
.-6, APP_UPDATE_NOT_ALLOWED
hata kodu, güncelleme türünü belirtir öğesi ile belirtilenAppUpdateOption
nesnesine izin verilmiyor. DoğrulamanınAppUpdateInfo
nesnesi, güncelleme türüne güncelleme akışını başlatın.
Sonraki adımlar
Uygulamanızın uygulama içi güncellemelerini test ederek entegrasyonunuzun düzgün çalıştığını doğrulayın.