İsteğe bağlı yayınlamayı yapılandırın

Özellik modülleri, belirli özellikleri ve kaynakları uygulamanızın temel modülünden ayırmanıza ve uygulama paketinize dahil etmenize olanak tanır. Play Feature Delivery sayesinde kullanıcılar, örneğin uygulamanızın temel APK'sını yükledikten sonra bu bileşenleri daha sonra istek üzerine indirip yükleyebilirler.

Örneğin, resimli mesaj çekme ve gönderme işlevi içeren ancak kullanıcıların yalnızca küçük bir yüzdesinin resimli mesaj gönderdiği bir kısa mesajlaşma uygulaması düşünün. Resimli mesajlaşmayı indirilebilir bir özellik modülü olarak eklemek mantıklı olabilir. Bu sayede, ilk uygulama indirme işlemi tüm kullanıcılar için daha küçük olur ve yalnızca resimli mesaj gönderen kullanıcıların bu ek bileşeni indirmesi gerekir.

Bu tür bir modülerleştirmenin daha fazla çaba gerektirdiğini ve muhtemelen uygulamanızın mevcut kodunun yeniden yapılandırılmasını gerektirdiğini unutmayın. Bu nedenle, uygulamanızdaki hangi özelliklerin kullanıcılara isteğe bağlı olarak sunulmasından en çok fayda sağlayacağını dikkatlice düşünün. İsteğe bağlı özelliklerle ilgili en iyi kullanım alanlarını ve kuralları daha iyi anlamak için istek üzerine yayınlama ile ilgili kullanıcı deneyimi en iyi uygulamalarını okuyun.

İsteğe bağlı yayınlama gibi gelişmiş yayınlama seçeneklerini etkinleştirmeden uygulama özelliklerini zaman içinde kademeli olarak modüler hale getirmek istiyorsanız yükleme sırasında yayınlama özelliğini yapılandırın.

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ın 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. Özellik modülleri yapıları gereği temel uygulama modülüne bağımlı olduklarından yalnızca mevcut uygulama projelerine eklenebilirler.

Android Studio'yu kullanarak uygulama projenize özellik modülü eklemek için aşağıdaki adımları uygulayın:

  1. Henüz yapmadıysanız uygulama projenizi IDE'de açın.
  2. Dosya > Yeni > Yeni Modül'ü seçin.
  3. Yeni Modül Oluştur iletişim kutusunda Dinamik Özellik Modülü'nü seçin ve İleri'yi tıklayın.
  4. Yeni modülünüzü yapılandırın bölümünde, takip etmek için:
    1. Şu sayfadan uygulama projeniz için Base application modülü'nü (Temel uygulama modülü) seçin: tıklayın.
    2. Modül adı belirtin. IDE, modülü Gradle ayarlar dosyanızda Gradle alt projesi olarak tanımlamak için bu adı kullanır. 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.
    3. 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ı.
    4. Modülün desteklemesini istediğiniz Minimum API düzeyini seçin. Bu değer, temel modülün değeriyle eşleşmelidir.
  5. İleri'yi tıklayın.
  6. Modül İndirme Seçenekleri bölümünde aşağıdakileri tamamlayın:

    1. 50 karaktere kadar 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'yu kullanarak modülü oluştururken IDE, dize kaynağını temel modüle sizin için ekler ve özellik modülünün manifest dosyasına aşağıdaki girişi ekler:

      <dist:module
          ...
          dist:title="@string/feature_title">
      </dist:module>
      
    2. Yükleme sırasında dahil etme bölümündeki açılır menüden Modülü yükleme sırasında dahil etme'yi seçin. Android Studio, aşağıdaki adımları uygulayın:

      <dist:module ... >
        <dist:delivery>
            <dist:on-demand/>
        </dist:delivery>
      </dist:module>
      
    3. 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, seçiminizi yansıtmak için modülün manifest dosyasına aşağıdakileri ekler:

      <dist:module ...>
          <dist:fusing dist:include="true | false" />
      </dist:module>
      
  7. 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 ekleme

Başlamadan önce projenize Play Feature Delivery Library'yi eklemeniz gerekir.

Talebe bağlı modül isteğinde bulunma

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. Bu 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, cihazın kamerasını kullanarak resim mesajı çekmek ve göndermek için isteğe bağlı bir modülü olan bir uygulamayı düşünün. Bu isteğe bağlı modül, manifest dosyasında split="pictureMessages" değerini 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ı bir modül talep ettiğinde Play Özellik Dağıtımı Kitaplığı "fırlat ve unut" stratejisini kullanır. Diğer bir deyişle, modülünü platforma yükleyebilir, ancak yükleme işleminin başarılı oldu. Sonrasında kullanıcı yolculuğunu veya hataları incelikle ele almak için isteği durum.

