Farklı ekran boyutları için birden fazla APK oluşturma

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

Android uygulamanızı Google Play'deki birden fazla APK'dan yararlanacak şekilde geliştirirken baştan itibaren bazı iyi uygulamaları benimsemeniz ve geliştirme sürecinin ilerleyen aşamalarında gereksiz baş ağrılarını önlemeniz önemlidir. Bu derste, uygulamanız için her biri farklı bir ekran boyutu sınıfını kapsayan birden fazla APK'yı nasıl oluşturacağınız gösterilmektedir. Ayrıca, birden fazla APK kod tabanının bakımını mümkün olduğunca zahmetsiz hale getirmek için gereken bazı araçlara da sahip olacaksınız.

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

Çeşitli Android cihaz boyutlarında çalışan bir uygulama oluşturmaya çalışırken, doğal olarak uygulamanızın küçük ekranlardaki uyumluluk ve kullanılabilirlikten ödün vermeden daha büyük cihazlardaki mevcut alanın tamamından yararlanmasını istersiniz. İlk başta birden fazla APK desteğinin en iyi çözüm olduğu düşünülebilir ancak bu genellikle doğru değildir. Birden fazla APK'nın kullanıldığı geliştirici kılavuzunun Bunun Yerine Tek APK Kullanma bölümünde, destek kitaplığımızın kullanımı da dahil olmak üzere bunu tek bir APK ile nasıl yapacağınızla ilgili bazı faydalı bilgiler yer alır. Birden fazla ekranı destekleme kılavuzunu da okumanız gerekir. Hatta, Android SDK'yı kullanarak indirebileceğiniz bir destek kitaplığı bile vardır. Bu kitaplık, Honeycomb öncesi cihazlarda parçaları kullanmanıza olanak tanır (tek bir APK'da birden çok ekran desteğini çok daha kolay hale getirir).

Uygulamanızı tek bir APK ile sınırlandırmanın aşağıdakiler gibi çeşitli avantajları vardır:

  • Yayınlama ve test etme artık daha kolay
  • 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şlemi sorunsuz çalışır
  • Pazar tercihi, bir APK'dan diğerine "yükseltme" işlemlerinin davranışı veya hangi APK'nın hangi cihaz sınıfını kullanacağı konusunda endişelenmenize gerek yoktur

Bu dersin geri kalanında; konuyu araştırdığınız, malzemeyi bağlantılı kaynaklardan titizlikle topladığınız ve birden fazla APK'nın uygulamanız için doğru yol olduğunu belirlediğiniz varsayılır.

İhtiyaçlarınıza göre grafik oluşturma

Kaç APK'ya ihtiyacınız olduğunu ve her APK'nın hangi ekran boyutlarını kapsadığını hızlıca belirlemek için basit bir grafik oluşturarak başlayın. Neyse ki ihtiyaçlarınızı hızlı ve kolay bir şekilde listeleyip daha sonra referans olarak kullanabilirsiniz. Android platformunda bulunan çeşitli ekran boyutlarını temsil eden bir hücre satırıyla başlayın.

küçük normal büyük xlarge

Artık grafiği, her rengin bir APK'yı temsil edecek şekilde renklendirebilirsiniz. Aşağıda, her APK'yı belirli ekran boyutları aralığına nasıl uygulayabileceğinize dair bir örnek verilmiştir.

küçük normal büyük xlarge

İhtiyaçlarınıza bağlı olarak, "küçük ve diğer her şey" veya "xbüyük ve diğer her şey" olmak üzere iki APK'nız da olabilir. Grafikte renklendirme yapmak, ekip içi iletişimi de kolaylaştırır. Artık her APK'yı, kapsadığı farklı ekran türleri ne olursa olsun "mavi", "yeşil" veya "kırmızı" olarak adlandırabilirsiniz.

Tüm ortak kod ve kaynakları bir kitaplık projesine yerleştirme

Mevcut bir Android uygulamasını değiştiriyor veya sıfırdan bir uygulama başlatıyor olsanız da kod tabanında yapmanız gereken ilk şey budur ve bu, en önemli adımdır. Kitaplık projesine eklenen her şeyin yalnızca bir kez güncellenmesi gerekir (dil yerelleştirilmiş dizeler, renk temaları, paylaşılan kodda düzeltilen hatalar gibi). Bu, geliştirme sürenizi kısaltır ve kolayca önlenebilen hata olasılığını azaltır.

Not: Kitaplık projelerinin nasıl oluşturulacağı ve dahil edileceğiyle ilgili uygulama ayrıntıları bu dersin kapsamında değildir, ancak Android Kitaplığı Oluşturma başlıklı makaleyi okuyarak bilgileri daha hızlı öğrenebilirsiniz.

Mevcut bir uygulamayı birden fazla APK desteğini kullanacak şekilde dönüştürüyorsanız kod tabanınızda, APK'lar arasında değişmeyecek her yerelleştirilmiş dize dosyası, değer listesi, tema rengi, menü simgesi ve yerleşimi bulun ve hepsini kitaplık projesine ekleyin. Çok değişmeyecek olan kodların da kütüphane projesinde yer alması gerekiyor. Muhtemelen bu sınıfları, APK'dan APK'ya bir iki yöntem eklemek için genişletirsiniz.

Öte yandan, uygulamayı sıfırdan oluşturuyorsanız önce kitaplık projesine mümkün olduğunca kod yazmaya çalışın. Ardından, kodu yalnızca gerekirse tek bir APK'ya taşıyın. Bu, uzun vadede bir klasöre, sonra başka bir klasöre, sonra başka bir klasöre eklemekten ve aylarca sonra bu blob'un herhangi bir şeyi bozmadan 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 her APK'nın aynı paket adına sahip olması gerektiğini unutmayın. Ancak, her APK'nın paket adını kitaplıkla paylaşması gerekmez. Daha önce açıklanan şemayı uygulayan 3 APK'nız olsaydı kök dizininiz aşağıdaki gibi görünebilirdi:

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ıç Aktivitenizi tanımlayın ve APK projenizde bu Etkinliği genişletin. Kitaplık projesinde tanımlanmış bir başlangıç etkinliği olması, uygulamanızın tüm ilklendirme işlemlerini tek bir yere yerleştirmenize olanak tanır. Böylece, her APK'nın Analytics'i başlatma, lisanslama kontrolleri yapma ve APK'lar arasında çok fazla değişiklik göstermeyen diğer ilklendirme işlemlerini yeniden uygulamak zorunda kalmaz.

Manifestleri ayarlama

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

  • Manifest, belirli bir APK'nın uygun olduğunu göstermelidir.
  • Uygun APK'lar arasında en yüksek sürüm numarası kazanır

Örnek olarak, daha önce açıklanan birden fazla APK grubunu ve her bir APK'nın "hedef" ekran boyutundan büyük tüm ekran boyutlarını destekleyecek şekilde ayarlandığını varsayalım. Tek tek ele alındığında, her bir APK'nın olası aralığı şöyle görünür:

küçük normal büyük xlarge
küçük normal büyük xlarge
küçük normal büyük xlarge

Ancak "en yüksek sürüm numarası kazanır" kuralını kullanarak her APK'da versionCode özelliğini kırmızı ≥ yeşil ≥ mavi olacak şekilde ayarlarsak grafik etkili bir şekilde şu şekilde daraltılır:

küçük normal büyük xlarge

Şimdi de Red APK'nın, diğer ikisinde olmayan bazı gereksinimleri olduğunu varsayalım. Android Geliştirici Kılavuzu'nun Google Play'deki Filtreler sayfasında, olası suçluların tam listesi yer alır. Örnek olarak, kırmızının ön kamera gerektirdiğini varsayalım. Aslında kırmızı APK'nın amacı, mevcut ekstra ekran alanını ön kamerayla eğlenceli şeyler yapmak için kullanmaktır. Ama görünüşe göre her büyük cihazın ön kamerası bile YOK! Korku!

Bir kullanıcı bu tür bir cihazdan Google Play'e göz atıyorsa Google Play manifeste bakar, Kırmızı'nın gerekli olarak ön kamerayı listelediğini görür ve Kırmızı ile bu cihazın dijital cennet gibi olmadığını belirlediği için bunu sessizce görmez. Ardından, Yeşil'in yalnızca büyük boyutlu cihazlarla uyumlu olmadığını değil, aynı zamanda ön kamera olup olmadığını da umursamadığını görür. Ön kameradaki tüm yanlış karışıklığa rağmen hâlâ bu ekran boyutunu destekleyen bir APK olduğundan uygulama yine de kullanıcı tarafından Google Play'den indirilebilir.

Tüm APK'larınızı ayrı "kanallarda" tutmak için iyi bir sürüm kodu şemasının olması önemlidir. Önerilen sürümü, geliştirici kılavuzumuzun Sürüm Kodları bölümünde bulabilirsiniz. Örnek APK grubu yalnızca olası 3 boyuttan birini ele aldığından her bir APK'yı 1000 ile ayırmak ve buradan itibaren artırmak yeterli olacaktır. Bu şöyle görünebilir:

Mavi: 1001, 1002, 1003, 1004...
Yeşil: 2001, 2002, 2003, 2004...
Kırmızı:3001, 3002, 3003, 3004...

Hepsini bir araya getirdiğimizde, Android Manifest'leriniz muhtemelen aşağıdakine benzer olacaktır:

Mavi:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="1001" android:versionName="1.0" package="com.example.foo">
    <supports-screens android:smallScreens="true"
        android:normalScreens="true"
        android:largeScreens="true"
        android:xlargeScreens="true" />
    ...

Yeşil:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="2001" android:versionName="1.0" package="com.example.foo">
    <supports-screens android:smallScreens="false"
        android:normalScreens="false"
        android:largeScreens="true"
        android:xlargeScreens="true" />
    ...

Kırmızı:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="3001" android:versionName="1.0" package="com.example.foo">
    <supports-screens android:smallScreens="false"
        android:normalScreens="false"
        android:largeScreens="false"
        android:xlargeScreens="true" />
    ...

Teknik olarak, birden fazla APK'nın supports-screens veya compatible-screens etiketiyle çalışacağını unutmayın. Genellikle Supports-screens tercih edilir ve aynı manifest dosyasında her iki etiketi de kullanmak genellikle çok kötü bir fikirdir. Bu, işleri gereksiz yere karmaşık hale getirir ve hata yapma olasılığını artırır. Ayrıca, varsayılan değerlerden (küçük ve normal varsayılan olarak her zaman doğrudur) yararlanmak yerine manifest dosyalarının her ekran boyutu için değeri açıkça belirlediğini unutmayın. Bu, ileride baş ağrısı yaşamanızı önleyebilir. Örneğin, hedef SDK'sı 9'dan küçük bir manifest dosyasında xlarge boyutu henüz mevcut olmadığından otomatik olarak yanlış olarak ayarlanır. Bu nedenle açık olun.

Lansman öncesi yapılacaklar listenizi inceleme

Google Play'e yüklemeden önce aşağıdaki öğeleri bir kez daha kontrol edin. Bunların özellikle birden fazla APK ile ilgili olduğunu ve hiçbir şekilde Google Play'e yüklenen tüm uygulamalar için eksiksiz bir yapılacaklar listesi temsil ettiğini unutmayın.

  • Tüm APK'ların paket adı aynı olmalıdır.
  • Tüm APK'lar aynı sertifikayla imzalanmalıdır
  • APK'nızın desteklemesini istediğiniz her ekran boyutu, manifest dosyasında "true" (doğru) değerine ayarlanmalıdır. Kaçınmak istediğiniz her ekran boyutunu "yanlış" olarak ayarlayın
  • Manifest filtrelerinizde çakışan bilgiler olup olmadığını bir kez daha 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 en az bir ekran, openGL dokusu veya platform sürümü genelinde benzersiz olmalıdır.
  • Her APK'yı en az bir cihazda test etmeyi deneyin. Bunun dışında, geliştirme makinenizde işletmenizdeki en özelleştirilebilir cihaz emülatörlerinden birine sahipsiniz. Kahretsin!

Ayrıca, uygulamanızı Google Play'de gizleyebilecek sürprizler olmadığından emin olmak için derlenmiş APK'yı pazara dağıtmadan önce incelemeniz de önerilir. Bu işlem, "aapt" aracını kullanarak oldukça basittir. Aapt (Android Öğe Paketleme Aracı), Android uygulamalarınızı oluşturup paketlemek için kullanılan derleme sürecinin bir parçasıdır ve aynı zamanda bunları incelemek için ç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: 'xlarge'
supports-any-density: 'true'
locales: '--_--'
densities: '120' '160' '240'

Aapt çıkışını incelerken destek ekranları ve uyumlu ekranlar için çakışan değerlerin ve manifest'te ayarladığınız izinler sonucunda eklenmiş istenmeyen "uses-feature" değerlerinin bulunmadığından emin olun. Yukarıdaki örnekte, APK tüm cihazlarda olmasa da çoğu cihazda görünmez.

Neden? Gerekli SEND_SMS izni eklendiğinde, android.hardware.telephony özellik gereksinimi dolaylı olarak eklenmiştir. Büyük boyutlu cihazların çoğu (hepsi olmasa da) telefon donanımı bulunmayan tabletler olduğundan, Google Play bu durumlarda bu APK'yı filtreler.

Neyse ki, manifest dosyanıza aşağıdakileri ekleyerek bu sorunu kolayca düzeltebilirsiniz:

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

android.hardware.touchscreen koşulu da dolaylı olarak eklenir. APK'nızın dokunmatik ekran olmayan TV'lerde görünmesini istiyorsanız manifest dosyanıza aşağıdakileri 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. Uygulamanın Google Play'de gösterilmesi biraz zaman alabilir. Uygulama gösterildiğinde son bir kontrol yapın. Uygulamayı, APK'ların istenen cihazları hedeflediğinden emin olmak için ihtiyaç duyabileceğiniz tüm test cihazlarına indirin.

Google Play'de birden fazla APK yayınlama hakkında daha fazla bilgi için Birden fazla APK desteği başlıklı makaleyi okuyun.