Dynamic Feature Module kullanımı — Android

ömer iyiöz
DigiGeek
Published in
4 min readFeb 15, 2021

Bu yazımda dynamic feature module’lerden bahsedip, google code lab’da verilen örneği inceleyeceğim.

Google codelab’da geliştirilen Dynamic feature module örneğinin github link’i üzerinden kodları incelemiştim. Ancak daha sonra bu repo’nun daha güncel halini buldum. Her iki link’i de inceleyebilirsiniz, iki proje de düzgün çalışıyor :

https://developer.android.com/guide/app-bundle/play-feature-delivery

App bundle

Dynamic feature module kullanabilmek için app bundle kullanmak zorundayız.

Dynamic feature’lar API level 21+ için kullanılabilir

Dynamic feature module’lerin runtime’da indirilip yüklenmesi işlemini sadece API level 21 ve üzeri cihazlar destekler. API level 20 ve altındaki cihazlarda feature module’lerin kullanılabilir olması için fusing enable edilmelidir. Detay için bu makale içerisinde dist:fusing diye arama yapabilirsiniz.

Dependency

Eğer on-demand module kullanacaksak, on-demand module’ü runtime’da download edebilmek için SplitInstallManager class’ını kullanmalıyız. SplitInstallManager class’ını kullanabilmek için, bu class’ı kullanacağımız module’e(bu muhtemelen app module olacaktır) aşağıdaki dependency’yi eklemeliyiz :

api "com.google.android.play:core:1.9.1"

On-demand module kullanmayacaksanız, bunun yerine install-time module kullanacaksanız bu dependency’ye ihtiyacınız yoktur.

Haydi hemen başlayalım. Örnek üzerinde çalışırken teorik bilgileri de vermeye çalışacağım.

İlk örneğimizdeki projemizde 5 farklı module var. Bunlardan birisi app(application module) module, diğer dördü ise dynamic feature module’dür. Kullanıcı uygulamayı yüklediğinde sadece app module’ü yüklemiş olur. Kullanıcı uygulama içerisinde gezerken bir feature’ı kullanmak istediğinde eğer bu feature dynamic feature module içerisinde tanımlıysa, kullanıcıya bir progress bar gösterip arka planda gerekli dynamic feature module’ün play store’dan indirilmesini sağlayabiliriz.

Bu örnekte, app module, base module’ümdür, tüm dynamic feature module’ler bu module’e bağımlıdır.

app module’ümüzün build.gradle dosyasında dynamic feature module’leri söyleriz:

dynamicFeatures = [':assets',
':kotlin',
':java',
':native']

Feature module’lerimizin build.gradle dosyalarında yapmamız gereken 2 şey vardır:

1- apply plugin: ‘com.android.dynamic-feature’

2- implementation project(‘:app’)

Enable SplitCompat

Application module’ümüzün, indirilen Dynamic feature module’lere erişebilmesi için SplitCompat’ı enable etmeliyiz.

https://developer.android.com/guide/playcore/play-feature-delivery#enable_splitcompat

Bunu yapmanın farklı yolları vardır.

1- Custom application class’ımız yoksa, manifest’de SplitCompatApplication class’ını aplication class’ımız olarak belirtebiliriz.

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

2-Custom application class’ımız varsa SplitCompatApplication class’ını extend etmesini sağlayabiliriz.

class MyApplication : SplitCompatApplication() {
...
}

3-Custom application class’ımız varsa, ama SplitCompatApplication class’ını extend etmek istemiyorsak, ihtiyacımız olan activity’ye aşağıdaki method’u ekleyebiliriz:

override fun attachBaseContext(base: Context) {
super.attachBaseContext(base)
// Emulates installation of future on demand modules using SplitCompat.
SplitCompat.install(this)
}

4- Dynamic Feature module’ümüz(demand modülümüz) instant app’i de destekliyorsa SplitCompat’ı koşullu enable edebiliriz :

override fun attachBaseContext(base: Context) {
super.attachBaseContext(base)
if (!InstantApps.isInstantApp(this)) {
SplitCompat.install(this)
}
}

SplitInstallManager ve SplitInstallStateUpdatedListener instance’ları

AndroidManifest.xml dosyaları

Module’lerimizin AndroidManifest.xml dosyaları aşağıdaki gibidir.

Module’lerimiz runtime’da application module tarafından indirilmesi talep edildiğinde indirilip kullanılacak demek aşağıdaki kodları yazdık :

<dist:delivery>
<dist:on-demand/>
</dist:delivery>

dist:fusing

Dynamic feature module’lerin indirilip yüklenmesi sadece Android 5.0(api 21) ve üzeri cihazlar destekler. api 20 ve altı cihazlarda feature’ınızın kullanılabilir olmasını istiyorsanız, fusing’i enable etmelisiniz, ama bu durumda feature module’ler uygulama kurulurken indirilmiş olacaktır.

<dist:fusing dist:include="true" />
  • Only devices running Android 5.0 (API level 21) and higher support downloading and installing features on demand. To make your feature available to earlier versions of Android, enable Fusing when you create a feature module.

dist:title ve on-demand module’ün yüklü olup olmadığını check etmek

bir module’ün yüklü olup olmadığını anlamaya çalıştığımız kısım aşağıda gösterdim. Dynamic feature module’lerin manifest dosyalarında tanımladığımız dist:title önemlidir. Çünkü bir module’ün yüklü olup olmadığını check etmek için aşağıdaki method’u çağırırız. contains() method’unun aldığı parametre dist:title’a verdiğimiz değerdir.

splitInstallManager.installedModules.contains(name)

Yani java isimli dynamic feature module’ümün manifest’inde,

dist:title=”my_java_module”

dersem, bu module’ün yüklü olup olmadığını check etmek için aşağıdaki kodu kullanmalıyım :

splitInstallManager.installedModules.contains("my_java_module")

Feature module’ün indirilmesini başlatmak

Bir on-demand module’ün yüklü olup olmadığını check ettikten sonra, eğer yüklü değilse, SplitInstallRequest instance yaratırız. Bu instance’ı yaratırken addModule() method’una verdiğimiz parametre yüklemek istediğim on-demand module’ün dist-title’ında belirttiğimiz string’dir. SplitInstallManager instance’ının startInstall() method’unu çağırarak download işlemini başlatırız.

splitInstallManager.startInstall(splitInstallRequest)

Download işlemi bittiğinde listener’ımız tetiklenip kotlin isimli on-demand module’ümüzün activity’si launch edilecektir.

Birden fazla on-demand module’ün tek seferde indirilmesi

4 farklı on-demand module’ümün title’ı bir listeye koyulur. Sonra herbir module yüklü mü diye bakılır, yüklü olmayan module’lerin title’ları requestBuilder’a eklenip SplitInstallManager instance’ının startInstall() method’u çağırılır.

splitInstallManager.startInstall(splitInstallRequest)

Bir sonraki yazımda instant app’lerden bahsedeceğim.

Yazılarımızın devamının gelmesi için clap’lemeyi unutmayınız :)

--

--