Not: Cihazda zaten yüklü olan bir özellik modülü isteyebilirsiniz. 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, bir modül yüklendikten sonra modülü otomatik olarak güncel tutar. Yani, uygulama paketinizin yeni bir sürümünü yüklediğinizde platform, uygulamanıza ait tüm yüklü APK'ları günceller. Daha fazla bilgi için Uygulama güncellemelerini yönetme başlıklı makaleyi okuyun.

Modülün kod ve kaynaklarına erişmek için uygulamanızın şunları yapması gerekir: SplitCompat'u etkinleştirebilirsiniz. Android Hazır Uygulamalar için SplitCompat'in gerekli olmadığını unutmayın.

İsteğe bağlı modüllerin yüklemesini erteleme

Uygulamanızın isteğe bağlı bir modülü hemen indirip yüklemesi gerekmiyorsa yükleme işlemini uygulama arka plandayken gerçekleştirilecek şekilde erteleyebilirsiniz. Örneğin, uygulamanızın daha sonra yapılacak lansmanı için birtakım tanıtım malzemelerini önceden yüklemek isteyebilirsiniz.

Aşağıda gösterildiği gibi deferredInstall() yöntemini kullanarak daha sonra indirilecek bir modül belirtebilirsiniz. Ayrıca, SplitInstallManager.startInstall()'in aksine, uygulamanızın ertelenen yükleme isteği başlatmak için ön planda olması gerekmez.

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 çabayla yapılır ve ilerleme durumlarını takip edemezsiniz. Bu nedenle, ertelenen yükleme için belirttiğiniz bir modüle erişmeye çalışmadan önce modülün yüklü olup olmadığını kontrol etmeniz gerekir. Modülün hemen kullanılabilir olması gerekiyorsa önceki bölümde gösterildiği gibi SplitInstallManager.startInstall() simgesini kullanarak istekte bulunun.

İstek durumunu izleme

İlerleme çubuğunu güncelleyebilmek için şu tarihten sonra intent tetikleyin: bir istek hatasını sorunsuzca ele aldığınızda eşzamansız SplitInstallManager.startInstall() görevinin durum güncellemeleri. Yükleme isteğinizle ilgili güncellemeler almaya başlamadan önce bir dinleyici kaydedin 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ükleme işleminin başarısız olması, cihaz depolama alanının düşük olması, ağ bağlantısı olmaması veya kullanıcının Google Play Store'da oturum açmaması gibi sorunlardan kaynaklanabilir. Bu durumları kullanıcının bakış açısından nasıl ele alacağınızla ilgili öneriler için istediğiniz zaman yayınlama ile ilgili kullanıcı deneyimi yönergelerimize göz atın.

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.
MODULE_UNAVAILABLE 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 kullanıcıyı bilgilendirin.
GEÇERSİZ_İST Google Play isteği aldı ancak istek 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_NOT_AVAILABLE Play Feature Delivery Library, mevcut cihazda desteklenmiyor. Yani cihaz, özellikleri isteğe bağlı olarak indirip yükleyemez. 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.
NETWORK_ERROR İstek, ağ hatası nedeniyle başarısız oldu. Kullanıcıdan ağ bağlantısı kurmasını veya farklı bir ağa geçmesini isteyin.
ACCESS_DENIED Uygulama, yetersiz izinler nedeniyle isteği kaydedemiyor. Bu durum genellikle uygulama arka plandayken gerçekleşir. Uygulama ön plana döndüğünde isteği deneyin.
VARSAYILAN_OTURUMUN_İÇİ_UYGUN OLMAYAN İstek, daha önce istenen ancak henüz yüklenmemiş bir veya daha fazla modül içeriyor. 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.

SplitInstallStateUpdatedListener, bu hata kodunu, FAILED durumunu ve -1 oturum kimliğini içeren bir SplitInstallSessionState alır.

YETERSİZ_DEPOLAMA Cihazınızda özellik modülünü yüklemek için yeterli boş depolama alanı yok. Kullanıcıya bu özelliği yüklemek için yeterli depolama alanı olmadığını bildirin.
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. Kullanıcıya bu özelliği indirmek için Play Store uygulamasının gerekli olduğunu bildirin.
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ı.
DAHİLİ_HATA 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 dinleyici kaydettikten ve isteğinizin oturum kimliğini kaydettikten sonra, aşağıdaki gibi durum değişikliklerini işlemek için StateUpdatedListener.onStateUpdate() 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ı gerekir. 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, indirilen modüllere erişebilmek ve bu durumu görmekten kaçınmak için SplitCompat'i etkinleştirmelidir. Bu, özellik modülünün koduna ve kaynaklarına erişmek için gereklidir.
YÜKLENİYOR Cihaz şu anda modülü yüklüyor. İlerleme çubuğunu güncelleyin. Bu durum genellikle kısa sürer.
YÜKLENDİ Modül cihaza yüklenir. Modüldeki kod ve kaynağa erişim devam ettirmek için gereklidir.

