Uygulama yükleme konumu

API düzeyi 8'den itibaren, uygulamanızın harici depolama alanına (ör. cihazın SD kartı) yüklenmesine izin verebilirsiniz. Bu, android:installLocation manifest özelliğiyle uygulamanız için tanımlayabileceğiniz isteğe bağlı bir özelliktir. Bu özelliği bildirmezseniz uygulamanız yalnızca dahili depolama alanına yüklenir ve harici depolama alanına taşınamaz.

Sistemin uygulamanızı harici depolama alanına yüklemesine izin vermek için manifest dosyanızı <manifest> öğesine android:installLocation özelliğini içerecek şekilde değiştirin. Bu özelliğin değeri "preferExternal" veya "auto" olmalıdır. Örneğin:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    android:installLocation="preferExternal"
    ... >

"preferExternal" değerini belirtirseniz uygulamanızın harici depolama alanına yüklenmesini istersiniz ancak sistem, uygulamanızın harici depolama alanına yükleneceğini garanti etmez. Harici depolama alanı doluysa sistem, uygulamayı dahili depolama alanına yükler. Kullanıcı, uygulamanızı iki konum arasında da taşıyabilir.

"auto" beyan ederseniz uygulamanızın harici depolama alanına yüklenebileceğini belirtirsiniz ancak yükleme konumuyla ilgili bir tercihinizi belirtmezsiniz. Sistem, uygulamanızı nereye yükleyeceğine çeşitli faktörlere göre karar verir. Kullanıcı, uygulamanızı iki konum arasında da taşıyabilir.

Uygulamanız harici depolama alanına yüklendiğinde:

  • Harici depolama alanı cihaza monte edildiği sürece uygulama performansı etkilenmez.
  • .apk dosyası harici depolama alanına kaydedilir ancak tüm özel kullanıcı verileri, veritabanları, optimize edilmiş .dex dosyaları ve çıkarılan yerel kodlar cihazın dahili belleğine kaydedilir.
  • Uygulamanızın depolandığı benzersiz kapsayıcı, yalnızca ilk yükleyen cihaz tarafından şifresi çözülebilen rastgele oluşturulmuş bir anahtarla şifrelenir. Bu nedenle, SD karta yüklenen bir uygulama yalnızca bir cihazda çalışır.
  • Kullanıcı, sistem ayarlarından uygulamanızı dahili depolama alanına taşıyabilir.

Uyarı: Kullanıcı, dosyaları bilgisayarla paylaşmak için USB yığın depolama özelliğini etkinleştirdiğinde veya SD kartı sistem ayarları üzerinden söktüğünde harici depolama alanı cihazdan sökülür ve harici depolama alanında çalışan tüm uygulamalar hemen kapatılır.

Geriye dönük uyumluluk

Uygulamanızın harici depolama alanına yüklenebilmesi yalnızca API düzeyi 8 (Android 2.2) veya daha yüksek sürümlerin yüklü olduğu cihazlarda kullanılabilen bir özelliktir. API düzeyi 8'den önce oluşturulan mevcut uygulamalar her zaman dahili depolama alanına yüklenir ve harici depolama alanına taşınamaz (API düzeyi 8 olan cihazlarda bile). Ancak uygulamanız 8'den daha düşük bir API düzeyini destekleyecek şekilde tasarlanmışsa bu özelliği API düzeyi 8 veya daha yüksek olan cihazlarda desteklemeyi seçebilir ve yine de API düzeyi 8'den düşük olan cihazlarla uyumlu olabilirsiniz.

