Farklı API düzeyleri için birden fazla APK oluşturma

Uygulamanızı Google Play'de yayınlarsanız bir Android App Bundle oluşturup yüklemeniz gerekir. Bunu yaptığınızda, Google Play otomatik olarak her kullanıcının cihaz yapılandırmasına göre optimize edilmiş APK'lar oluşturur ve sunar. Böylece kullanıcılar yalnızca uygulamanızı çalıştırmak için gereken kod ve kaynakları indirir. Birden fazla APK yayınlamak, Google Play'de yayınlamadığınız durumlarda yararlıdır ancak her APK'yı kendiniz oluşturmanız, imzalamanız ve yönetmeniz gerekir.

Google Play'deki birden fazla APK'dan yararlanmak için Android uygulamanızı geliştirirken, bazı iyi uygulamaları başından itibaren benimsemek ve geliştirme sürecinin gereksiz yere sorun yaşamasını önlemek önemlidir. Bu derste, uygulamanıza ait birden fazla APK'yı nasıl oluşturacağınız gösterilmektedir. Bu APK'ların her biri, biraz farklı bir API düzeyi aralığını kapsar. Ayrıca, birden fazla APK kod tabanını mümkün olduğunca zahmetsiz hale getirmek için gerekli olan bazı araçlara da sahip olacaksınız.

Birden fazla APK'ya ihtiyacınız olduğunu onaylayın

Android platformunun birçok neslinde çalışan bir uygulama oluşturmaya çalışırken, doğal olarak uygulamanızın geriye dönük uyumluluktan ödün vermeden yeni cihazlardaki yeni özelliklerden yararlanmasını istersiniz. Başlangıçta birden fazla APK desteğinin en iyi çözüm olduğu düşünülebilir, ancak çoğu zaman durum böyle değildir. Birden fazla APK geliştirici kılavuzunun Tek APK'yı Kullanma bölümünde, destek kitaplığımızın kullanımı da dahil olmak üzere, bunu tek bir APK ile nasıl gerçekleştirebileceğinize dair bazı yararlı bilgiler yer almaktadır. Ayrıca, bu makaledeki düşünme gibi hesaplama açısından pahalı tekniklere başvurmadan tek bir APK'da yalnızca belirli API düzeylerinde çalışan kodların nasıl yazılacağını da öğrenebilirsiniz.

Bunu yönetebiliyorsanız, uygulamanızı tek bir APK ile sınırlandırmanın çeşitli avantajları vardır. Örneğin:

  • Yayınlama ve test etmek daha kolaydır
  • Yönetmeniz gereken yalnızca bir kod tabanı vardır
  • Uygulamanız cihaz yapılandırma değişikliklerine uyum sağlayabilir
  • Cihazlar arasında uygulama geri yükleme işlevi sorunsuz çalışıyor
  • Pazar tercihi, bir APK'dan bir sonrakine "yükseltme" davranışı veya hangi APK'nın hangi cihaz sınıfıyla uyumlu olduğu konusunda endişelenmenize gerek yoktur.

Bu dersin geri kalanında, konuyu araştırdığınız, bağlantılı kaynaklardaki materyali ustaca kullandığınız ve birden fazla APK'nın uygulamanız için doğru yol olduğuna karar verdiğiniz varsayılmaktadır.

Gereksinimlerinizin grafiğini belirleyin

Kaç APK'ya ihtiyacınız olduğunu ve her APK'nın hangi API aralığını kapsadığını hızlıca belirlemek için basit bir grafik oluşturarak başlayın. Referans olması açısından, Android Geliştiricisi web sitesinin Platform Sürümleri sayfasında, Android platformunun belirli bir sürümünü çalıştıran etkin cihazların göreli sayısı hakkında veriler sağlanır. Ayrıca, ilk başta kolay gelse de, her APK'nın hangi API düzeyi grubunu hedefleyeceğini takip etmek, özellikle bir örtüşme olacaksa (sık sık yaşanır) oldukça hızlı bir şekilde zorlaşır. Neyse ki gereksinimlerinizi kolaylıkla ve hızlıca belirlemek ve daha sonra kullanmak üzere kolayca başvurabilmenizi sağlar.

