Lokalizacja instalacji aplikacji

Począwszy od poziomu API 8 możesz zezwolić na instalowanie aplikacji w pamięci zewnętrznej (na przykład na karcie SD urządzenia). Jest to opcjonalna funkcja, którą możesz zadeklarować w swojej aplikacji za pomocą atrybutu manifestu android:installLocation. Jeśli nie zadeklarujesz tego atrybutu, aplikacja zostanie zainstalowana tylko w pamięci wewnętrznej i nie będzie można jej przenieść do pamięci zewnętrznej.

Aby umożliwić systemowi zainstalowanie Twojej aplikacji w pamięci zewnętrznej, zmodyfikuj plik manifestu przez dodanie atrybutu android:installLocation w elemencie <manifest> o wartości „preferExternal” lub „auto”. Na przykład:

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

Zadeklarowanie „preferExternal” oznacza, że aplikacja zostanie zainstalowana w pamięci zewnętrznej, ale system nie gwarantuje, że zostanie ona zainstalowana. Jeśli pamięć zewnętrzna jest pełna, system zainstaluje ją w tej pamięci. Użytkownik może również przenosić aplikację między tymi dwoma lokalizacjami.

Zadeklarowanie „auto” oznacza, że aplikacja może być zainstalowana w pamięci zewnętrznej, ale nie masz preferencji dotyczących lokalizacji instalacji. System zdecyduje, gdzie zainstalować aplikację, na podstawie kilku czynników. Użytkownik może też przenosić aplikację między obiema lokalizacjami.

Gdy aplikacja jest zainstalowana w pamięci zewnętrznej:

  • Nie wpływa to na wydajność aplikacji, o ile na urządzeniu jest podłączona pamięć zewnętrzna.
  • Plik .apk jest zapisywany w pamięci zewnętrznej, ale wszystkie prywatne dane użytkownika, bazy danych, zoptymalizowane pliki .dex i wyodrębniony kod natywny są zapisywane w wewnętrznej pamięci urządzenia.
  • Unikalny kontener, w którym przechowywana jest Twoja aplikacja, jest szyfrowany losowo wygenerowanym kluczem, który może odszyfrować tylko urządzenie, na którym aplikacja została zainstalowana. Oznacza to, że aplikacja zainstalowana na karcie SD będzie działać tylko na jednym urządzeniu.
  • Użytkownik może przenieść aplikację do pamięci wewnętrznej w ustawieniach systemu.

Ostrzeżenie: gdy użytkownik włączy pamięć masową USB na potrzeby udostępniania plików komputerowi lub odłączy kartę SD w ustawieniach systemu, pamięć zewnętrzna zostanie odłączona od urządzenia, a wszystkie działające w niej aplikacje zostaną natychmiast wyłączone.

Zgodność wsteczna

Możliwość instalowania aplikacji w pamięci zewnętrznej jest dostępna tylko na urządzeniach z interfejsem API poziomu 8 (Android 2.2) lub nowszego. Istniejące aplikacje utworzone przed poziomem API 8 będą zawsze instalowane w pamięci wewnętrznej i nie będzie można ich przenieść do pamięci zewnętrznej (nawet na urządzeniach z interfejsem API poziomu 8). Jeśli Twoja aplikacja obsługuje interfejs API na poziomie niższym niż 8, możesz włączyć tę funkcję na urządzeniach z interfejsem API na poziomie 8 lub wyższym i zachować zgodność z urządzeniami używającymi interfejsu API niższego niż 8.

Aby zezwolić na instalację w pamięci zewnętrznej i zachować zgodność z wersjami wcześniejszymi niż API poziomu 8:

  1. Dodaj atrybut android:installLocation o wartości „auto” lub „preferExternal” w elemencie <manifest>.
  2. Pozostaw atrybut android:minSdkVersion bez zmian (wartość mniej niż 8”) i upewnij się, że Twój kod aplikacji używa tylko interfejsów API zgodnych z tym poziomem.
  3. Aby skompilować aplikację, zmień cel kompilacji na poziom 8. Jest to konieczne, ponieważ starsze biblioteki Androida nie rozpoznają atrybutu android:installLocation i nie skompilują aplikacji, jeśli będzie ona dostępna.

W przypadku instalacji aplikacji na urządzeniu z poziomem interfejsu API niższym niż 8 atrybut android:installLocation jest ignorowany, a aplikacja jest instalowana w pamięci wewnętrznej.

Uwaga: chociaż takie znaczniki XML będą ignorowane przez starsze platformy, musisz uważać, aby nie używać interfejsów API programowania wprowadzonych w interfejsie API poziomu 8, gdy minSdkVersion ma wartość mniejszą niż „8”, chyba że zapewnisz zgodność wsteczną w kodzie.

Aplikacje, których NIE należy instalować w pamięci zewnętrznej