Modül, Android 8.0 (API düzeyi 26) veya sonraki sürümlerde çalışan bir Android Instant App içinse uygulama bileşenlerini yeni modülle güncellemek için splitInstallHelper'ü kullanmanız gerekir.

SIÇTI İstek, modül cihaza yüklenmeden önce başarısız oldu. Kullanıcıdan isteği yeniden denemesini veya iptal etmesini isteyin.
İPTAL EDİYORUM 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ğini yerine getirmeden önce kullanıcı onayı isteyebilir. Örneğin, uygulamanız Google Play tarafından yüklenmemişse veya mobil veri üzerinden büyük bir indirme işlemi 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 aşağıdaki gibi bir istem göstermelidir:

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 vermezse istek durumu CANCELED olarak değişir.
  • Kullanıcı, iletişim kutusu kaldırılmadan önce bir 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);

Modüllere erişim

İndirilen bir modüldeki kod ve kaynaklara indirildikten sonra erişmek için uygulamanızın hem kendi için hem de indirdiği özellik modüllerindeki her etkinlik için SplitCompat Kitaplığı'nı etkinleştirmesi gerekir.

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, bildirimler gibi sistem kullanıcı arayüzü bileşenleri için modülün kaynaklarına erişemez. 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'i etkinleştirmenin en basit yolu, SplitCompatApplication sınıfını uygulamanızın manifest dosyasında aşağıdaki gibi Application alt sınıfı olarak tanımlamaktır:

<application
    ...
    android:name="com.google.android.play.core.splitcompat.SplitCompatApplication">
</application>

Uygulama bir cihaza yüklendikten sonra, indirilen özellik modüllerindeki koda ve kaynaklara otomatik olarak erişebilirsiniz.

Çalışma zamanında SplitCompat'i çağırma

SplitCompat'ı çalışma zamanında belirli etkinliklerde veya hizmetlerde de etkinleştirebilirsiniz. SplitCompat'i bu şekilde etkinleştirmek, özellik modüllerine dahil edilen etkinlikleri başlatmak için gereklidir. Bunun için attachBaseContext değerini aşağıdaki 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, SplitCompat.install(Context applicationContext)'yi dahil etmek için ContextWrapper.attachBaseContext()'u geçersiz kılar. Şunu yapmazsanız: Application sınıfınızın şunları yapması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 hem anında uygulamalar hem de yüklü uygulamalarla uyumluysa SplitCompat'i aşağıdaki gibi koşullu olarak çağırabilirsiniz:

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'i etkinleştirme

Temel uygulamanız için SplitCompat'i etkinleştirdikten sonra, uygulamanızın bir özellik modülünde indirdiği her etkinlik için SplitCompat'i etkinleştirmeniz gerekir. 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şme

Özellik modülünde tanımlanan bir etkinliği başlatma

SplitCompat'i etkinleştirdikten sonra startActivity() kullanarak özellik modüllerinde tanımlanan etkinlikleri başlatabilirsiniz.

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

SplitCompat'i etkinleştirdikten sonra özellik modüllerinde tanımlanan hizmetleri startService() kullanarak başlatabilirsiniz.

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 dahil etmemeniz gerekir.

Derleme sistemi, tüm modüllerin manifest girişlerini temel modülle birleştirir. İsteğe bağlı bir modül dışa aktarılan bir bileşen içeriyorsa bu bileşene modül yüklenmeden önce bile erişilebilir ve başka bir uygulamadan çağrıldığında eksik kod nedeniyle kilitlenmeye neden olabilir.

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, ana alana proxy dışa aktarılan bir proxy 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üllerdeki koda ve kaynaklara erişme

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.

Başka bir modülden modül koduna erişme

Bir modüldeki nesneye veya sınıfa doğrudan başka bir modülden statik olarak erişilemez ancak yansıma kullanılarak dolaylı olarak erişilebilir.

Yansımanın performans maliyetleri nedeniyle bunun ne sıklıkta gerçekleştiğine dikkat etmeniz gerekir. 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.

Nesne oluşturulduktan sonra nesneyle etkileşimleri basitleştirmek için temel modülde bir arayüz ve özellik modülünde bu arayüzün uygulamasını tanımlamanız önerilir. Ö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();

Farklı bir modüldeki kaynaklara ve öğelere erişme

Bir modül yüklendikten sonra, modüldeki kaynaklara ve öğelere standart şekilde erişebilirsiniz. Bununla birlikte, iki noktaya dikkat etmeniz gerekir:

  • 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üncellenmez. 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ınlama özelliğini kullanarak yerel kodu bir uygulamaya yükleme

