What’s new in Android @IO’18: Android App Bundle

Merhaba,

IO sonrası bir dizi detaylı teknik yazılar yazacağımı söylemiştim. Geçen hafta IO’da tanıtılan Instant App’lerdeki farklıkları ve yenilikleri içeren bir yazı yazmıştım. Şimdi sıra App Bundle‘da. Bu yazı developer.android, Google Developers kanalındaki videolar ve codelablerin birleştirilmesiyle oluşturulmuş özet bir yazıdır. Daha detaylı bilgi için orjinal kaynakları inceleyebilirsiniz. App Bundle’ı detaylarda kaybolmadan bir kere daha özetlersek, uygulamanın abi, resource bazlı farklı olarak publishing formatın çeşitlenmesi, sadece ilgili kısmın download edilip download size’ın düşmesi diyebiliriz. App Bundle, bir publish format. App Bundle kullanımı sonucu IO’da söylendiğine göre %30 oranında size’da azalma olan app’ler olmuş. Temel faydası ise farklı cihazları desteklemek için bizim değil Google Play’in görevi üstlenmesi ve optimized apk’lar üretilmesi. Yine cihaza inen, apk olmuş olacak.

Bir diğer önemli nokta da App Bundle’dan Google Play’in uygulama üretmesini sağlayan teknoloji open source. Yani App Bundle’ımız ileride başka store’lar tarafından da uygulama üretmek için kullanılabilir.

Bundles tüm cihazlar için çalışmakla beraber Lolipop ve sonrası cihazlarda optimizasyon daha fazlayken, Lolipop öncesinde multi-apk style apk’i yine Google Play tarafından generate edilerek alabilecekmiş.

Android App Bundle bir zip dosyası. Alışık olduğumuz gibi text dosyaları, resources, assets, native library’leri içermekte. IO’da anlatıldığı üzere apk’ya benzer şekilde desek de aslında App Bundle bir publishing format, birebir apk’yla aynı amaca hizmet etmiyor, yani direk olarak cihaza indirilip kurulamaz. Ek olarak, final apk’larda yer almayan metadata dosyaları içeriyorlar. Böylece Google Play doğru(valid) apk’ları üretebiliyorlar. Bu Dynamic Delivery olarak isimlendirilmiş. Her bir user sadece ihtiyaç duyduğu resource’ları almış oluyor. Instant app’deki split apk gibi düşünebiliriz. Normalde multiple apk dile destek vermiyordu ama App Bundle’la publish ettiğimizde dil, ilgili çözünürlüğe göre image res dosyaları ve mimariye uygun resource’lar otomatik olarak ayrılıp ilgili cihaz özelliğine göre veriliyor. Dil için bu şekilde ayırdığımız noktada, cihazın diline göre yapmamız gerekiyor. Custom dil ayarları sorun çıkarabilir.

Bir App Bundle’ı açtığımızda yukarıdaki gibi bir çıktıya erişiyoruz. Aslında bir kısmı alışık olduğumuz dosyalar. Sadece ihtiyaç olunanlar modifiye edilmiş. xml’ler eskiden binary format yerine protocol buffers olarak compile edilmiş. reources.pb daha önce apk’da resources.arac olarak yer alan dosya yerine gelmiş ve resource tablosu. .pb extention’ı protocol buffer formatındaymış. assets native ise dosyaları ise yine resourse’a benzer şekilde ancak eğer assets ve resource varsa yer alıyorlarmış. App Bundle multiple module’u desteklemektedir. App Bundle’ı extract ettiğimizde top-level dosya isimleri modüllere denk gelmektedir. Mesela yukarda “base” modülün adıdır.

Modüller tabi daha önce de vardı ama feature modüller, instant app’le karşımıza çıktı ve aslında uygulamamızın sadece bir parçasını kullanıcının download edebileceği bir mekanizma yayınlanmış oldu. Şimdi App Bundle’da tekrar modülleri duyuyoruz. Hem App Bundle hem de Google play instant’ın ortak amacı modülarization ve kullacılar için daha küçük optimize edilmiş bir uygulama deneyimi sunmak. İlerde appbundle’la beraber instant ve installed app beraber yüklenebilecekmiş 🙂 Ufaktan mevcut uygulamaları modüler hale getirmenin zamanı geldi de geçiyor yani 🙂

App Bundle için ilk olarak Android Studio 3.2 Canary‘yi download etmemiz gerekiyor. Ayrıca project-level gradle pluginin versiyonunun da sonuncusu olması gerekiyor. ide olarak Android studio kullananları ide update için uyaracak, diğerleri için veryionu (com.android.tools.build:gradle:3.2.0-alpha18) kontrol etmeleri gerekmekte.