Gdy użytkownik włączy pamięć masową USB na potrzeby udostępniania plików komputerowi (lub w inny sposób odłączy lub usunie taką pamięć), każda aplikacja zainstalowana w pamięci zewnętrznej i obecnie uruchomiona zostanie zakończona. System staje się nieświadomy aplikacji, dopóki pamięć masowa nie zostanie wyłączona i pamięć zewnętrzna nie zostanie ponownie podłączona do urządzenia. Poza zamknięciem aplikacji i uniemożliwieniem jej użytkownikowi może to spowodować poważniejsze problemy z niektórymi aplikacjami. Aby aplikacja działała konsekwentnie w oczekiwany sposób, nie zezwalaj na jej instalowanie w pamięci zewnętrznej, jeśli korzysta ona z wymienionych niżej funkcji. Wynika to z tego, że pamięć zewnętrzna jest odłączona:

Usługi
Uruchomienie systemu Service zostanie zakończone i nie zostanie uruchomione ponownie po podłączeniu pamięci zewnętrznej. Aplikacje powiązane z tą usługą mogą rejestrować się w intencji transmisji ACTION_EXTERNAL_APPLICATIONS_AVAILABLE. Informuje ona wszystkie aplikacje, które nie zostały zainstalowane w pamięci zewnętrznej, o ponownym udostępnieniu aplikacji zainstalowanych w pamięci zewnętrznej. Po otrzymaniu tej transmisji aplikacje mogą podjąć próbę powiązania z Twoją usługą.
Usługi alarmowe
Twoje alarmy zarejestrowane na koncie AlarmManager zostaną anulowane. Po ponownym podłączeniu pamięci zewnętrznej musisz ponownie zarejestrować wszystkie alarmy ręcznie.
Mechanizmy metody wprowadzania
Twój IME zostanie zastąpiony przez domyślny edytor. Po ponownym podłączeniu pamięci zewnętrznej użytkownik może otworzyć ustawienia systemu, aby ponownie włączyć edytor IME.
Animowane tapety
Aktywna animowana tapeta zostanie zastąpiona domyślną animowaną tapetą. Po ponownym podłączeniu pamięci zewnętrznej użytkownik może ponownie wybrać animowaną tapetę.
Widżety
Twój widżet aplikacji zostanie usunięty z ekranu głównego. Po ponownym podłączeniu pamięci zewnętrznej użytkownik nie będzie mógł wybrać widżetu aplikacji, dopóki system nie zresetuje aplikacji ekranu głównego (zwykle jest to możliwe dopiero po ponownym uruchomieniu systemu).
Menedżerowie konta
Konta utworzone za pomocą AccountManager znikną, dopóki pamięć zewnętrzna nie zostanie ponownie podłączona.
Adaptery do synchronizacji
Urządzenie AbstractThreadedSyncAdapter i wszystkie jego funkcje synchronizacji nie będą działać, dopóki pamięć zewnętrzna nie zostanie ponownie podłączona.
Administratorzy urządzenia
Urządzenie DeviceAdminReceiver i wszystkie jego funkcje administracyjne zostaną wyłączone, co może mieć nieprzewidywalny wpływ na działanie urządzenia, które może utrzymywać się po ponownym podłączeniu pamięci zewnętrznej.
Odbiorniki nasłuchują na komunikat „ukończono uruchamianie”
System dostarcza transmisję ACTION_BOOT_COMPLETED, zanim na urządzeniu zostanie podłączona pamięć zewnętrzna. Jeśli aplikacja jest zainstalowana w pamięci zewnętrznej, nie może nigdy odebrać tej transmisji.

Jeśli Twoja aplikacja korzysta z funkcji wymienionych powyżej, nie zalecamy jej instalowania w pamięci zewnętrznej. Domyślnie system nie zezwala na instalowanie Twojej aplikacji w pamięci zewnętrznej, więc nie musisz przejmować się istniejącymi aplikacjami. Jeśli jednak masz pewność, że Twoja aplikacja nigdy nie powinna być instalowana w pamięci zewnętrznej, wyraźnie to zaznacz, zadeklarując android:installLocation z wartością „internalOnly”. Chociaż nie zmienia to domyślnego działania, wyraźnie wskazuje się, że aplikację należy instalować tylko w pamięci wewnętrznej oraz przypominamy Tobie i innym deweloperom, że ta decyzja została podjęta.

Aplikacje, które należy zainstalować w pamięci zewnętrznej

Mówiąc prościej, wszystkie aplikacje, które nie korzystają z funkcji wymienionych w poprzedniej sekcji, są bezpieczne po zainstalowaniu w pamięci zewnętrznej. Tego typu aplikacje zazwyczaj powinny umożliwiać instalację w pamięci zewnętrznej, ponieważ gry zwykle nie oferują dodatkowych usług, gdy jest ono nieaktywne. Gdy pamięć zewnętrzna stanie się niedostępna i proces gry zostanie zamknięty, nie powinno to mieć widocznych efektów, gdy pamięć stanie się dostępna, a użytkownik ponownie uruchomi grę (przy założeniu, że gra prawidłowo zapisała swój stan w normalnym cyklu aktywności).

Jeśli Twoja aplikacja wymaga miejsca na plik APK o kilku megabajtach, zastanów się, czy chcesz zezwolić na instalację aplikacji w pamięci zewnętrznej, tak by użytkownicy mogli zaoszczędzić miejsce w pamięci wewnętrznej.

Dodatkowe informacje znajdziesz tutaj: <manifest>