Özellik modüllerini isteğe bağlı olarak yayınlarken tüm yerel kitaplıklarınızı yüklemek için ReLinker'ı kullanmanızı öneririz. ReLinker, özellik modülü yüklendikten sonra yerel kitaplıkların yüklenmesiyle ilgili bir sorunu düzeltir. ReLinker hakkında daha fazla bilgiyi Android JNI İpuçları bölümünde bulabilirsiniz.

İsteğe bağlı bir modülden yerel kod yükleme

Bölüm yüklendikten sonra, yerel kodunu ReLinker aracılığıyla yüklemenizi öneririz. Anında 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()'tür.

İsteğe bağlı bir modülde tanımlanan bir kitaplığı yüklemek için yerel kodda dlopen() kullanıyorsanız bu, göreli kitaplık yollarıyla çalışmaz. En iyi çözüm, ClassLoader.findLibrary() aracılığıyla Java kodundan kitaplığın mutlak yolunu almak ve ardından dlopen() çağrınızda kullanmaktır. Bunu yerel koda girmeden önce yapın veya yerel kodunuzdan Java'ya bir JNI çağrısı kullanın.

Yüklü Android Hazır Uygulamalar'a erişme

Bir Android Hazır Uygulama modülü INSTALLED olarak raporlandıktan sonra, yenilenmiş bir uygulama bağlamını kullanarak koduna ve kaynaklarına erişebilirsiniz. Uygulamanızın bir modülü yüklemeden önce oluşturduğu bağlam (örneğin, zaten bir değişkende depolanmış olan bağlam), yeni modülün içeriğini içermez. Ancak yeni bir bağlam gereklidir. Bu, örneğin createPackageContext kullanılarak elde edilebilir.

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 (API düzeyi 26) ve sonraki sürümlerde bir Android anında uygulaması için isteğe bağlı modül isteğinde bulunurken, yükleme isteği INSTALLED olarak raporlandıktan sonra SplitInstallHelper.updateAppInfo(Context context) çağrısı yaparak uygulamayı yeni modülün bağlamıyla güncellemeniz gerekir. Aksi takdirde uygulama, modülün kodunu ve kaynaklarını henüz bilmiyordur. 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 daha önce indirdiği bir modüldeki C/C++ kitaplıklarını Hazır Uygulama'ya yüklemek istiyorsanız aşağıda gösterildiği gibi SplitInstallHelper.loadLibrary(Context context, String libName) kullanın:

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, isteğe bağlı bir modüldeki kaynaklara veya öğelere erişen bir etkinlikte kullanılamaz. 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üllerin kaldırılması 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ı indirme

Uygulama paketleri sayesinde cihazlar yalnızca uygulamanızı çalıştırmak için ihtiyaç duydukları kod ve kaynakları indirir. Bu nedenle, kullanıcının cihazı dil kaynakları için yalnızca uygulamanızın, cihaz ayarlarında seçili olan bir veya daha fazla dille eşleşen dil kaynaklarını indirir.

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 işlem, aşağıda gösterildiği gibi bir özellik modülü indirme işlemine benzer.

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ü isteğiymiş 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 aracılığıyla yeni bir yerel ayar belirleyin:

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. Activity#recreate() yöntemini kullanabilirsiniz.

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ırma

Özellik modüllerine benzer şekilde, ek kaynakları dilediğiniz zaman kaldırabilirsiniz. Kaldırma isteğinde bulunmadan önce, şu adımları uygulayarak şu anda hangi dillerin yüklü olduğunu belirleyebilirsiniz.

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

Modül yüklemelerini yerel olarak test etme

Play Özellik Yayınlama Kitaplığı, uygulamanızın Play Store'a bağlanmadan aşağıdakileri yapma özelliğini yerel olarak test etmenize olanak tanır:

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:

APK grubu oluşturma

Henüz yapmadıysanız uygulamanızın bölünmüş APK'larını aşağıdaki gibi oluşturun:

  1. Aşağıdaki yöntemlerden birini kullanarak uygulamanız için bir uygulama paketi oluşturun:
  2. 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şaretçisini kullanarak bir dizi APK oluşturduktan sonra, uygulamanızın temel sürümünü yüklemek ve ek APK'ları cihazınızın yerel depolama alanına aktarmak için bundletool işaretçisini kullanın. 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. Bir dizi APK oluşturmak ve bunları test cihazınıza dağıtmak için bundletool--local-testing işaretiyle kullandığınızda, Play Feature Delivery Library'ye uygulamanızın API çağrılarını SplitInstallManager yerine FakeSplitInstallManager çağıracak şekilde otomatik olarak geçiş yapması yönünde talimat veren meta veriler içerir.

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