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 bazı iyi uygulamaları benimsemek ve geliştirme sürecinin ilerleyen aşamalarında gereksiz baş ağrılarını önlemek önemlidir. Bu derste, uygulamanızın her biri biraz farklı bir API düzeyi aralığını kapsayan 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 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. İlk bakış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 geliştirici kılavuzunun 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. Ayrıca, yansıtma gibi hesaplama açısından pahalı tekniklere başvurmadan tek bir APK'da yalnızca belirli API düzeylerinde çalışan kodları nasıl yazacağınızı bu makaleden öğrenebilirsiniz.
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 sorunsuzdur
- Pazar tercihi, bir APK'dan diğerine "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ı verilen kaynaklardaki materyalleri dikkatlice incelediğiniz ve uygulamanız için birden fazla APK'nın doğru yol olduğunu belirlediğiniz varsayılır.
Gereksinimlerinizi grafikle gösterin
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. Android Developer web sitesinin Platform Sürümleri sayfası, Android platformunun belirli bir sürümünü çalıştıran etkin cihazların göreceli sayısıyla ilgili veriler sağlar. Ayrıca, başlangıçta kolay görünse de her APK'nın hangi API düzeylerini hedefleyeceğini takip etmek, özellikle de bazı çakışmalar olacaksa (genellikle olur) oldukça hızlı bir şekilde zorlaşır. Neyse ki gereksinimlerinizi hızlı ve kolay bir şekilde listelemek ve daha sonra kolayca referans olarak kullanmak çok 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 | + |
Artık grafiği, her rengin bir APK'yı temsil edecek şekilde renklendirebilirsiniz. Aşağıda, her APK'yı belirli bir API düzeyi aralığına nasıl uygulayabileceğinize dair 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. "3 ila 6 API düzeyleri için APK nasıl? Yani Android 1.x için olan APK. Bu konu nasıl gidiyor?" "Blue APK ile ilgili çalışmalar nasıl gidiyor?" demeniz yeterlidir.
Ortak kod ve kaynakların tümünü 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 bu ve en önemlisi de 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ı dışındadır. Android kitaplığı oluşturma başlıklı makaleyi okuyarak bu konuda bilgi edinebilirsiniz.
Mevcut bir uygulamayı birden fazla APK desteğini kullanacak şekilde dönüştürüyorsanız APK'lar arasında değişmeyecek her yerelleştirilmiş dize dosyası, değer listesi, tema rengi, menü simgesi ve düzen için kod tabanınızı tarayın ve hepsini kitaplık projesine ekleyin. Çok fazla değişiklik olmayacak 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 soruna yol açmadan 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 ş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 başlangıç etkinliğinizi kitaplık projesinde tanımlayın ve APK projenizde bu etkinliği genişletin. Kitaplık projesinde tanımlanmış bir başlangıç etkinliği, 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
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'te, söz konusu APK'nın uygun olduğu gösterilmelidir.
- 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. Her APK'nın olası boyut aralığı ayrı ayrı şu şekildedir:
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 bir minSdkVersion değerine sahip APK'ların daha yüksek bir sürüm koduna sahip olması gerektiğinden, versionCode değerleri açısından kırmızı ≥ yeşil ≥ mavi olduğunu biliyoruz. Bu nedenle, grafiği şu şekilde etkili bir şekilde daraltabiliriz:
3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | + |
Şimdi de Kırmızı APK'nın, diğer iki APK'da bulunmayan bazı şartlara sahip olduğunu varsayalım. Android Developers kılavuzunun Google Play'deki filtreler sayfasında, olası suçluların tam listesi yer alır. Örnek olarak, kırmızı için ön kamera gerektiğini varsayalım. Aslında, kırmızı APK'nın amacı ön kamerayı API 11'de eklenen yeni ve kullanışlı işlevlerle birleştirmektir. Ancak API 11'i destekleyen tüm cihazlarda ön kamera bile yok. 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, Green'in yalnızca API 11 yüklü cihazlarla ileriye dönük uyumlu olduğunu (maxSdkVersion tanımlanmadığı için) ve ön kamera olup olmadığını dikkate almadığını 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ına sahip olmanız ö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, şöyle 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 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 inceleme
Google Play'e yüklemeden önce aşağıdaki öğeleri tekrar 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 da daha yüksek olmalıdır.
- Manifest filtrelerinizi çelişen bilgiler açısından tekrar kontrol edin (yalnızca XLARGE ekranlarda cupcake'i destekleyen bir APK kimse tarafından görülmez).
- Her APK'nın manifest dosyası, 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 sektördeki en özelleştirilebilir cihaz emülatörlerinden birine sahipsiniz. İyi eğlenceler.
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şturma ve paketleme işleminin bir parçasıdır. Ayrıca, uygulamaları 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: '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 cihazda görünmez.
Neden? Gerekli SEND_SMS izni eklendiğinde android.hardware.telephony özelliğinin koşulu dolaylı olarak eklendi. API 11, Honeycomb'dir (Android'in tabletler için özel olarak optimize edilmiş sürümü) ve hiçbir Honeycomb cihazında telefon donanımı bulunmadığından Google Play, API düzeyi daha yüksek VE telefon donanımı bulunan cihazlar piyasaya çıkana kadar bu APK'yı her durumda filtreleyecektir.
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
koşulu da dolaylı olarak eklenir. APK'nızın dokunmatik ekranlı 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. Google Play'e göz atarken uygulamanın görünmesi biraz zaman alabilir. Uygulama göründüğünde 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, işlemi tamamladınız.