Harici depolama alanına yüklemeye izin vermek ve API seviyesi 8'den düşük sürümlerle uyumlu kalmak için:

  1. <manifest> öğesine "auto" veya "preferExternal" değerine sahip android:installLocation özelliğini ekleyin.
  2. android:minSdkVersion özelliğinizi olduğu gibi bırakın (8'den küçük bir değer) ve uygulama kodunuzun yalnızca bu düzeyle uyumlu API'leri kullandığından emin olun.
  3. Uygulamanızı derlemek için derleme hedefinizi API düzeyi 8 olarak değiştirin. Eski Android kitaplıkları android:installLocation özelliğini anlamadığından ve bu özellik mevcutken uygulamanızı derlemediğinden bu işlem gereklidir.

Uygulamanız API düzeyi 8'den düşük olan bir cihaza yüklendiğinde android:installLocation özelliği yoksayılır ve uygulama dahili depolama alanına yüklenir.

Dikkat: Bu gibi XML işaretlemeleri eski platformlar tarafından yoksayılsa da kodunuzda geriye dönük uyumluluk sağlamak için gerekli çalışmaları yapmadığınız sürece minSdkVersion değeriniz "8"den küçükken API düzeyi 8'de kullanıma sunulan programlama API'lerini kullanmamaya dikkat etmeniz gerekir.

Harici depolama alanına YÜKLENMEMESİ gereken uygulamalar

Kullanıcı, dosyaları bilgisayarıyla paylaşmak için USB yığın depolama özelliğini etkinleştirdiğinde (veya harici depolama alanını başka bir şekilde çıkarıp kaldırdığında) harici depolama alanına yüklenen ve şu anda çalışan tüm uygulamalar kapatılır. Yığın depolama devre dışı bırakılıp harici depolama cihazda yeniden monte edilene kadar sistem, uygulamadan haberdar olmaz. Bu durum, uygulamayı sonlandırıp kullanıcı için kullanılamaz hale getirmenin yanı sıra bazı uygulama türlerinde daha ciddi sorunlara yol açabilir. Uygulamanızın tutarlı bir şekilde beklendiği gibi davranması için, aşağıdaki özelliklerden herhangi birini kullanıyorsa uygulamanızın harici depolama alanına yüklenmesine izin vermemelisiniz. Bunun nedeni, harici depolama alanı çıkarıldığında ortaya çıkacak sonuçlardır:

Hizmetler
Çalışan Service, harici depolama birimi yeniden bağlandığında sonlandırılır ve yeniden başlatılmaz. Bu hizmete bağlı uygulamalar, harici depolama alanına yüklenen uygulamalar sisteme tekrar sunulduğunda harici depolama alanına yüklenmemiş tüm uygulamaları bilgilendiren ACTION_EXTERNAL_APPLICATIONS_AVAILABLE yayın amacına kaydolabilir. Bu yayını aldıktan sonra uygulamalar hizmetinize bağlanmaya çalışabilir.
Alarm Hizmetleri
AlarmManager ile kaydedilen alarmlarınız iptal edilecek. Harici depolama yeniden bağlandığında tüm alarmları manuel olarak yeniden kaydetmeniz gerekir.
Giriş Yöntemi Düzenleyiciler
IME'niz varsayılan IME ile değiştirilir. Harici depolama yeniden bağlandığında kullanıcı, sistem ayarlarını açarak IME'nizi tekrar etkinleştirebilir.
Animasyonlu Duvar Kağıtları
Çalışan animasyonlu duvar kağıdınız varsayılan animasyonlu duvar kağıdıyla değiştirilir. Harici depolama alanı yeniden bağlandığında kullanıcı, Canlı Duvar Kağıdınızı tekrar seçebilir.
Uygulama Widget'ları
Uygulama widget'ınız ana ekrandan kaldırılır. Harici depolama alanı yeniden bağlandığında, sistem ana uygulamayı sıfırlayana kadar (genellikle sistem yeniden başlatılana kadar) uygulama widget'ınız kullanıcı tarafından seçilemez.
Account Managers
AccountManager ile oluşturduğunuz hesaplar, harici depolama alanı yeniden bağlanana kadar görünmez.
Senkronizasyon Adaptörleri
Harici depolama birimi yeniden monte edilene kadar AbstractThreadedSyncAdapter ve tüm senkronizasyon işlevleri çalışmaz.
Cihaz yöneticileri
DeviceAdminReceiver ve tüm yönetici özellikleri devre dışı bırakılır. Bu durum, cihaz işlevselliği açısından öngörülemeyen sonuçlara yol açabilir ve harici depolama alanı yeniden bağlandıktan sonra da devam edebilir.
"boot completed" (önyükleme tamamlandı) dinleyen yayın alıcılar
Sistem, harici depolama alanı cihaza bağlanmadan önce ACTION_BOOT_COMPLETED yayınını teslim eder. Uygulamanız harici depolama alanına yüklendiyse bu yayını hiçbir zaman alamaz.

Uygulamanız yukarıda listelenen özelliklerden herhangi birini kullanıyorsa uygulamanızın harici depolama alanına yüklenmesine izin vermemelisiniz. Sistem, varsayılan olarak uygulamanızın harici depolama alanına yüklenmesine izin vermez. Bu nedenle, mevcut uygulamalarınızla ilgili endişelenmenize gerek yoktur. Ancak uygulamanızın hiçbir zaman harici depolama alanına yüklenmemesi gerektiğinden eminseniz android:installLocation öğesini "internalOnly" değeriyle beyan ederek bunu açıkça belirtmeniz gerekir. Bu, varsayılan davranışı değiştirmese de uygulamanızın yalnızca dahili depolama alanına yüklenmesi gerektiğini açıkça belirtir ve bu kararın verildiğini size ve diğer geliştiricilere hatırlatır.

Harici depolama alanına yüklenmesi gereken uygulamalar

Basit bir ifadeyle, önceki bölümde listelenen özelliklerin kullanılmadığı her şey, harici depolama alanına yüklendiğinde güvenlidir. Büyük oyunlar, genellikle etkin olmadıklarında ek hizmetler sunmadıkları için harici depolama alanına yüklenmelerine izin verilmesi gereken uygulama türleridir. Harici depolama alanı kullanılamaz hale geldiğinde ve bir oyun işlemi sonlandırıldığında, depolama alanı tekrar kullanılabilir hale geldiğinde ve kullanıcı oyunu yeniden başlattığında (oyunun, normal Etkinlik yaşam döngüsü sırasında durumunu düzgün bir şekilde kaydettiği varsayılarak) görünür bir etki olmamalıdır.

Uygulamanızın APK dosyası için birkaç megabayt gerekiyorsa kullanıcıların dahili depolama alanlarında yer açabilmesi için uygulamanın harici depolama alanına yüklenmesine izin verip vermeyeceğinizi dikkatlice değerlendirmeniz gerekir.

İlgili ek bilgiler için şu kaynaklara bakın: <manifest>