Farklı GL dokuları 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'de birden fazla APK'dan yararlanmak için Android uygulamanızı geliştirirken en başından itibaren bazı iyi uygulamaları benimsemeniz ve geliştirme sürecinde gereksiz sıkıntıların yaşanmasını önlemeniz önemlidir. Bu derste, her biri farklı bir OpenGL doku biçimi alt kümesini destekleyen, uygulamanızın birden fazla APK'sını 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

Mevcut tüm Android destekli cihazlarda çalışan bir uygulama oluşturmaya çalışırken, doğal olarak uygulamanızın, aynı GL doku grubunu desteklemese de her bir cihazda en iyi şekilde görünmesini istersiniz. Başlangıçta birden fazla APK desteği en iyi çözüm gibi görünse de çoğu zaman böyle bir durum söz konusu değildir. Birden fazla APK geliştirici kılavuzunun Tek APK'yı Kullanma bölümünde, bunun tek bir APK ile nasıl gerçekleştirileceğine dair bazı yararlı bilgiler (çalışma zamanında desteklenen doku biçimlerini algılama dahil) bulabilirsiniz. Kendi durumunuza bağlı olarak, tüm biçimleri uygulamanızla birlikte gruplandırmak ve çalışma zamanında hangisinin kullanılacağını seçmek daha kolay olabilir.

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

Android Geliştirici Kılavuzu, supports-gl-texture sayfasında yaygın olarak desteklenen dokuların bazıları için kullanışlı bir referans sağlar. Bu sayfada, belirli doku biçimlerini hangi telefonların (veya telefon ailelerinin) desteklediğine dair bazı ipuçları da bulunmaktadır. APK'larınızdan birinin ETC1'i desteklemesinin genellikle iyi bir fikir olduğunu unutmayın. Çünkü bu doku biçimi, OpenGL ES 2.0 spesifikasyonunu destekleyen tüm Android destekli cihazlar tarafından desteklenir.

Android destekli cihazların çoğu birden fazla doku biçimini desteklediğinden bir tercih sırası belirlemeniz gerekir. Uygulamanızın destekleyeceği tüm biçimleri içeren bir grafik oluşturun. En soldaki hücre en düşük öncelikli olur (büyük olasılıkla, performans ve uyumluluk açısından gerçekten sağlam bir varsayılan olan ETC1 olacaktır). Daha sonra, grafikte her hücre bir APK'yı temsil edecek şekilde renklendirin.

VT1 AT PowerVR

Grafikteki renklendirme, bu kılavuzu daha tek renkli hale getirmekten daha fazlasını yapıyor. Aynı zamanda ekip içi iletişimi kolaylaştırmanın da bir yolu var. Artık her APK'ya "ETC1 doku biçimlerini destekleyenler" yerine "mavi", "yeşil" veya "kırmızı" gibi adlar verebilirsiniz.

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, bazı basit kurallar 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
  • APK'nızda listelenen doku biçimlerinden herhangi biri pazardaki cihaz tarafından destekleniyorsa söz konusu cihaz uygun kabul edilir.

GL Dokuları ile ilgili olarak, bu son kural önemlidir. Bu nedenle, örneğin, aynı uygulamada farklı GL biçimleri kullanma konusunda çok dikkatli olmanız gerekir. %99 oranında PowerVR kullanırken örneğin başlangıç ekranınız için ETC1 kullanıyorsanız... Bu durumda manifest dosyanız her iki biçimi de desteklediğini gösterir. Yalnızca ETC1'i destekleyen bir cihaz uyumlu olarak kabul edilir, uygulamanız indirilir ve kullanıcı heyecan verici kilitlenme mesajları görür. Genel durum, özellikle GL doku desteğine dayanarak farklı cihazları hedeflemek için birden fazla APK kullanıyorsanız bunun APK başına bir doku biçimi olması olacaktır.

Bu durum, doku desteğini diğer iki APK boyutundan (API seviyesi ve ekran boyutu) biraz farklıdır. Her cihazın yalnızca bir API düzeyi ve bir ekran boyutu vardır. Bu aralıkların desteklenip desteklenmediği APK'ya bağlıdır. Dokular kullanıldığında, APK genellikle bir dokuyu, cihaz da pek çok dokuyu destekler. Birçok APK'yı destekleyen tek bir cihaz arasında çoğu zaman çakışma olur. Ancak çözüm aynıdır: Sürüm kodları.

Örneğin, birkaç cihaz alıp daha önce tanımlanan APK'lardan kaç tanesinin her cihaza uygun olduğuna bakın.

Foo telefon Nexus S Evo
VT1 VT1 VT1
PowerVR ATI TC

"En yüksek sürüm numarası kazananları" kuralına göre, mevcut olduğunda PowerVR ve ATI biçimlerinin ETC1 yerine tercih edildiğini varsayarsak her APK'da versionCode özelliğini kırmızı ≥ yeşil ≥ mavi olacak şekilde ayarlarsak bunları destekleyen cihazlarda hem Kırmızı hem de Yeşil, Mavi yerine her zaman seçilecektir. Hem Kırmızı hem de Yeşili destekleyen bir cihaz gelirse kırmızı seçilecektir.

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 olası 3 boyuttan birini işlediği için her APK'yı 1000'e bölmek ve oradan artımlı olmak yeterli olur. Şöyle görünebilir:

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

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="1001" android:versionName="1.0" package="com.example.foo">
    <supports-gl-texture android:name="GL_OES_compressed_ETC1_RGB8_texture" />
    ...

Yeşil:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:versionCode="2001" android:versionName="1.0" package="com.example.foo">
    <supports-gl-texture android:name="GL_AMD_compressed_ATC_texture" />
    ...

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-gl-texture android:name="GL_IMG_texture_compression_pvrtc" />
    ...

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
  • Ç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 en az bir desteklenen ekran, OpenGL dokusu veya platform sürümü genelinde 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!