Birden fazla APK grafiği oluşturmak için işe Android platformunun çeşitli API düzeylerini temsil eden bir hücre satırıyla başlayın. Gelecekteki Android sürümlerini temsil etmek için sona fazladan bir hücre ekleyin.

3 4 5 6 7 8 9 10 11 12 13 +

Şimdi grafikte her renk bir APK'yı temsil edecek şekilde renklendirir. Aşağıda, her APK'yı belirli bir API düzeyi aralığına nasıl uygulayabileceğinize ilişkin bir örnek verilmiştir.

3 4 5 6 7 8 9 10 11 12 13 +

Bu grafiği oluşturduktan sonra ekibinize dağıtın. Projenizdeki ekip iletişimi bir anda daha basit hale geldi, zira "APK, Android 1.x one. Nasıl gidiyor?" Örneğin, "Mavi APK nasıl geliyor?" diyebilirsiniz.

Tüm ortak kodları ve kaynakları bir kitaplık projesine yerleştirin

İster mevcut bir Android uygulamasında değişiklik yapıyor olun ister sıfırdan yeni bir uygulamaya başlayın, kod tabanı için yapmanız gereken ilk şey ve en önemlisi budur. Kitaplık projesine giren her şeyin yalnızca bir kez güncellenmesi gerekir (ör. dile göre yerelleştirilmiş dizeler, renk temaları, paylaşılan kodda düzeltilen hatalar). Bu, geliştirme sürenizi iyileştirir ve kolayca önlenebilecek hataların olasılığını azaltır.

Not: Kitaplık projelerinin nasıl oluşturulacağı ve dahil edileceğine ilişkin uygulama ayrıntıları bu dersin kapsamı dışında olsa da, Android Kitaplığı Oluşturma konusunu okuyarak bilgi edinebilirsiniz.

Mevcut bir uygulamayı birden fazla APK desteği kullanacak şekilde dönüştürüyorsanız yerelleştirilmiş her bir dize dosyası, değer listesi, tema renkleri, APK'lar arasında değişmeyecek menü simgeleri ve düzen için kod tabanınızı temizleyin ve tümünü kitaplık projesine yerleştirin. Çok fazla değişmeyecek bir kod, kitaplık projesine de eklenmelidir. Bu sınıfların kapsamını APK'dan APK'ya bir veya iki yöntem ekleyerek genişlettiğinizi fark edebilirsiniz.

Öte yandan, uygulamayı sıfırdan oluşturuyorsanız önce kitaplık projesinde mümkün olduğunca çok kod yazmaya çalışın, ardından gerekirse kodu ayrı bir APK'ya taşıyın. Uzun vadede bunu yönetmek, bir yere, bir başkasına ve sonra bir başkasına eklemekten ve aylar sonra bu blob'un herhangi bir değişiklik yapmadan kitaplık bölümüne taşınıp taşınamayacağını anlamaya çalışmaktan çok daha kolaydır.

Yeni APK projeleri oluşturma

Yayınlayacağınız her APK için ayrı bir Android projesi olmalıdır. Kolay düzenleme için kitaplık projesini ve ilgili tüm APK projelerini aynı üst klasörün altına yerleştirin. Ayrıca, paket adını kitaplıkla paylaşmaları gerekli olmasa da her APK'nın aynı paket adına sahip olması gerektiğini de unutmayın. Daha önce açıklanan şemaya göre 3 APK'nız varsa kök dizininiz şöyle görünebilir:

alexlucas:~/code/multi-apks-root$ ls
foo-blue
foo-green
foo-lib
foo-red

Projeler oluşturulduktan sonra, kitaplık projesini her APK projesine referans olarak ekleyin. Mümkünse, kitaplık projesinde başlangıç Etkinliğinizi tanımlayın ve bu Etkinliği APK projenizde genişletin. Kitaplık projesinde tanımlı bir başlangıç etkinliğinin olması, tüm uygulama başlatma işlemlerinizi tek bir yere koymanıza olanak tanır. Böylece her bir APK'nın Analytics'i başlatma, lisans kontrollerini çalıştırma ve APK'dan APK'ya pek değişmeyen diğer başlatma prosedürleri gibi "evrensel" görevleri yeniden uygulaması gerekmez.

