Birkaç boyutlu 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ız için her biri farklı 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ı mümkün olduğunca zahmetsiz hale getirmek için gereken bazı araçları da alacaksınız.

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

Kullanılabilen çok sayıda farklı Android cihazda çalışan bir uygulama oluşturmaya çalışırken, doğal olarak uygulamanızın her cihazda en iyi şekilde görünmesini istersiniz. Büyük ekranların alanından faydalanmakla birlikte, son teknoloji cihazlarda bulunan yeni Android API özelliklerini veya görsel dokularını kullanmak ama eski ekranlardan vazgeçmemek için küçük ekranlarda çalışmaya devam etmek 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. Çoklu APK kılavuzunun Bunun yerine Tek APK'yı Kullanma bölümünde, tüm bunları tek bir APK ile nasıl gerçekleştirebileceğinize dair bazı faydalı bilgiler (ör. destek kitaplığımızın kullanımı) ve Android Geliştirici kılavuzundaki kaynakların bağlantıları yer alır.

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 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ş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 ekran boyutlarını kapsadığını hızlıca belirlemek için basit bir grafik oluşturarak başlayın. Neyse ki gereksinimlerinizi hızlı ve kolay bir şekilde kolayca belirleyebilir, daha sonra kolayca başvurabilirsiniz. APK'larınızı iki boyuta (API ve ekran boyutu) bölmek istediğinizi varsayalım. Olası her değer çifti için bir satır ve sütun, her biri de bir APK'yı temsil eden bazı "blob'lar" içinde renkler içeren bir tablo oluşturun.

3 4 5 6 7 8 9 10 11 12 +
küçük
normal
büyük
xlarge

Yukarıda dört APK içeren bir örnek gösterilmektedir. Mavi tüm küçük/normal ekranlı cihazlar, Yeşil ise büyük ekranlı cihazlar, Kırmızı ise 3-10 API aralığını kapsayan büyük ekranlı cihazlar içindir. Mor, tüm ekran boyutlarında olduğu için yalnızca API 11 ve sonraki sürümler için özel bir durumdur. Daha önemlisi ise sadece bu grafiğe bakarak hangi APK'nın belirli bir API/ekran boyutu kombinasyonunu kapsayacağını hemen anlayabilirsiniz. Öncelikle, "3-10 xlarge APK'yı Xoom'a karşı test ettik mi?" yerine "Kırmızıyı üzerinde kırmızı test ettik mi?" Bu tabloyu yazdırın ve kod tabanınız üzerinde çalışan herkese verin. Hayat artık çok daha kolay.

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-purple
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 her APK'nın, "hedef" ekran boyutundan büyük tüm ekran boyutlarını destekleyecek şekilde ayarlandığını varsayalım. Daha önce verilen örnek grafiğe bakalım:

3 4 5 6 7 8 9 10 11 12 +
küçük
normal
büyük
xlarge

Kapsamın çakışmasının sorun oluşturabileceğinden, her APK'nın kapsadığı alanı şu şekilde açıklayabiliriz:

  • Mavi tüm ekranları kapsar, SDK 3.
  • Yeşil, büyük ekranları ve daha üst sürümleri, minSDK 3'ü kaplar.
  • Kırmızı, çok büyük ekranları (genellikle tabletler) kapsar, SDK en az 9.
  • Mor, tüm ekranları kaplar, SDK'sı en az 11 olabilir.

Bu kurallarda çok örtüşme olduğunu unutmayın. Örneğin, API 11'e sahip bir XLarge cihaz belirtilen 4 APK'dan herhangi birini çalıştırabilir. Bununla birlikte, "en yüksek sürüm numarası kazanan" kuralını kullanarak aşağıdaki gibi bir tercih sırası belirleyebiliriz:

Mor ≥ Kırmızı ≥ Yeşil ≥ Mavi

Tüm örtüşmelere neden izin vermelisiniz? Mor APK'da diğer ikisinin bulunmadığı bir gereksinim olduğunu varsayalım. Android Geliştirici kılavuzunun Google Play'deki filtreler sayfasında olası nedenlerin tam listesi bulunmaktadır. Örnek olması açısından, Purple uygulamasının önden kameraya ihtiyacı olduğunu varsayalım. Aslında Purple'ın amacı öndeki kamerayla eğlenceli şeyler kullanmaktır! Ancak API 11 ve üstü cihazların hepsinin ön kamerası VAR! Korku dolu!

