Özellik modülleri, belirli özellik ve kaynakları ayırmanızı sağlar. uygulamanızın temel modülünden alıp bunları uygulama paketinize dahil edin. Şunun üzerinden: Örneğin, kullanıcılar Play Feature Delivery aracını daha sonra indirip yükleyebilirler uygulamanızın temel APK'sını yükledikten sonra isteğe bağlı bileşen bileşenlerini etkinleştirebilir.
Örneğin, çeşitli özellikler içeren bir kısa mesaj uygulaması resimli mesaj yakalıyor ve gönderiyor, ancak kullanıcıların yalnızca küçük bir kısmı resimli mesajlar gönderin. Resimli mesajlaşmayı mesaj kısmına modülü indirebilirsiniz. Bu şekilde ilk uygulama indirmesi tüm kullanıcılar için daha küçüktür ve yalnızca resimli mesaj gönderen o ek bileşeni indirin.
Bu tür modülerleştirmenin daha fazla çaba gerektirdiğini ve mümkünse uygulamanızın mevcut kodunu yeniden düzenleyin. Bu nedenle, hangi uygulamanızın en çok talep üzerine kullanıcılara sunulmasından yararlanılacak. İsteğe bağlı özelliklerle ilgili ideal kullanım alanlarını ve kuralları daha iyi anlamak için İsteğe bağlı teslimat için kullanıcı deneyimi en iyi uygulamaları başlıklı makaleyi okuyun.
Uygulama özelliklerini zaman içinde kademeli olarak modülerleştirmek istiyorsanız gelişmiş yayın seçeneklerini (ör. istek üzerine yayınlama) etkinleştirerek yükleme sırasında teslimi yapılandırmanız gerekir.
Bu sayfa, uygulama projenize bir özellik modülü eklemenize ve isteğe bağlı yayın için yapılandırabilirsiniz. Başlamadan önce Android Studio 3.5 veya sonraki bir sürümü ve Android Gradle Eklentisi 3.5.0 sürümünü kullanarak veya daha yüksek olabilir.
İsteğe bağlı yayınlama için yeni bir modül yapılandırma
Yeni bir özellik modülü oluşturmanın en kolay yolu Android Studio 3.5 veya sonraki sürümler. Çünkü özellik modüllerinde bir bağımlılığı vardır. Bunları yalnızca mevcut uygulama projeleri de kullanabilirsiniz.
Android Studio'yu kullanarak uygulama projenize bir özellik modülü eklemek için: şu şekilde devam edin:
- Henüz yapmadıysanız uygulama projenizi IDE'de açın.
- Dosya > Yeni > Yeni Modül'ü seçin.
- Yeni Modül Oluştur iletişim kutusunda Dinamik Özellik Modülü'nü seçin ve İleri'yi tıklayın.
- Yeni modülünüzü yapılandırın bölümünde,
takip etmek için:
- Şuradan uygulama projeniz için Temel uygulama modülü'nü seçin: tıklayın.
- Modül adı belirtin. IDE,
modülünü kullanarak
Gradle ayarları dosyası. Google Takvim widget'ını
uygulama paketinizi derlerseniz Gradle, alt projenin son öğesini kullanır
<manifest split>
özelliğini özellik modülünün manifest dosyasını inceleyin. - Modülün paket adını belirtin. Varsayılan olarak Android Studio kök paket adını birleştiren bir paket adı önerir önceki adımda belirttiğiniz temel modül ve modül adı.
- Modülün desteklemesini istediğiniz Minimum API düzeyini seçin. Bu değer, temel modülün değeriyle eşleşmelidir.
- İleri'yi tıklayın.
Modül İndirme Seçenekleri bölümünde aşağıdakileri tamamlayın:
En fazla 50 karakter kullanarak Modül başlığı'nı belirtin. Platform bu başlığı, örneğin aşağıdaki durumlarda modülü kullanıcılara tanıtmak için kullanır: Kullanıcının modülü indirmek isteyip istemediğini teyit eder. Bunun için uygulamanızın temel modülünün, dize kaynağı çok iyi olur. Android Studio kullanarak modülü oluştururken IDE dize kaynağını sizin için temel modüle ekler ve özellik modülünün manifest dosyasına aşağıdaki giriş eklendi:
<dist:module ... dist:title="@string/feature_title"> </dist:module>
Yükleme süresine dahil etme altındaki açılır menüden Yükleme zamanına dahil etme modülü ekleyin. Android Studio, aşağıdaki adımları uygulayın:
<dist:module ... > <dist:delivery> <dist:on-demand/> </dist:delivery> </dist:module>
Bu modülün kullanılabilir olmasını istiyorsanız Birleştirme seçeneğinin yanındaki kutuyu işaretleyin ve sonraki sürümleri çalıştıran ve Android 4.4 (API düzeyi 20) ve önceki sürümleri çalıştıran çoklu APK'lar. Yani, bu modül için isteğe bağlı davranışı etkinleştirebilirsiniz. özelliğini desteklemeyen cihazlardan hariç tutmak için birleştirmeyi devre dışı bırakın. bölünmüş APK'ları indirip yükleme. Android Studio, aşağıdaki adımları uygulayın:
<dist:module ...> <dist:fusing dist:include="true | false" /> </dist:module>
Son'u tıklayın.
Android Studio, modülünüzü oluşturmayı tamamladıktan sonra içeriğini inceleyin Proje bölmesinden kendiniz de yapabilirsiniz (Görünüm > Araç Pencereleri > Proje'yi seçin) ). Varsayılan kod, kaynaklar ve kuruluş çok benzerdir.
Ardından, Play Feature Delivery kitaplığını kullanarak isteğe bağlı yükleme işlevini uygulamanız gerekir.
Play Feature Delivery Kitaplığı'nı projenize dahil etme
Başlamadan önce şunları yapmanız gerekir: Play Feature Delivery kitaplığını projenize ekleyin.
İsteğe bağlı modül isteme
Uygulamanızın bir özellik modülü kullanması gerektiğinde, aynı zamanda bir özellik modülü isteyebilir
ön planda olduğu için
SplitInstallManager
sınıfını kullanır. Oluştururken
isteğinde bulunduğunuzda, uygulamanızın
Hedef modülün manifest dosyasında split
öğesi. Google Takvim widget'ını
özellik modülü oluşturma
kullanan derleme sistemi, sağladığınız Modül adı değerini kullanır.
özelliğini ekleyin.
Daha fazla bilgi için
özellik modülü manifestlerini inceleyin.
Örneğin, isteğe bağlı modülü olan bir uygulama olduğunu düşünelim.
cihazın kamerasını kullanarak resimli mesajlar gönderebilir ve bu isteğe bağlı modülü
manifest dosyasında split="pictureMessages"
öğesini belirtir. İlgili içeriği oluşturmak için kullanılan
aşağıdaki örnekte, pictureMessages
isteğinde bulunmak için SplitInstallManager
kullanılmıştır
modülünü kullanabilirsiniz (bazı promosyon filtreleri için ek bir modülle birlikte):
Kotlin
// Creates an instance of SplitInstallManager. val splitInstallManager = SplitInstallManagerFactory.create(context) // Creates a request to install a module. val request = SplitInstallRequest .newBuilder() // You can download multiple on demand modules per // request by invoking the following method for each // module you want to install. .addModule("pictureMessages") .addModule("promotionalFilters") .build() splitInstallManager // Submits the request to install the module through the // asynchronous startInstall() task. Your app needs to be // in the foreground to submit the request. .startInstall(request) // You should also be able to gracefully handle // request state changes and errors. To learn more, go to // the section about how to Monitor the request state. .addOnSuccessListener { sessionId -> ... } .addOnFailureListener { exception -> ... }
Java
// Creates an instance of SplitInstallManager. SplitInstallManager splitInstallManager = SplitInstallManagerFactory.create(context); // Creates a request to install a module. SplitInstallRequest request = SplitInstallRequest .newBuilder() // You can download multiple on demand modules per // request by invoking the following method for each // module you want to install. .addModule("pictureMessages") .addModule("promotionalFilters") .build(); splitInstallManager // Submits the request to install the module through the // asynchronous startInstall() task. Your app needs to be // in the foreground to submit the request. .startInstall(request) // You should also be able to gracefully handle // request state changes and errors. To learn more, go to // the section about how to Monitor the request state. .addOnSuccessListener(sessionId -> { ... }) .addOnFailureListener(exception -> { ... });
Uygulamanız isteğe bağlı modül istediğinde Play Özellik Yayınlama Kitaplığı zaman çizelgesine sadık kalmak konusunda faydalı olabilir. Diğer bir deyişle, modülünü platforma yükleyebilir, ancak yükleme işleminin başarılı oldu. Kullanıcı yolculuğunu bu tarihten sonra veya hataları incelikle ele almak için isteği durum.
Not: İsterseniz yeni bir özellik modülü ekleyebilirsiniz. API modülün zaten hazır olduğunu tespit etmesi durumunda isteği anında tamamlanmış olarak kabul eder yüklendi. Ayrıca Google Play, yüklenen modüllerin her zaman otomatik olarak oluşturur. Yani uygulama paketinizin yeni bir sürümünü yüklediğinizde platform, uygulamanıza ait yüklü tüm APK'ları günceller. Daha fazla bilgi için Uygulama güncellemelerini yönetin.
Modülün kod ve kaynaklarına erişmek için uygulamanızın şunları yapması gerekir: SplitCompat'u etkinleştirebilirsiniz. SplitCompat’ın Android Hazır Uygulamalar için gereklidir.
İsteğe bağlı modüllerin yüklenmesini erteleme
Uygulamanızın isteğe bağlı bir uygulamayı hemen indirip yüklemesi gerekmiyorsa modülünü kullanarak, yükleme işlemini uygulama arka plandayken erteleyebilirsiniz. Örneğin, Örneğin, daha sonra yapılacak bir tanıtım için bazı tanıtım materyallerini en iyi şekilde yararlanabilirsiniz.
Daha sonra indirilecek bir modülü belirtebilirsiniz.
deferredInstall()
yöntemini çağırın. Ayrıca,
SplitInstallManager.startInstall()
bir istek başlatmak için uygulamanızın ön planda olması gerekmez.
ertelenmiş yükleme.
Kotlin
// Requests an on demand module to be downloaded when the app enters // the background. You can specify more than one module at a time. splitInstallManager.deferredInstall(listOf("promotionalFilters"))
Java
// Requests an on demand module to be downloaded when the app enters // the background. You can specify more than one module at a time. splitInstallManager.deferredInstall(Arrays.asList("promotionalFilters"));
Ertelenen yükleme istekleri en iyi yöntemdir ve bunları izleyemezsiniz
takip edebilirsiniz. Ertelenenler için belirttiğiniz bir modüle erişmeye çalışmadan önce
yükleme işlemini tamamladıktan sonra
modülün yüklendiğinden emin olun. Şu durumda:
modülün hemen kullanılabilir hale getirilmesi gerekir. Bunun yerine
SplitInstallManager.startInstall()
(önceki örnekte gösterildiği gibi)
bölümüne bakın.
İstek durumunu izleme
İlerleme çubuğunu güncelleyebilmek için, sonrasında bir intent etkinleştirin
bir istek hatasını sorunsuzca ele aldığınızda
eşzamansız SplitInstallManager.startInstall()
görevinin durum güncellemeleri.
Yükleme isteğiniz için güncellemeleri almaya başlamadan önce bir
işleyiciyi seçin ve aşağıda gösterildiği gibi isteğin oturum kimliğini alın.
Kotlin
// Initializes a variable to later track the session ID for a given request. var mySessionId = 0 // Creates a listener for request status updates. val listener = SplitInstallStateUpdatedListener { state -> if (state.sessionId() == mySessionId) { // Read the status of the request to handle the state update. } } // Registers the listener. splitInstallManager.registerListener(listener) ... splitInstallManager .startInstall(request) // When the platform accepts your request to download // an on demand module, it binds it to the following session ID. // You use this ID to track further status updates for the request. .addOnSuccessListener { sessionId -> mySessionId = sessionId } // You should also add the following listener to handle any errors // processing the request. .addOnFailureListener { exception -> // Handle request errors. } // When your app no longer requires further updates, unregister the listener. splitInstallManager.unregisterListener(listener)
Java
// Initializes a variable to later track the session ID for a given request. int mySessionId = 0; // Creates a listener for request status updates. SplitInstallStateUpdatedListener listener = state -> { if (state.sessionId() == mySessionId) { // Read the status of the request to handle the state update. } }; // Registers the listener. splitInstallManager.registerListener(listener); ... splitInstallManager .startInstall(request) // When the platform accepts your request to download // an on demand module, it binds it to the following session ID. // You use this ID to track further status updates for the request. .addOnSuccessListener(sessionId -> { mySessionId = sessionId; }) // You should also add the following listener to handle any errors // processing the request. .addOnFailureListener(exception -> { // Handle request errors. }); // When your app no longer requires further updates, unregister the listener. splitInstallManager.unregisterListener(listener);
İstek hatalarını işleme
Özellik modüllerinin isteğe bağlı yüklenmesinin bazen başarısız olabileceğini unutmayın. yükleme işlemi her zaman başarılı olmuyor. Yüklenememenin nedeni olabilir depolama alanının az olması, ağ bağlantısının olmaması veya kullanıcının Google Play Store'da oturum açtınız. Bu durumların nasıl ele alınacağına ilişkin öneriler için yardımcı olmak için, İsteğe bağlı yayınlama için kullanıcı deneyimi yönergeleri.
Kod açısından, modül indirme veya yükleme hataları
aşağıda gösterildiği gibi addOnFailureListener()
kullanılarak:
Kotlin
splitInstallManager .startInstall(request) .addOnFailureListener { exception -> when ((exception as SplitInstallException).errorCode) { SplitInstallErrorCode.NETWORK_ERROR -> { // Display a message that requests the user to establish a // network connection. } SplitInstallErrorCode.ACTIVE_SESSIONS_LIMIT_EXCEEDED -> checkForActiveDownloads() ... } } fun checkForActiveDownloads() { splitInstallManager // Returns a SplitInstallSessionState object for each active session as a List. .sessionStates .addOnCompleteListener { task -> if (task.isSuccessful) { // Check for active sessions. for (state in task.result) { if (state.status() == SplitInstallSessionStatus.DOWNLOADING) { // Cancel the request, or request a deferred installation. } } } } }
Java
splitInstallManager .startInstall(request) .addOnFailureListener(exception -> { switch (((SplitInstallException) exception).getErrorCode()) { case SplitInstallErrorCode.NETWORK_ERROR: // Display a message that requests the user to establish a // network connection. break; case SplitInstallErrorCode.ACTIVE_SESSIONS_LIMIT_EXCEEDED: checkForActiveDownloads(); ... }); void checkForActiveDownloads() { splitInstallManager // Returns a SplitInstallSessionState object for each active session as a List. .getSessionStates() .addOnCompleteListener( task -> { if (task.isSuccessful()) { // Check for active sessions. for (SplitInstallSessionState state : task.getResult()) { if (state.status() == SplitInstallSessionStatus.DOWNLOADING) { // Cancel the request, or request a deferred installation. } } } }); }
Aşağıdaki tabloda, uygulamanızın işlemesi gerekebilecek hata durumları açıklanmaktadır:
Hata kodu | Açıklama | Önerilen işlem |
---|---|---|
ACTIVE_SESSIONS_LIMIT_EXCEEDED | İstek, mevcut en az bir öğe olduğundan reddedildi şu anda indirilmekte olan bir istek. | Gösterilen şekilde, indirilmekte olan istek olup olmadığını kontrol edin yukarıdaki örnekte. |
MODÜL_YOK | Google Play, istenilen modülü bulamıyor: Uygulama, cihaz ve kullanıcının Google Play'inin mevcut yüklü sürümünde hesap. | Kullanıcının modüle erişimi yoksa durumu kendisine bildirin. |
INVALID_REQUEST | Google Play isteği aldı, ancak geçerli değil. | İstekte yer alan bilgilerin doğru olduğunu ve eksiksiz ve doğru olmalıdır. |
SESSION_NOT_FOUND | Belirli bir oturum kimliği için oturum bulunamadı. | Bir isteğin durumunu izlemeye çalışıyorsanız kullanarak, oturum kimliğinin doğru olduğundan emin olun. |
API_KULLANILAMIYOR | Play Feature Delivery kitaplığı mevcut cihazda desteklenmiyor. Yani cihaz, uygulamayı indiremiyor ve yükleyemiyor isteğe bağlı özelliklerden yararlanabilirsiniz. | Android 4.4 (API düzeyi 20) veya önceki sürümleri çalıştıran cihazlarda:
yükleme sırasında
dist:fusing manifest mülkü. Daha fazla bilgi edinmek için
özellik modülü manifestini inceleyin.
|
AĞ_HATASI | Bir ağ hatası nedeniyle istek başarısız oldu. | Kullanıcıdan ağ bağlantısı oluşturmasını iste veya farklı bir ağa geçin. |
ERİŞİM_REDDEDİLDİ | Uygulama, yetersiz izinler nedeniyle isteği kaydedemiyor. | Bu durum genellikle uygulama arka plandayken meydana gelir. Uygulama ön plana döndüğünde isteği denemeye çalış. |
VARSAYILAN_OTURUMUN_İÇİ_UYGUN OLMAYAN | İstek, bu bölümde mevcut bir veya daha fazla modül içeriyor istendi ancak henüz yüklenmedi. | Bunun yerine, ihtiyacınız olan modülleri içermeyen
uygulama zaten istekte bulundu veya şu anda istenen tüm modülleri bekleyin
yükleme işlemini tamamlamayı deneyin.
Hâlihazırda satışa hazır olan bir modül hata vererek çözülmez. |
HİZMET_DIED | İsteği işlemekten sorumlu olan hizmet kullanımdan kaldırıldı. | İsteği yeniden deneyin.
|
YETERSİZ_DEPOLAMA | Cihazda, bu özelliği yüklemek için yeterli depolama alanı yok modülünü kullanabilirsiniz. | Kullanıcıya bunu yüklemek için yeterli depolama alanına sahip olmadığını bildir özelliğini kullanabilirsiniz. |
SPLITCOMPAT_VERIFICATION_ERROR, SPLITCOMPAT_EMULATION_ERROR, SPLITCOMPAT_COPY_ERROR | SplitCompat özellik modülünü yükleyemedi. | Bu hatalar bir sonraki uygulamadan sonra otomatik olarak kendiliğinden çözülür yeniden başlat. |
PLAY_STORE_NOT_FOUND | Play Store uygulaması cihazda yüklü değildir. | Bunu indirmek için Play Store uygulamasının gerektiğini kullanıcıya bildirin özelliğini kullanabilirsiniz. |
UYGULAMA_NOT_OWNED | Uygulama Google Play tarafından yüklenmediğinden bu özellik kullanılamaz indirildi. Bu hata yalnızca ertelenen yüklemelerde ortaya çıkabilir. | Kullanıcının uygulamayı Google Play'den edinmesini istiyorsanız
startInstall() tarafından sağlanan,
kullanıcı onayı. |
INTERNAL_ERROR | Play Store'da dahili bir hata oluştu. | İsteği yeniden deneyin. |
Bir kullanıcı isteğe bağlı modül indirme isteğinde bulunur ve bir hata oluşursa kullanıcıya iki seçenek sunan bir iletişim kutusu görüntüleyebilirsiniz: tekrar (isteği yeniden dener) ve Cancel (İptal, talebi). Daha fazla destek için Yardım bağlantısını da sağlamanız gerekir: kullanıcıları doğrudan Google Play Yardım Merkezi.
Durum güncellemelerini işleme
Bir dinleyiciyi kaydedip isteğiniz için oturum kimliğini kaydettikten sonra,
StateUpdatedListener.onStateUpdate()
kullanılır
kullanın.
Kotlin
override fun onStateUpdate(state : SplitInstallSessionState) { if (state.status() == SplitInstallSessionStatus.FAILED && state.errorCode() == SplitInstallErrorCode.SERVICE_DIED) { // Retry the request. return } if (state.sessionId() == mySessionId) { when (state.status()) { SplitInstallSessionStatus.DOWNLOADING -> { val totalBytes = state.totalBytesToDownload() val progress = state.bytesDownloaded() // Update progress bar. } SplitInstallSessionStatus.INSTALLED -> { // After a module is installed, you can start accessing its content or // fire an intent to start an activity in the installed module. // For other use cases, see access code and resources from installed modules. // If the request is an on demand module for an Android Instant App // running on Android 8.0 (API level 26) or higher, you need to // update the app context using the SplitInstallHelper API. } } } }
Java
@Override public void onStateUpdate(SplitInstallSessionState state) { if (state.status() == SplitInstallSessionStatus.FAILED && state.errorCode() == SplitInstallErrorCode.SERVICE_DIES) { // Retry the request. return; } if (state.sessionId() == mySessionId) { switch (state.status()) { case SplitInstallSessionStatus.DOWNLOADING: int totalBytes = state.totalBytesToDownload(); int progress = state.bytesDownloaded(); // Update progress bar. break; case SplitInstallSessionStatus.INSTALLED: // After a module is installed, you can start accessing its content or // fire an intent to start an activity in the installed module. // For other use cases, see access code and resources from installed modules. // If the request is an on demand module for an Android Instant App // running on Android 8.0 (API level 26) or higher, you need to // update the app context using the SplitInstallHelper API. } } }
Yükleme isteğiniz için olası durumlar aşağıdaki tabloda açıklanmıştır.
İstek durumu | Açıklama | Önerilen işlem |
---|---|---|
BEKLEMEDE | İstek kabul edildi ve indirme işlemi kısa süre içinde başlayacaktır. | İlerleme çubuğu gibi kullanıcı arayüzü bileşenlerini başlatın. kullanıcıya indirmeyle ilgili geri bildirim sağlamak için. |
REQUIRES_USER_CONFIRMATION | İndirme işlemi için kullanıcı onayı gerekiyor. Bu durum genellikle uygulama Google Play | Kullanıcıdan, Google Play'den özellik indirme işlemini onaylamasını isteyin. Daha fazla bilgi edinmek için kullanıcı onayı alma. |
İNDİRME | İndirme işlemi devam ediyor. | İndirme işlemi için bir ilerleme çubuğu sağlarsanız
SplitInstallSessionState.bytesDownloaded()
ve SplitInstallSessionState.totalBytesToDownload()
yöntemlerini inceleyin (bu tablonun yukarısındaki kod örneğine bakın). |
İNDİRİLENLER | Cihaz, modülü indirdi ancak yükleme henüz başlamadı. | Uygulamalar SplitCompat'ı etkinleştirmelidir ve bu durumu görmekten kaçınmalısınız. Bu, özellik modülünün koduna erişebilmek için gereklidir. kaynaklar. |
YÜKLENİYOR | Cihaz şu anda modülü yüklüyor. | İlerleme çubuğunu güncelleyin. Bu eyalet genellikle kısadır. |
YÜKLENDİ | Modül cihazda yüklüdür. | Modüldeki kod ve kaynağa erişim
devam ettirmek için gereklidir.
Modül, Android 8.0 (API düzeyi 26) sürümünde çalışan bir Android Hazır Uygulama için kullanılıyorsa
veya daha yüksek bir değere ulaşmak için |
SIÇTI | İstek, modül şu tarihten önce başarısız oldu: Cihazda yüklü olmalıdır. | Kullanıcıdan isteği yeniden denemesini veya iptal etmesini isteyin. |
İPTAL EDİLİYOR | Cihaz, isteği iptal etme sürecindedir. | Daha fazla bilgi edinmek için yükleme isteğini iptal etme. |
İPTAL EDİLDİ | İstek iptal edildi. |
Kullanıcı onayı alma
Bazı durumlarda Google Play,
indirme isteği. Örneğin, uygulamanız Google tarafından yüklenmediyse
Oynayın veya mobil veri üzerinden büyük bir indirme yapmaya çalışıyorsanız. Böyle durumlarda
isteğin durumu REQUIRES_USER_CONFIRMATION
ve uygulamanızın durumu bildiriyor
indirme işlemine başlamadan önce kullanıcının onayını alması gerekir
isteğe bağlı modüller yükleyebilirsiniz. Onay almak için uygulamanız
kullanıcıya şu şekilde istem gönderin:
Kotlin
override fun onSessionStateUpdate(state: SplitInstallSessionState) { if (state.status() == SplitInstallSessionStatus.REQUIRES_USER_CONFIRMATION) { // Displays a confirmation for the user to confirm the request. splitInstallManager.startConfirmationDialogForResult( state, // an activity result launcher registered via registerForActivityResult activityResultLauncher) } ... }
Java
@Override void onSessionStateUpdate(SplitInstallSessionState state) { if (state.status() == SplitInstallSessionStatus.REQUIRES_USER_CONFIRMATION) { // Displays a confirmation for the user to confirm the request. splitInstallManager.startConfirmationDialogForResult( state, // an activity result launcher registered via registerForActivityResult activityResultLauncher); } ... }
Bir etkinlik sonucu başlatıcıyı yerleşik olarak bulunan
ActivityResultContracts.StartIntentSenderForResult
sözleşme imzalamaz. Etkinlik Sonucu API'leri bölümünü inceleyin.
İsteğin durumu, kullanıcının yanıtına göre güncellenir:
- Kullanıcı onayı kabul ederse istek durumu şu şekilde değişir:
PENDING
ve indirme işlemi devam ediyor. - Kullanıcı onayı reddederse istek durumu
CANCELED
- Kullanıcı, iletişim kutusu silinmeden önce seçim yapmazsa
istek durumu
REQUIRES_USER_CONFIRMATION
olarak kalır. Uygulamanız kullanıcıdan isteği tamamlamasını tekrar isteyebilir.
Kullanıcının yanıtıyla geri arama almak için ActivityResultCallback.
Kotlin
registerForActivityResult(StartIntentSenderForResult()) { result: ActivityResult -> { // Handle the user's decision. For example, if the user selects "Cancel", // you may want to disable certain functionality that depends on the module. } }
Java
registerForActivityResult( new ActivityResultContracts.StartIntentSenderForResult(), new ActivityResultCallback<ActivityResult>() { @Override public void onActivityResult(ActivityResult result) { // Handle the user's decision. For example, if the user selects "Cancel", // you may want to disable certain functionality that depends on the module. } });
Yükleme isteğini iptal etme
Uygulamanızın yüklenmeden önce bir isteği iptal etmesi gerekiyorsa
aşağıda gösterildiği gibi, isteğin oturum kimliğini kullanan cancelInstall()
yöntemini).
Kotlin
splitInstallManager // Cancels the request for the given session ID. .cancelInstall(mySessionId)
Java
splitInstallManager // Cancels the request for the given session ID. .cancelInstall(mySessionId);
Erişim modülleri
İndirildikten sonra, indirilen bir modüldeki koda ve kaynaklara erişmek için: uygulamanızın SplitCompat Kitaplığı hem uygulamanız hem de uygulamanızın özellik modüllerindeki her etkinlik için indirin.
Bununla birlikte, platformda aşağıdakilerin mevcut olduğunu unutmayın. bir süre için (gün, bazı durumlarda, durumlarda)
- Platform, modül tarafından oluşturulan yeni manifest girişlerini uygulayamaz.
- Platform, sistem kullanıcı arayüzü bileşenleri için modül kaynaklarına erişemez. indirme seçeneği de sunulur. Bu tür kaynakları hemen kullanmanız gerekiyorsa uygulamanızın temel modülünde yer alan kaynaklar dahil.
SplitCompat'ı etkinleştir
Uygulamanızın indirilen bir modülden koda ve kaynaklara erişmesi için SplitCompat'u sadece şurada açıklanan yöntemlerden birini kullanarak etkinleştirmeniz gerekir: bu bölümde bulabilirsiniz.
Uygulamanızda SplitCompat'u etkinleştirdikten sonra SplitCompat'u da etkinleştirmeniz gerekir: özellik modüllerinde yer alan uygulamanızın erişmesini istediğiniz.
Manifest dosyasında SplitCompatApplication bildirme
SplitCompat'ı etkinleştirmenin en basit yolu SplitCompatApplication
bildirmektir
içinde Application
alt sınıfı olarak
uygulamanızın manifest dosyası için aşağıdaki gibidir:
<application
...
android:name="com.google.android.play.core.splitcompat.SplitCompatApplication">
</application>
Uygulama bir cihaza yüklendikten sonra otomatik olarak indirmenizi sağlar.
Çalışma zamanında SplitCompat'ı çağır
SplitCompat'ı çalışma zamanında belirli etkinliklerde veya hizmetlerde de etkinleştirebilirsiniz.
SplitCompat'un bu şekilde etkinleştirilmesi,
özellik modüllerinden yararlanın. Bunu yapmak için attachBaseContext
öğesini aşağıda gösterildiği gibi geçersiz kılın.
Özel bir Uygulama sınıfınız varsa
bunun yerine
SplitCompatApplication
(aşağıda gösterildiği gibi) uygulamanızda SplitCompat'u etkinleştirmek için:
Kotlin
class MyApplication : SplitCompatApplication() { ... }
Java
public class MyApplication extends SplitCompatApplication { ... }
SplitCompatApplication
, ContextWrapper.attachBaseContext()
değerini geçersiz kılar
SplitCompat.install(Context applicationContext)
dahil edilecek. Şunu yapmazsanız:
Application
sınıfınızın şu özelliklere sahip olmasını istiyorsunuz:
SplitCompatApplication
süresini uzatırsanız, attachBaseContext()
ayarını geçersiz kılabilirsiniz.
yöntemini manuel olarak kullanabilirsiniz:
Kotlin
override fun attachBaseContext(base: Context) { super.attachBaseContext(base) // Emulates installation of future on demand modules using SplitCompat. SplitCompat.install(this) }
Java
@Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); // Emulates installation of future on demand modules using SplitCompat. SplitCompat.install(this); }
İsteğe bağlı modülünüz uyumluysa SplitCompat'ı hem hazır uygulamalarla hem yüklü uygulamalarla aşağıdaki şekilde şartlı olarak:
Kotlin
override fun attachBaseContext(base: Context) { super.attachBaseContext(base) if (!InstantApps.isInstantApp(this)) { SplitCompat.install(this) } }
Java
@Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); if (!InstantApps.isInstantApp(this)) { SplitCompat.install(this); } }
Modül etkinlikleri için SplitCompat'ı etkinleştir
Temel uygulamanızda SplitCompat'u etkinleştirdikten sonra SplitCompat'ı etkinleştirmeniz gerekir
uygulamanızın bir özellik modülünde indirdiği her etkinlik için Bunun için,
aşağıdaki gibi SplitCompat.installActivity()
yöntemini kullanın:
Kotlin
override fun attachBaseContext(base: Context) { super.attachBaseContext(base) // Emulates installation of on demand modules using SplitCompat. SplitCompat.installActivity(this) }
Java
@Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); // Emulates installation of on demand modules using SplitCompat. SplitCompat.installActivity(this); }
Özellik modüllerinde tanımlanan bileşenlere erişim
Özellik modülünde tanımlanan bir etkinliği başlatma
Özellik modüllerinde tanımlanan etkinlikleri başlatmak için
startActivity()
.
Kotlin
startActivity(Intent() .setClassName("com.package", "com.package.module.MyActivity") .setFlags(...))
Java
startActivity(new Intent() .setClassName("com.package", "com.package.module.MyActivity") .setFlags(...));
setClassName
öğesinin ilk parametresi, uygulamanın paket adı ve
ikinci parametre, etkinliğin tam sınıf adıdır.
İsteğe bağlı olarak indirdiğiniz bir özellik modülünde etkinliğiniz olduğunda etkinlikte SplitCompat'u etkinleştirin.
Özellik modülünde tanımlanan bir hizmeti başlatma
Özellik modüllerinde tanımlanan hizmetleri şunu kullanarak başlatabilirsiniz:
startService()
.
Kotlin
startService(Intent() .setClassName("com.package", "com.package.module.MyService") .setFlags(...))
Java
startService(new Intent() .setClassName("com.package", "com.package.module.MyService") .setFlags(...));
Özellik modülünde tanımlanan bileşeni dışa aktarma
Dışa aktarılan Android bileşenlerini isteğe bağlı modüllere eklememelisiniz.
Derleme sistemi tüm modüllerin manifest girişlerini temel modülle birleştirir; İsteğe bağlı bir modül dışa aktarılmış bir bileşen içeriyorsa bu modül erişilebilir hatta modül yüklenmeden önce bile çalışır ve eksik kod nedeniyle kilitlenmelere neden olabilir başka bir uygulamadan çağrıldığında.
Bu, dahili bileşenler açısından bir sorun değildir; bu kullanıcılara yalnızca sağlar, böylece uygulama erişmeden önce modülün yüklü olup olmadığını kontrol edin olması gerekir.
Dışa aktarılan bir bileşene ihtiyacınız varsa ve içeriğinin isteğe bağlı bir
modülünü kullanıyorsanız bir proxy kalıbı uygulamayı düşünün.
Bunu, temele bir proxy dışa aktarılan bileşeni ekleyerek yapabilirsiniz;
proxy bileşeni, erişilebilir hale gelen modülün varlığını
emin olmanız gerekir. Modül mevcutsa proxy
bileşen, dahili bileşeni bir Intent
aracılığıyla modülden başlatabilir,
amacı arayan uygulamasından aktarmalıdır. Modül mevcut değilse
veya bileşenin modülü indirebileceğini ya da
arayan uygulamasıdır.
Yüklü modüllerden kod ve kaynaklara erişin
Tabanınızda SplitCompat'u etkinleştirirseniz ve özellik modülünüzdeki etkinlikleri öğrenmek için temel APK'nın parçası gibi bir özellik modülündeki kod ve kaynakları, isteğe bağlı modül yüklendikten sonra.
Farklı bir modülden erişim kodu
Temel koda modülden erişme
Temel modülünüzde bulunan kod doğrudan diğer modüller tarafından kullanılabilir. Özel bir şey yapmanız gerekmez. ihtiyacınız olan sınıfları içe aktarın ve kullanın.
Modül koduna başka bir modülden erişin
Bir modül içindeki nesne veya sınıfa başka bir modülden statik olarak erişilemiyor modülünü kullanabilir ancak yansıma yoluyla dolaylı olarak erişilebilir.
Performans maliyetleri nedeniyle bu durumun ne sıklıkta gerçekleşeceğine dikkat etmeniz gerekir çok önemli bir parçasıdır. Karmaşık kullanım alanları için aşağıdakiler gibi bağımlılık yerleştirme çerçeveleri kullanın: Her ekranda tek bir yansıma çağrısı olmasını garanti etmek için Dağ 2'yi tıklayın. faydalı olabilir.
Örneklendirmeden sonra nesneyle kurulan etkileşimleri basitleştirmek için temel modülde bir arayüz tanımlaması ve Google Analytics 4'teki uygulamasını özellik modülüne bakalım. Örneğin:
Kotlin
// In the base module interface MyInterface { fun hello(): String } // In the feature module object MyInterfaceImpl : MyInterface { override fun hello() = "Hello" } // In the base module, where we want to access the feature module code val stringFromModule = (Class.forName("com.package.module.MyInterfaceImpl") .kotlin.objectInstance as MyInterface).hello();
Java
// In the base module public interface MyInterface { String hello(); } // In the feature module public class MyInterfaceImpl implements MyInterface { @Override public String hello() { return "Hello"; } } // In the base module, where we want to access the feature module code String stringFromModule = ((MyInterface) Class.forName("com.package.module.MyInterfaceImpl").getConstructor().newInstance()).hello();
Kaynak ve öğelere farklı bir modülden erişin
Bir modül yüklendikten sonra modülünü standart bir şekilde ekleyebilirsiniz:
- Bir kaynağa farklı bir modülden erişiyorsanız modül erişimi olması gerekir. Ancak kaynak yine de adıyla erişilir. Kaynağa referans vermek için kullanılacak paketin kaynağın tanımlandığı modülün paketidir.
- Yeni yüklenmiş bir modülünü kullanarak uygulamanızın yüklü olduğu farklı bir modülden kullanıyorsanız uygulama bağlamını kullanın. Kaynaklara erişmeye çalışan bileşenin bağlamı henüz güncellenecektir. Alternatif olarak bu bileşeni yeniden oluşturabilirsiniz (örneğin, Activity.recreate()) veya Özellik modülünden sonra SplitCompat'ı yeniden yükleyin teşekkür ederiz.
İsteğe bağlı yayını kullanarak bir uygulamada yerel kod yükleme
Tüm site bağlantılarını yüklemek için ReLinker kullanmanızı öneririz yerel kitaplıklarınızı daha verimli şekilde kullanmanızı sağlar. ReLinker, özellik modülü. ReLinker hakkında daha fazla bilgi için: Android JNI İpuçları.
İsteğe bağlı bir modülden yerel kod yükleme
Split yüklendikten sonra yerel kodunu Yeniden Bağlayıcı. Hazır uygulamalar için bu özel yöntemi kullanmanız gerekir.
Yerel kodunuzu ve yerel kodunuzu yüklemek için System.loadLibrary()
kullanıyorsanız
kitaplığın modülde başka bir kitaplığa bağımlılığı varsa, manuel olarak
diğer kitaplığı yükleyin.
ReLinker kullanıyorsanız eşdeğer işlem
Relinker.recursively().loadLibrary()
Şurada tanımlanmış bir kitaplığı yüklemek için yerel kodda dlopen()
kullanıyorsanız:
isteğe bağlı modül içeren bir sürümle birlikte, göreli kitaplık yollarıyla çalışmaz.
En iyi çözüm, kitaplığın mutlak yolunu Java kodundan almaktır
ClassLoader.findLibrary()
üzerinden gidip dlopen()
görüşmenizde kullanabilirsiniz.
Bunu yerel kodu girmeden önce yapın veya
yerel kodu Java'ya geri yükleyebilirsiniz.
Yüklü Android Hazır Uygulamalarına erişme
Bir Android Hazır Uygulama modülü INSTALLED
olarak raporlandıktan sonra,
yenilenmiş bir uygulama kullanarak kod ve kaynakları
Bağlam. CEVAP
uygulamanızın bir modülü yüklemeden önce oluşturduğu bağlam (örneğin,
öğesi), yeni değişkendeki yeni
modülünü kullanabilirsiniz. Ancak yeni bir bağlam edinilebilir. Örneğin, bilgisayar korsanlığı sayesinde
createPackageContext
.
Kotlin
// Generate a new context as soon as a request for a new module // reports as INSTALLED. override fun onStateUpdate(state: SplitInstallSessionState ) { if (state.sessionId() == mySessionId) { when (state.status()) { ... SplitInstallSessionStatus.INSTALLED -> { val newContext = context.createPackageContext(context.packageName, 0) // If you use AssetManager to access your app’s raw asset files, you’ll need // to generate a new AssetManager instance from the updated context. val am = newContext.assets } } } }
Java
// Generate a new context as soon as a request for a new module // reports as INSTALLED. @Override public void onStateUpdate(SplitInstallSessionState state) { if (state.sessionId() == mySessionId) { switch (state.status()) { ... case SplitInstallSessionStatus.INSTALLED: Context newContext = context.createPackageContext(context.getPackageName(), 0); // If you use AssetManager to access your app’s raw asset files, you’ll need // to generate a new AssetManager instance from the updated context. AssetManager am = newContext.getAssets(); } } }
Android 8.0 ve sonraki sürümlerde Android Hazır Uygulamalar
Android 8.0'da Android Hazır Uygulaması için isteğe bağlı modül isteğinde bulunurken
(API düzeyi 26) ve sonraki sürümlerde, yükleme isteği INSTALLED
olarak raporlandıktan sonra
bir çağrı göndererek uygulamayı yeni modülün bağlamıyla
SplitInstallHelper.updateAppInfo(Context context)
Aksi takdirde, uygulama henüz modülün kodundan haberdar değildir
ve kaynaklar. Uygulamanın meta verilerini güncelledikten sonra modülün
yeni bir ileti dizisi çağırarak bir sonraki ana ileti dizisi etkinliğinde içerik
Aşağıda gösterildiği gibi, Handler
:
Kotlin
override fun onStateUpdate(state: SplitInstallSessionState ) { if (state.sessionId() == mySessionId) { when (state.status()) { ... SplitInstallSessionStatus.INSTALLED -> { // You need to perform the following only for Android Instant Apps // running on Android 8.0 (API level 26) and higher. if (BuildCompat.isAtLeastO()) { // Updates the app’s context with the code and resources of the // installed module. SplitInstallHelper.updateAppInfo(context) Handler().post { // Loads contents from the module using AssetManager val am = context.assets ... } } } } } }
Java
@Override public void onStateUpdate(SplitInstallSessionState state) { if (state.sessionId() == mySessionId) { switch (state.status()) { ... case SplitInstallSessionStatus.INSTALLED: // You need to perform the following only for Android Instant Apps // running on Android 8.0 (API level 26) and higher. if (BuildCompat.isAtLeastO()) { // Updates the app’s context with the code and resources of the // installed module. SplitInstallHelper.updateAppInfo(context); new Handler().post(new Runnable() { @Override public void run() { // Loads contents from the module using AssetManager AssetManager am = context.getAssets(); ... } }); } } } }
C/C++ kitaplıklarını yükleme
Cihazın halihazırda sahip olduğu bir modülden C/C++ kitaplıklarını yüklemek istiyorsanız
indirdikten sonra
SplitInstallHelper.loadLibrary(Context context, String libName)
aşağıdaki gibidir:
Kotlin
override fun onStateUpdate(state: SplitInstallSessionState) { if (state.sessionId() == mySessionId) { when (state.status()) { SplitInstallSessionStatus.INSTALLED -> { // Updates the app’s context as soon as a module is installed. val newContext = context.createPackageContext(context.packageName, 0) // To load C/C++ libraries from an installed module, use the following API // instead of System.load(). SplitInstallHelper.loadLibrary(newContext, “my-cpp-lib”) ... } } } }
Java
public void onStateUpdate(SplitInstallSessionState state) { if (state.sessionId() == mySessionId) { switch (state.status()) { case SplitInstallSessionStatus.INSTALLED: // Updates the app’s context as soon as a module is installed. Context newContext = context.createPackageContext(context.getPackageName(), 0); // To load C/C++ libraries from an installed module, use the following API // instead of System.load(). SplitInstallHelper.loadLibrary(newContext, “my-cpp-lib”); ... } } }
Bilinen sınırlamalar
- Android WebView, içeriğe erişen etkinliklerde kullanılamaz. kaynakları veya öğelerini kullanabilirsiniz. Bunun nedeni uyumsuzluk Android API düzeyi 28 ve önceki sürümlerde WebView ile SplitCompat.
- Android
ApplicationInfo
nesnelerini, içeriklerini veya bunları uygulamanızda içeren nesneler. Bu nesneleri her zaman getirmeniz gerekir gerektiği şekilde ele alalım. Bu tür nesneleri önbelleğe almak uygulamanın kilitlenmesine neden olabilir dikkat edin.
Yüklü modülleri yönetin
Cihazda hangi özellik modüllerinin yüklü olduğunu kontrol etmek için
telefon edebilirsin
SplitInstallManager.getInstalledModules()
Bu işlem, gösterildiği gibi yüklü modüllerin adlarından Set<String>
tanesini döndürür
bölümüne göz atın.
Kotlin
val installedModules: Set<String> = splitInstallManager.installedModules
Java
Set<String> installedModules = splitInstallManager.getInstalledModules();
Modülleri kaldırın
Şu komutu çağırarak cihazdan modülleri kaldırmasını isteyebilirsiniz:
SplitInstallManager.deferredUninstall(List<String> moduleNames)
aşağıda gösterildiği gibidir.
Kotlin
// Specifies two feature modules for deferred uninstall. splitInstallManager.deferredUninstall(listOf("pictureMessages", "promotionalFilters"))
Java
// Specifies two feature modules for deferred uninstall. splitInstallManager.deferredUninstall(Arrays.asList("pictureMessages", "promotionalFilters"));
Modül kaldırma işlemleri hemen gerçekleşmez. Yani,
Cihaz, depolama alanından tasarruf etmek için gerektiğinde bunları arka planda kaldırır.
Cihazda aşağıdaki bilgilerin olduğunu
şunu çağırarak bir modülü sildi:
SplitInstallManager.getInstalledModules()
ve sonucu incelemelisiniz.
Ek dil kaynaklarını indirin
Uygulama paketleriyle, cihazlar yalnızca indirdikleri kod ve kaynakları biraz daha zor olacaktır. Dil kaynakları için bir kullanıcının cihazı yalnızca uygulamanızın şu anda bir veya daha fazla dille eşleşen dil kaynaklarını cihaz ayarlarında seçili olması gerekir.
Uygulamanızın ek dil kaynaklarına erişebilmesini istiyorsanız: Örneğin, uygulama içi dil seçici uygulamak için Play Feature Delivery aracını kullanabilirsiniz Kitaplık'ı tıklayın. Bu süreç, aşağıda gösterildiği gibi bir özellik modülü indirmeniz gerekir.
Kotlin
// Captures the user’s preferred language and persists it // through the app’s SharedPreferences. sharedPrefs.edit().putString(LANGUAGE_SELECTION, "fr").apply() ... // Creates a request to download and install additional language resources. val request = SplitInstallRequest.newBuilder() // Uses the addLanguage() method to include French language resources in the request. // Note that country codes are ignored. That is, if your app // includes resources for “fr-FR” and “fr-CA”, resources for both // country codes are downloaded when requesting resources for "fr". .addLanguage(Locale.forLanguageTag(sharedPrefs.getString(LANGUAGE_SELECTION))) .build() // Submits the request to install the additional language resources. splitInstallManager.startInstall(request)
Java
// Captures the user’s preferred language and persists it // through the app’s SharedPreferences. sharedPrefs.edit().putString(LANGUAGE_SELECTION, "fr").apply(); ... // Creates a request to download and install additional language resources. SplitInstallRequest request = SplitInstallRequest.newBuilder() // Uses the addLanguage() method to include French language resources in the request. // Note that country codes are ignored. That is, if your app // includes resources for “fr-FR” and “fr-CA”, resources for both // country codes are downloaded when requesting resources for "fr". .addLanguage(Locale.forLanguageTag(sharedPrefs.getString(LANGUAGE_SELECTION))) .build(); // Submits the request to install the additional language resources. splitInstallManager.startInstall(request);
İstek, bir özellik modülüne yönelik istek gibi işlenir. Yani, her zaman olduğu gibi istek durumunu izleyebilirsiniz.
Uygulamanız ek dil kaynaklarına hemen ihtiyaç duymuyorsa gösterildiği gibi yükleme işlemini uygulama arka plandayken erteleyebilir bölümüne göz atın.
Kotlin
splitInstallManager.deferredLanguageInstall( Locale.forLanguageTag(sharedPrefs.getString(LANGUAGE_SELECTION)))
Java
splitInstallManager.deferredLanguageInstall( Locale.forLanguageTag(sharedPrefs.getString(LANGUAGE_SELECTION)));
İndirilen dil kaynaklarına erişme
İndirilen dil kaynaklarına erişmek için uygulamanızın
attachBaseContext()
yöntemi içinde SplitCompat.installActivity()
yöntemi
erişim izni gerektiren her etkinlik için aşağıdaki adımları uygulayın.
Kotlin
override fun attachBaseContext(base: Context) { super.attachBaseContext(base) SplitCompat.installActivity(this) }
Java
@Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); SplitCompat.installActivity(this); }
Uygulamanızın indirdiği dil kaynaklarını kullanmak istediğiniz her etkinlik için
temel bağlamı güncelleyin ve
Configuration
:
Kotlin
override fun attachBaseContext(base: Context) { val configuration = Configuration() configuration.setLocale(Locale.forLanguageTag(sharedPrefs.getString(LANGUAGE_SELECTION))) val context = base.createConfigurationContext(configuration) super.attachBaseContext(context) SplitCompat.install(this) }
Java
@Override protected void attachBaseContext(Context base) { Configuration configuration = new Configuration(); configuration.setLocale(Locale.forLanguageTag(sharedPrefs.getString(LANGUAGE_SELECTION))); Context context = base.createConfigurationContext(configuration); super.attachBaseContext(context); SplitCompat.install(this); }
Bu değişikliklerin geçerli olması için etkinliğinizi yeniden oluşturmanız gerekir
Yüklendikten ve kullanıma hazır hale geldikten sonra. URL parametrelerinin Google tarafından nasıl ele alınmasını istediğinizi belirtmek için
Activity#recreate()
yöntemini çağırın.
Kotlin
when (state.status()) { SplitInstallSessionStatus.INSTALLED -> { // Recreates the activity to load resources for the new language // preference. activity.recreate() } ... }
Java
switch (state.status()) { case SplitInstallSessionStatus.INSTALLED: // Recreates the activity to load resources for the new language // preference. activity.recreate(); ... }
Ek dil kaynaklarını kaldırın
Özellik modüllerine benzer şekilde şu adresten ek kaynakları kaldırabilirsiniz: istediğiniz zaman izleyebilirsiniz. Kaldırma isteğinde bulunmadan önce, ilk olarak hangi platformun aşağıdaki gibi yüklenmiştir.
Kotlin
val installedLanguages: Set<String> = splitInstallManager.installedLanguages
Java
Set<String> installedLanguages = splitInstallManager.getInstalledLanguages();
Daha sonra,
deferredLanguageUninstall()
yöntemini çağırın.
Kotlin
splitInstallManager.deferredLanguageUninstall( Locale.forLanguageTag(sharedPrefs.getString(LANGUAGE_SELECTION)))
Java
splitInstallManager.deferredLanguageUninstall( Locale.forLanguageTag(sharedPrefs.getString(LANGUAGE_SELECTION)));
Yerel test modülü yüklemeleri
Play Feature Delivery kitaplığı, uygulamanızın şunları yapma yeteneğini yerel olarak test etmenize olanak tanır: aşağıdaki adımları uygulayın:
- Modül yüklemelerini isteyin ve izleyin.
- Yükleme hatalarını giderme.
SplitCompat
kullanın erişim modülleri.
Bu sayfada, uygulamanızın bölünmüş APK'larını test cihazınıza nasıl dağıtacağınız açıklanmaktadır Google Play Feature Delivery'nin otomatik olarak bu APK'ları kullandığını, ve Play Store'dan modülleri yükleme.
Uygulamanızın mantığında herhangi bir değişiklik yapmanız gerekmese de şunu yapmanız gerekir: aşağıdaki şartları karşılamanız gerekir:
bundletool
uygulamasının son sürümünü indirip yükleyin. Uygulamanızın uygulamanızdan yeni bir yüklenebilir APK grubu oluşturmak içinbundletool
gerekir paket.
APK seti oluşturma
Henüz yapmadıysanız uygulamanızın bölünmüş APK'larını aşağıdaki gibi oluşturun:
- Aşağıdaki yöntemlerden birini kullanarak uygulamanız için bir uygulama paketi oluşturun:
Bir grup oluşturmak için
bundletool
işlevini kullanın Tüm cihazlar için APK'lar yapılandırmaları içerir:bundletool build-apks --local-testing --bundle my_app.aab --output my_app.apks
--local-testing
işareti, APK'larınızdaki meta verileri içerir ortaya çıkardığını
Play Feature Delivery kitaplığının yerel bölünmüş APK'ları kullanmasını sağlar
özellik modüllerini veya uygulamaları Play Store'a bağlanmadan yükleyebilirsiniz.
Uygulamanızı cihaza dağıtma
--local-testing
işaretini kullanarak bir APK grubu oluşturduktan sonra,
Uygulamanızın temel sürümünü yüklemek ve ek aktarım aktarmak için bundletool
uygulamasını kullanın
APK'ları cihazınızın yerel depolama alanına ekler. Her iki işlemi de
şu komutu kullanın:
bundletool install-apks --apks my_app.apks
Uygulamanızı indirip yüklemek için kullanıcı akışını tamamladığınızda
Play Özellik Yayınlama Kitaplığı, bundletool
tarafından sunulan APK'ları
cihazın yerel depolama alanına aktarıldı.
Ağ hatası simülasyonu
Play Store'dan modül yüklemelerini simüle etmek için Play Özellik Yayınlama Kitaplığı
SplitInstallManager
yerine
FakeSplitInstallManager
,
ve modülü isteyin. bundletool
öğesini --local-testing
işaretiyle kullandığınızda
bir APK seti oluşturun ve bunları test cihazınıza dağıtın,
Play Özellik Yayınlama Kitaplığı'na otomatik olarak geçiş yapmasını söyleyen meta veriler içerir
uygulamanızın API çağrıları, FakeSplitInstallManager
SplitInstallManager
.
FakeSplitInstallManager
, aşağıdakileri etkinleştirebileceğiniz bir boole işareti içerir:
Uygulamanız bir sonraki modül yükleme isteğinde bulunduğunda ağ hatası simülasyonu yapın. Alıcı:
testlerinizde FakeSplitInstallManager
adresine erişirseniz bunun bir örneğini alabilirsiniz
her bir arama terimi için
FakeSplitInstallManagerFactory
,
aşağıdaki gibidir:
Kotlin
// Creates an instance of FakeSplitInstallManager with the app's context. val fakeSplitInstallManager = FakeSplitInstallManagerFactory.create(context) // Tells Play Feature Delivery Library to force the next module request to // result in a network error. fakeSplitInstallManager.setShouldNetworkError(true)
Java
// Creates an instance of FakeSplitInstallManager with the app's context. FakeSplitInstallManager fakeSplitInstallManager = FakeSplitInstallManagerFactory.create(context); // Tells Play Feature Delivery Library to force the next module request to // result in a network error. fakeSplitInstallManager.setShouldNetworkError(true);