Manifestleri ayarlama

Bir kullanıcı Google Play üzerinden birden fazla APK kullanan bir uygulama indirdiğinde, iki basit kural kullanılarak kullanılacak doğru APK seçilir:

  • Manifest, ilgili APK'nın bunun için uygun olduğunu göstermelidir.
  • Uygun APK'lar arasından en yüksek sürüm numarası kazanır

Örneğin, daha önce açıklanan birden fazla APK grubunu ele alalım ve hiçbir APK için maksimum API düzeyi belirlemediğimizi varsayalım. Tek tek ele alındığında, her bir APK'nın olası aralığı şöyle görünür:

3 4 5 6 7 8 9 10 11 12 13 +
3 4 5 6 7 8 9 10 11 12 13 +
3 4 5 6 7 8 9 10 11 12 13 +

Daha yüksek minSdkVersion değerine sahip bir APK'nın da daha yüksek sürüm koduna sahip olması gerektiğinden, versionCode değerleri açısından kırmızı ≥ yeşil ≥ mavi. Dolayısıyla, grafiği aşağıdaki gibi olacak şekilde daraltabiliriz:

3 4 5 6 7 8 9 10 11 12 13 +

Şimdi, Red APK'da bununla ilgili diğer ikisinde bulunmayan bir gereksinim olduğunu varsayalım. Android Geliştirici kılavuzunun Google Play'deki filtreler sayfasında olası nedenlerin tam listesi bulunmaktadır. Örneğin, kırmızı renk için önden görünümlü kamera gerektiğini varsayalım. Aslında, kırmızı APK'nın asıl amacı, ön kamerayı API 11'e eklenen yeni ve hoş bir işlevle birleştirmektir. Ancak API 11'i destekleyen tüm cihazların ön kameraları bile VAR! Korkunç!

Neyse ki, bir kullanıcı bu tür bir cihazdan Google Play'e göz atıyorsa Google Play bu manifeste bakar, Red'in bir zorunluluk olarak ön kamera listesini listelediğini görür ve Kırmızı ile o cihazın dijital cennet gibi bir eşleşme olmadığını belirleyerek bu durumu sessizce göz ardı eder. Ardından, Yeşil'in yalnızca API 11 yüklü cihazlarla ileriye dönük uyumlu olmadığını (maxSdkVersion tanımlanmadığı için) değil, ön kamera olup olmadığını da önemsemediğini görür. Ön kameradaki aksaklığa rağmen ilgili API seviyesini destekleyen bir APK hâlâ kullanıcı tarafından Google Play'den indirilebiliyor.

Tüm APK'larınızı ayrı "kanallarda" tutmak için iyi bir sürüm kodu şemasına sahip olmanız önemlidir. Önerilen kodu, geliştirici kılavuzumuzun Sürüm Kodları alanında bulabilirsiniz. Örnek APK grubu yalnızca 3 olası boyuttan birini işlediği için her APK'yı 1000 ile ayırmak, ilk birkaç haneyi söz konusu APK için minSdkVersion olarak ayarlamak ve oradan artımlı olmak yeterlidir. Şöyle görünebilir:

Mavi: 03001, 03002, 03003, 03004...
Yeşil: 07001, 07002, 07003, 07004...
Kırmızı:11001, 11002, 11003, 11004...

Bunların tümü birleştirilirse Android Manifest'leriniz muhtemelen aşağıdaki gibi görünür:

Mavi:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="03001" android:versionName="1.0" package="com.example.foo">
    <uses-sdk android:minSdkVersion="3" />
    ...

Yeşil:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="07001" android:versionName="1.0" package="com.example.foo">
    <uses-sdk android:minSdkVersion="7" />
    ...

Kırmızı:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="11001" android:versionName="1.0" package="com.example.foo">
    <uses-sdk android:minSdkVersion="11" />
    ...

Lansman öncesi yapılacaklar listenizi inceleyin

