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 optimize edilmiş APK'ları otomatik olarak 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ınlama yapmıyorsanız, ancak her APK'yı kendiniz oluşturmanız, imzalamanız ve yönetmeniz gerekiyorsa birden fazla APK yayınlamak yararlıdır.
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 birbirinden biraz farklı API düzeyleri aralığını kapsayan birden fazla APK'yı nasıl oluşturacağınız açıklanmaktadır. Ayrıca, birden fazla APK kod tabanını mümkün olduğunca sorunsuz bir şekilde yönetmek için gerekli bazı araçlara da sahip olursunuz.
Birden fazla APK'ya ihtiyacınız olduğunu onaylama
Android platformunun birden fazla neslinde çalışacak bir uygulama oluştururken, uygulamanızın geriye dönük uyumluluktan ödün vermeden yeni cihazlardaki yeni özelliklerden yararlanmasını doğal olarak istersiniz. Başlangıçta en iyi çözüm birden fazla APK'nın desteği gibi görünse de bu durum çoğu zaman geçerli değildir. Birden çok APK geliştirici kılavuzunun Yerine Tek APK Kullanma bölümü, destek kitaplığımızın kullanımı da dahil olmak üzere bunu tek bir APK ile nasıl gerçekleştireceğinizle ilgili bazı yararlı bilgiler içerir. Ayrıca, tek bir APK'da yalnızca belirli API seviyelerinde çalışan kodları nasıl yazacağınızı, ancak bu makaledeki düşünme gibi işlem gücü yüksek tekniklere başvurmadan da öğrenebilirsiniz.
Bunu yönetebiliyorsanız, 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 daha kolaydır
- Yalnızca bir kod tabanı vardır.
- Uygulamanız, cihaz yapılandırması 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 özlediğiniz ve birden fazla APK'nın uygulamanız için doğru yol olduğunu belirlediğiniz varsayılır.
Gereksinimlerinizi belirtin
Kaç APK'ya ihtiyacınız olduğunu ve her bir APK'nın hangi API aralığını kapsadığını hızlı bir şekilde belirlemek için basit bir grafik oluşturarak başlayın. Android Developers web sitesindeki 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 bulabilirsiniz. Ayrıca, ilk başta kolay gibi görünse de her APK'nın hedefleyeceği API düzeyi grubunu takip etmek, özellikle de çakışmalar varsa (genellikle olur) oldukça kısa sürede zor olur. Neyse ki gereksinimlerinizi hızlı ve kolay bir şekilde listelemek ve daha sonra kullanmak üzere kolayca başvuru yapmak kolaydır.
Birden fazla APK grafiğinizi oluşturmak için Android platformunun çeşitli API düzeylerini temsil eden bir hücre satırı ile başlayın. Android'in gelecekteki sürümlerini temsil etmek için sonuna 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 renklendirme yapın. Her APK'yı belirli bir API düzeyleri aralığına nasıl uygulayabileceğinize dair bir örneği burada bulabilirsiniz.
3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | + |
Bu grafiği oluşturduktan sonra ekibinize dağıtın. Projenizde ekip iletişimi artık çok daha kolay. Artık "3 ila 6 API düzeyleri için APK nasıl? Yani Android 1.x için APK. Bu konuda nasıl ilerlediniz?" Yalnızca "Mavi APK nasıl geliyor?" diyebilirsiniz.
Tüm ortak kod ve kaynakları bir kitaplık projesine yerleştirme
İster mevcut bir Android uygulamasında değişiklik yapın ister sıfırdan bir uygulamaya başlayın, kod tabanında yapmanız gereken ilk ve en önemli şey budur. 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 fazla değişmeyecek kodlar da kitaplık projesine eklenmelidir. APK'dan APK'ya bir veya iki yöntem eklemek için bu sınıfları genişletmeniz gerekebilir.
Öte yandan, uygulamayı sıfırdan oluşturuyorsanız mümkün olduğunca önce kitaplık projesinde kod yazmayı deneyin. Ardından, yalnızca gerekirse kodu ayrı 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ı gerekir ancak paket adını kitaplıkla paylaşmaları 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ğinin olması, tüm uygulama başlatma işlemlerini tek bir yere koymanızı sağlar. Böylece her bir APK'nın, Analytics'i başlatma, lisans kontrollerini çalıştırma ve APK'dan APK'ya çok fazla değişmeyen diğer başlatma prosedürleri gibi "evrensel" görevleri tekrar uygulaması gerekmez.
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 ele alalım ve APK'lardan hiçbiri için maksimum API düzeyi belirlemediğimizi varsayalım. Ayrı ayrı 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 renk olduğunu biliyoruz. Bu nedenle, grafiği şu şekilde daraltabiliriz:
3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | + |
Şimdi de Red APK'nın, diğer ikisinde olmayan bazı gereksinimleri olduğunu varsayalım. Android Geliştirici kılavuzunun Google Play'deki Filtreler sayfasında olası sorunların tam bir listesi bulunmaktadır. Örneğin, kırmızı için ön kamera gerektiğini varsayalım. Aslında kırmızı APK'nın amacı, ön kamerayı API 11'e eklenen yeni ve tatlı işlevlerle birleştirmektir. Ancak API 11'i destekleyen bazı cihazların ön kameraları bile DEĞİL! Korkunç!
Neyse ki kullanıcı bu tür bir cihazdan Google Play'e göz atıyorsa Google Play manifest dosyasını inceler, Red'in ön kamerayı şart olarak listelediğini görür ve Red ile söz konusu cihazın dijital cennette bir eşleşme olmadığını belirledikten sonra uygulamayı sessizce yoksayar. Ardından Yeşil'in yalnızca API 11'e sahip cihazlarla ileriye dönük olarak uyumlu olduğunu (maxSdkVersion tanımlanmadığından) aynı zamanda ön kamera olup olmadığını da görür. Ön kamerayla ilgili soruna rağmen, söz konusu API düzeyini destekleyen bir APK hâlâ mevcut olduğu için uygulama, kullanıcılar 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 3 olası boyuttan biriyle ilgilendiğinden, her APK'yı 1.000'e bölmek, ilk birkaç haneyi söz konusu APK için minSdkVersion olarak ayarlamak ve oradan itibaren artırmak yeterli olacaktır. Bu, aşağıdaki gibi görünebilir:
Mavi: 03001, 03002, 03003, 03004...
Yeşil: 07001, 07002, 07003, 07004...
Kırmızı:11001, 11002, 11003, 11004...
Tüm bunları bir araya getirdiğimizde Android manifest'leriniz büyük olasılıkla 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 inceleme
Google Play'e yüklemeden önce aşağıdaki öğeleri bir kez daha kontrol edin. Bu noktaların özellikle birden fazla APK ile ilgili olduğunu ve Google Play'e yüklenen tüm uygulamalar için eksiksiz bir yapılacaklar listesi olmadığını unutmayın.
- Tüm APK'ların paket adı aynı 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
- Manifest filtrelerinizi çelişen bilgilere karşı 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 ekran, OpenGL dokusu veya platform sürümlerinden en az birinde benzersiz olmalıdır
- Her APK'yı en az bir cihazda test etmeyi deneyin. Bunun dışında, geliştirme makinenizde, şirketteki en özelleştirilebilir cihaz emülatörlerinden birine sahipsiniz. İyi eğlenceler.
Uygulamanızı Google Play'de gizleyebilecek herhangi bir sürpriz olmadığından emin olmak için pazara sunmadan önce derlenmiş APK'yı incelemeniz önerilir. Bu işlem, "aapt" aracını kullanarak oldukça basittir. Aapt (Android Öğe Paketleme Aracı), Android uygulamalarınızı oluşturma ve paketleme işleminin bir parçasıdır ve uygulamaları 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 çıkışını incelerken supports-screens ve compatible-screens için çakışan değerlere sahip olmadığınızdan ve manifest dosyasında ayarladığınız izinler sonucunda eklenen istenmeyen "uses-feature" değerlerine sahip olmadığınızdan emin olun. Yukarıdaki örnekte, APK çok fazla cihaz tarafından görülemez.
Neden? Gerekli SEND_SMS izni eklendiğinde android.hardware.telephony özelliğinin koşulu dolaylı olarak eklendi. API 11, Honeycomb olduğundan (özel olarak tabletler için optimize edilmiş Android sürümü) ve hiçbir Honeycomb cihazının telefon donanımı olmadığından, Google Play ileride bu APK'yı her durumda filtreler. Bu cihazlar API düzeyi daha yüksek olan ve telefon donanımına sahip olana kadar ilerideki cihazlar için geçerli olur.
Neyse ki bu sorun, aşağıdakileri manifest dosyanıza ekleyerek kolayca düzeltilebilir:
<uses-feature android:name="android.hardware.telephony" android:required="false" />
android.hardware.touchscreen
şartı 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. APK'ların amaçlanan cihazları hedeflediğinden emin olmak için uygulamayı sahip olabileceğiniz tüm test cihazlarına indirin. Tebrikler, tamamladınız!