Aşağıdaki görseli developer.android’den aldım. Instant app’de konuştuğumuz gibi uygulama tüm ortak özellikleri içeren bir base apk, abi, language, density farklıklarından oluşan configuration apk’ler, ve şu an beta olan Google Play Core Library kullanarak runtime’da ihtiyaç duyuldukça inecek feature’lar üretmek için dynamic feature apk’lerden oluşuyor olacak. Bir kere daha yazmakta fayda var. Bu android 5.0 ve üzeri için, altında da apk’lar play tarafından handle edilebiliyor ancak tek bir apk üretiliyor, burada multi-apk olarak play tarafından bu apk üretiliyor. Multi apk’da dil desteği olmadığı iin tüm dil dosyaları bu tek apk’da yer alıyor. Ancak iyi tarafı farklı birşey indirmemize gerek kalmıyor. Split apk’da ise üretilen birden çok apk’lar cihazda tek bir apk’ymış gibi davranıyor. Alttaki resim 3 dynamic feature’ı olan bir uygulamayı temsil ediyor.

https://developer.android.com/images/app-bundle/apk_splits_tree-2x.png

Base apk’daki code’lar aplication pluginin olduğu müdülü temel alır.

apply plugin: 'com.android.application'

Genel olarak uygulamaya dynamic feature modül eklemediğimiz sürece app bundle’a hazırlık için çok da yapmamız gereken birşey yok.

App Signin: Eğerki App Bundle’ı command line’dan generate ediyorsak signin bilgisi eklememize gerek yok. Ancak eğer ekliyorsak da bu sadece base modülde olmalı.

Code Shrinking: Eğer code shrinking yapmak istiyorsa minifyEnabled’ı sadece base modüle eklemeliyiz. Dynamic feature modüllere custom proguard dosyaları eklenebilir ancak minifyEnabled’ı ignore ediyormuş.

The splits block is ignored: Eğer hangi özelliklerin enabled/disabled edileceğine biz karar vermek istiyorsak android.splits değil android.bundle’ın altına disable eklemeliyiz.

android {
    // When building Android App Bundles, the splits block is ignored.
    splits {...}

    // Instead, use the bundle block to control which types of configuration APKs
    // you want your app bundle to support.
    bundle {
        language {
            // Specifies that the app bundle should not support
            // configuration APKs for language resources. These
            // resources are instead packaged with each base and
            // dynamic feature APK.
            enableSplit = false
        }
        density {
            // This property is set to true by default.
            enableSplit = true
        }
        abi {
            // This property is set to true by default.
            enableSplit = true
        }
    }
}

App versioning: Yine base modül uygulamanın versiyonuna karar verir. Multi-apks için ise tüm farklı apk’lar base modülde yazılan tek versiyon numrasıyla oluşturulur ve tüm devicelarda aynı olur.

Dynamic Feature Modül:

Dynamic Feature modül yazının başında da bahsedildiği gibi, uygulamanın bazı feature’larının kullanıcı ihtiyaç duyduğunda inmesini sağlayan bir yöntem. Mevcut bir uygulamaya dahil etmek ve tüm özellikleri başlı başına bir yazı olabilir. Projeye new modül altında Dynamic Feature Module’u seçerek hızlıca ekleyebiliriz.

Modul eklendikten sonra, build.gradle dosyasında uygulamamızın base modülü dependency olarak ekli gelecek ayrıca base modül’ün build.gradle dosyasında da dynamic feature’ın tanımı yer alacak.

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation project(':intalled')
}
android {
    ...
    dynamicFeatures = [":dynamic_feature2"]
}

Dynamic Feature’ımızın Manifest dosyasında yer alan dist section’ı ise temel özellikleri belirtiyor. onDemand true olmazsa, download anında apk’yla beraber feature da iniyormuş, bu yüzden true set edilmeli. Title feature’ın indirme onay kullanıcıya sorulurken çıkıyor ve string tanımı base modülde. fusing dist ise 5.0 altı işletim sistemleri için. Böylece 4.4 ve cihazlarda erişilebilir olmuş oluyor.

<dist:module
    dist:onDemand="true"
    dist:title="@string/title_dynamic_feature2">
    <dist:fusing dist:include="true" />
</dist:module>

Reference:

https://developer.android.com/guide/app-bundle/

 

2 thoughts on “What’s new in Android @IO’18: Android App Bundle

Add yours

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Create a free website or blog at WordPress.com.

Up ↑