Google Play'e yüklemeden önce aşağıdaki öğeleri tekrar kontrol edin. Bunların özellikle birden fazla APK ile alakalı olduğunu ve hiçbir şekilde Google Play'e yüklenen tüm uygulamalar için eksiksiz bir kontrol listesini temsil etmediğini unutmayın.

  • Tüm APK'lar aynı paket adına sahip olmalıdır
  • Tüm APK'lar aynı sertifikayla imzalanmalıdır
  • APK'lar platform sürümüyle çakışıyorsa minSdkVersion değeri daha yüksek olan APK'nın sürüm kodu daha yüksek olmalıdır
  • Çakışan bilgiler için manifest filtrelerinizi tekrar kontrol edin (yalnızca XLARGE ekranlarında cupcake'i destekleyen bir APK hiç kimse tarafından görülmez)
  • Her APK'nın manifesti, desteklenen ekran, OpenGL dokusu veya platform sürümünün en az birinde benzersiz olmalıdır
  • Her APK'yı en az bir cihazda test etmeye çalışın. Bunun dışında, geliştirme makinenizde işletmedeki en özelleştirilebilir cihaz emülatörlerinden birine sahipsiniz. Hay aksi!

Ayrıca, uygulamanızı Google Play'de gizleyebilecek herhangi bir sürpriz olmadığından emin olmak için, derlenen APK'yı piyasaya sunmadan önce incelemek de iyi bir fikirdir. Bu, "aapt" aracını kullanmak oldukça basittir. Aapt (Android Asset Packaging Aracı), Android uygulamalarınızı oluşturma ve paketleme sürecinin bir parçasıdır ve bunları incelemek için de çok kullanışlı bir araçtır.

>aapt dump badging
package: name='com.example.hello' versionCode='1' versionName='1.0'
sdkVersion:'11'
uses-permission:'android.permission.SEND_SMS'
application-label:'Hello'
application-icon-120:'res/drawable-ldpi/icon.png'
application-icon-160:'res/drawable-mdpi/icon.png'
application-icon-240:'res/drawable-hdpi/icon.png'
application: label='Hello' icon='res/drawable-mdpi/icon.png'
launchable-activity: name='com.example.hello.HelloActivity'  label='Hello' icon=''
uses-feature:'android.hardware.telephony'
uses-feature:'android.hardware.touchscreen'
main
supports-screens: 'small' 'normal' 'large' 'xlarge'
supports-any-density: 'true'
locales: '--_--'
densities: '120' '160' '240'

Aapt çıktısını incelerken, desteklenen ekranlar ve uyumlu ekranlar için çakışan değerlerin olmadığından ve manifest'te ayarladığınız izinler sonucunda eklenen, istenmeyen "uses-feature" değerlerinin yer almadığından emin olun. Yukarıdaki örnekte APK, çok fazla cihaz tarafından görülemez.

Neden? Gerekli izin SEND_SMS eklenerek, android.hardware.telephony için özellik gereksinimi örtülü bir şekilde eklenmiştir. API 11 Honeycomb (tabletler için özel olarak optimize edilmiş Android sürümü) olduğundan ve hiçbir Honeycomb cihazında telefon donanımı bulunmadığından, Google Play bu APK'yı, gelecekte API düzeyinde daha yüksek olan VE telefon donanımına sahip olan cihazlar gelene kadar her durumda filtreler.

Neyse ki, manifest dosyanıza aşağıdakileri ekleyerek bu sorunu kolayca çözebilirsiniz:

<uses-feature android:name="android.hardware.telephony" android:required="false" />

android.hardware.touchscreen koşulu da dolaylı yoldan eklenmiştir. APK'nızın dokunmatik ekran olmayan cihazlar olan TV'lerde görünür olmasını istiyorsanız manifest dosyanıza şunu eklemeniz gerekir:

<uses-feature android:name="android.hardware.touchscreen" android:required="false" />

Lansman öncesi yapılacaklar listesini tamamladıktan sonra APK'larınızı Google Play'e yükleyin. Google Play'e göz atarken uygulamanın görünmesi biraz zaman alabilir, ancak göründüğünde son bir kontrol yapın. APK'ların hedeflenen cihazları hedeflediğinden emin olmak için uygulamayı tüm test cihazlarınıza indirin. Tebrikler, başardınız!