Lokalizacja instalacji aplikacji

Począwszy od poziomu interfejsu API 8, możesz zezwolić na instalowanie aplikacji w pamięci zewnętrznej (np. na karcie SD urządzenia). Jest to opcjonalna funkcja, którą możesz zadeklarować w 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 zezwolić systemowi na zainstalowanie aplikacji w pamięci zewnętrznej, zmodyfikuj swój plik manifestu, aby zawierał atrybut android:installLocation w elemencie <manifest>, z wartością „preferExternal” lub „auto”. Przykład:

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

Jeśli zadeklarujesz „preferExternal”, poprosisz o zainstalowanie aplikacji w pamięci zewnętrznej, ale system nie gwarantuje, że aplikacja zostanie zainstalowana w pamięci zewnętrznej. Jeśli pamięć zewnętrzna jest pełna, system zainstaluje aplikację w pamięci wewnętrznej. Użytkownik może też przenieść aplikację między tymi dwiema lokalizacjami.

Jeśli zadeklarujesz „auto”, wskażesz, że aplikacja może zostać zainstalowana w pamięci zewnętrznej, ale nie masz preferencji co do lokalizacji instalacji. System zdecyduje, gdzie zainstalować aplikację, na podstawie kilku czynników. Użytkownik może też przenieść aplikację między tymi dwiema lokalizacjami.

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

  • Dopóki pamięć zewnętrzna jest zamontowana na urządzeniu, nie ma to wpływu na wydajność aplikacji.
  • 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 pamięci wewnętrznej urządzenia.
  • Unikalny kontener, w którym jest przechowywana aplikacja, jest szyfrowany za pomocą losowo wygenerowanego klucza, który może zostać odszyfrowany tylko przez urządzenie, na którym aplikacja została pierwotnie zainstalowana. Dlatego aplikacja zainstalowana na karcie SD działa tylko na jednym urządzeniu.
  • Użytkownik może przenieść aplikację do pamięci wewnętrznej za pomocą ustawień systemowych.

Ostrzeżenie: gdy użytkownik włączy pamięć masową USB, aby udostępniać pliki na komputerze, lub odłączy kartę SD za pomocą ustawień systemu, pamięć zewnętrzna zostanie odłączona z urządzenia, a wszystkie aplikacje działające w pamięci zewnętrznej zostaną natychmiast zamknięte.

Zgodność wsteczna

Możliwość zainstalowania aplikacji w pamięci zewnętrznej jest dostępna tylko na urządzeniach z interfejsem API na poziomie 8 (Android 2.2) lub nowszym. Obecne aplikacje, które zostały utworzone przed poziomem interfejsu API 8, zawsze będą instalowane w pamięci wewnętrznej i nie można ich przenieść do pamięci zewnętrznej (nawet na urządzeniach z interfejsem API na poziomie 8). Jeśli jednak aplikacja jest przeznaczona do obsługi interfejsu API na poziomie niższym niż 8, możesz włączyć obsługę tej funkcji na urządzeniach z interfejsem API na poziomie 8 lub nowszym i nadal zachować zgodność z urządzeniami z interfejsem API na poziomie niższym niż 8.

Aby zezwolić na instalację w pamięci zewnętrznej i zachować zgodność z wersjami starszymi niż poziom interfejsu API 8:

  1. Dodaj atrybut android:installLocation z wartością "auto" lub "preferExternal" w elemencie <manifest>.
  2. Pozostaw atrybut android:minSdkVersion bez zmian (wartość mniejsza niż „8”) i upewnij się, że kod aplikacji używa tylko interfejsów API zgodnych z tym poziomem.
  3. Aby skompilować aplikację, zmień docelowy poziom interfejsu API na 8. Jest to konieczne, ponieważ starsze biblioteki Androida nie rozpoznają atrybutu android:installLocation i nie skompilują aplikacji, jeśli ten atrybut jest obecny.

Gdy aplikacja jest instalowana na urządzeniu z interfejsem API na poziomie niższym niż 8, atrybut android:installLocation jest ignorowany, a aplikacja jest instalowana w pamięci wewnętrznej.

Uwaga: chociaż starsze platformy będą ignorować znaczniki XML, takie jak ten, musisz uważać, aby nie używać interfejsów API wprowadzonych na poziomie interfejsu API 8, gdy minSdkVersion jest mniejszy niż „8”, chyba że wykonasz niezbędne czynności, aby zapewnić zgodność wsteczną w kodzie.

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

Gdy użytkownik włączy pamięć masową USB, aby udostępniać pliki na komputerze (lub w inny sposób odmontuje lub usunie pamięć zewnętrzną), każda aplikacja zainstalowana w pamięci zewnętrznej i aktualnie działająca zostanie zamknięta. System przestanie rozpoznawać aplikację, dopóki pamięć masowa nie zostanie wyłączona, a pamięć zewnętrzna nie zostanie ponownie zamontowana na urządzeniu. Oprócz zamknięcia aplikacji i uniemożliwienia użytkownikowi korzystania z niej może to poważnie uszkodzić niektóre typy aplikacji. Aby aplikacja działała zgodnie z oczekiwaniami, nie należy zezwalać na jej instalowanie w pamięci zewnętrznej, jeśli korzysta ona z którejkolwiek z tych funkcji, ze względu na wymienione konsekwencje odmontowania pamięci zewnętrznej:

Usługi
Działająca Service zostanie zamknięta i nie zostanie ponownie uruchomiona po ponownym zamontowaniu pamięci zewnętrznej. Aplikacje powiązane z tą usługą mogą zarejestrować się w celu odbierania ACTION_EXTERNAL_APPLICATIONS_AVAILABLE intencji transmisji, która powiadamia wszystkie aplikacje niezainstalowane w pamięci zewnętrznej, gdy aplikacje zainstalowane w pamięci zewnętrznej staną się ponownie dostępne dla systemu. Po otrzymaniu tej transmisji aplikacje mogą próbować powiązać się z Twoją usługą.
Usługi alarmowe
Alarmy zarejestrowane w AlarmManager zostaną anulowane. Po ponownym zamontowaniu pamięci zewnętrznej musisz ręcznie zarejestrować wszystkie alarmy.
Edytory metod wprowadzania
Twój edytor IME zostanie zastąpiony domyślnym edytorem IME. Po ponownym zamontowaniu pamięci zewnętrznej użytkownik może otworzyć ustawienia systemowe, aby ponownie włączyć Twój edytor IME.
Animowane tapety
Działająca animowana tapeta zostanie zastąpiona domyślną animowaną tapetą. Po ponownym zamontowaniu pamięci zewnętrznej użytkownik może ponownie wybrać Twoją animowaną tapetę.
Widżety
Twój widżet zostanie usunięty z ekranu głównego. Po ponownym zamontowaniu pamięci zewnętrznej Twój widżet nie będzie dostępny dla użytkownika, dopóki system nie zresetuje aplikacji ekranu głównego (zwykle dopiero po ponownym uruchomieniu systemu).
Account Managers
Konta utworzone za pomocą AccountManager znikną do czasu ponownego zamontowania pamięci zewnętrznej.
Adaptery synchronizacji
Twój AbstractThreadedSyncAdapter i wszystkie jego funkcje synchronizacji nie będą działać do czasu ponownego zamontowania pamięci zewnętrznej.
Administratorzy urządzeń
Twój DeviceAdminReceiver i wszystkie jego funkcje administracyjne zostaną wyłączone, co może mieć nieprzewidywalne konsekwencje dla działania urządzenia, które mogą utrzymywać się po ponownym zamontowaniu pamięci zewnętrznej.
Odbiorniki transmisji nasłuchujące „boot completed”
System dostarcza transmisję ACTION_BOOT_COMPLETED przed zamontowaniem pamięci zewnętrznej na urządzeniu. Jeśli aplikacja jest zainstalowana w pamięci zewnętrznej, nigdy nie będzie mogła odebrać tej transmisji.

Jeśli aplikacja korzysta z którejkolwiek z wymienionych powyżej funkcji, nie należy zezwalać na jej instalowanie w pamięci zewnętrznej. Domyślnie system nie zezwoli na zainstalowanie aplikacji w pamięci zewnętrznej, więc nie musisz się martwić o swoje dotychczasowe aplikacje. Jeśli jednak masz pewność, że aplikacja nigdy nie powinna być instalowana w pamięci zewnętrznej , wyraźnie to zaznacz, deklarując android:installLocation z wartością „internalOnly”. Nie zmienia to domyślnego zachowania , ale wyraźnie stwierdza, że aplikacja powinna być instalowana tylko w pamięci wewnętrznej i przypomina Tobie oraz innym programistom, że taka decyzja została podjęta.

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

Mówiąc prosto, wszystko, co nie korzysta z funkcji wymienionych w poprzedniej sekcji, jest bezpieczne po zainstalowaniu w pamięci zewnętrznej. Duże gry to najczęściej typy aplikacji, które powinny zezwalać na instalację w pamięci zewnętrznej, ponieważ gry zwykle nie zapewniają dodatkowych usług, gdy są nieaktywne. Gdy pamięć zewnętrzna stanie się niedostępna, a proces gry zostanie zamknięty, po ponownym udostępnieniu pamięci i ponownym uruchomieniu gry przez użytkownika nie powinno być widocznych efektów (zakładając, że gra prawidłowo zapisała swój stan podczas normalnego cyklu życia aktywności).

Jeśli plik APK aplikacji zajmuje kilka megabajtów, zastanów się, czy zezwolić na instalowanie aplikacji w pamięci zewnętrznej, aby użytkownicy mogli zaoszczędzić miejsce w pamięci wewnętrznej.

Dodatkowe informacje na ten temat znajdziesz w artykule: <manifest>.