Neyse ki, kullanıcı bu tür bir cihazdan Google Play'e göz atıyorsa Google Play bu manifeste bakar, Mor'un zorunlu olarak ön kamerayı belirttiğini görür ve Mor ile bu cihazın dijital cennette yer almadığını tespit ederek bunu sessizce göz ardı eder. Böylece, Red'in yalnızca büyük ekranlarla uyumlu olmadığını, aynı zamanda ön tarafa bakan bir kameranın olup olmamasının da önemini umursamadığını görüyor. Ön kameradaki aksaklığa rağmen söz konusu API düzeyini destekleyen bir APK hâlâ mevcut olduğundan uygulama kullanıcı tarafından yine de Google Play'den indirilebilir.

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. Bölümün tamamını okumak buna değebilir, ancak bu APK grubunun temel amacı, minSDK'yı temsil etmek için iki basamak, min/maks ekran boyutunu temsil etmek için iki basamak ve derleme numarasını temsil etmek için 3 rakamı kullanmamız gerektiğidir. Bu şekilde, cihaz yeni bir Android sürümüne yükseltildiğinde (örneğin, 10'dan 11'e) şu anda uygun olan ve şu anda yüklü olan APK yerine tercih edilen APK'lar cihaz tarafından "yükseltme" olarak görülür. Örnek APK grubuna uygulandığında sürüm numarası şeması aşağıdaki gibi görünebilir:

Mavi: 0304001, 0304002, 0304003...
Yeşil: 0334001, 0334002, 0334003
Kırmızı: 0344001, 0344002, 0344003...
Mor: 1104001, 1104002, 1104003...

Bunların tümü bir araya getirildiğinde 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="0304001" android:versionName="1.0" package="com.example.foo">
    <uses-sdk android:minSdkVersion="3" />
    <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="0334001" android:versionName="1.0" package="com.example.foo">
    <uses-sdk android:minSdkVersion="3" />
    <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="0344001" android:versionName="1.0" package="com.example.foo">
    <uses-sdk android:minSdkVersion="3" />
    <supports-screens android:smallScreens="false"
        android:normalScreens="false"
        android:largeScreens="false"
        android:xlargeScreens="true" />
    ...

Mor:

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

Teknik olarak, birden fazla APK'nın Support-screen etiketi veya uyumlu ekran etiketiyle çalışacağını unutmayın. Ekran desteği genellikle tercih edilir ve genellikle ikisini de kullanmak kötü bir fikirdir. İşleri gereksiz yere karmaşık hale getirir ve hata 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, manifestlerin her ekran boyutu için değeri açıkça ayarladığını unutmayın. Bu işlem sizi zaman sıkıntısına sokabilir. Örneğin, hedef SDK'sı 9'un altında olan bir manifestte xlarge otomatik olarak false (yanlış) değerine ayarlanır, çünkü bu boyut henüz var değildir. Açık olun.

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 ilgili 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ünde çakışıyorsa minSdkVersion değeri daha yüksek olan APK'nın sürüm kodu daha yüksek olmalıdır.
  • APK'nızın desteklemesini istediğiniz her ekran boyutu, manifest dosyasında true (doğru) değerine ayarlanır. Kaçınmasını istediğiniz her ekran boyutunu "false" (yanlış) değerine ayarlayın.
  • Çakışan bilgiler olup olmadığını görmek için manifest filtrelerinizi tekrar kontrol edin (sadece XLARGE ekranlarında cupcake'i destekleyen bir APK'yı hiç kimse görmez)
  • Her APK'nın manifesti, desteklenen ekran, OpenGL dokusu veya platform sürümünden 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: '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, tüm cihazlar veya çoğu 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. xlarge cihazların çoğu (tümü değilse) içinde telefon donanımı bulunmayan tabletler olduğundan Google Play, ileride xlarge ekran boyutu olarak raporlayacak kadar büyük ve telefon donanımına sahip cihazlar gelene kadar bu gibi durumlarda APK'yı 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ına indirin. Tebrikler, başardınız!