Jeśli kiedykolwiek próbowałeś zarządzać plikami na urządzeniu z Androidem, zapewne zauważyłeś, że działanie systemu zależy od używanej wersji Androida. Począwszy od Androida 10, firma Google wprowadziła fundamentalną zmianę w sposobie, w jaki aplikacje komunikują się z systemem plików. Zmiana ta, znana jako pamięć o ograniczonym zakresie (Scoped Storage), na nowo zdefiniowała zasady odczytu i zapisu plików we współdzielonej pamięci masowej. Dla użytkowników instalujących aplikacje spoza sklepu, zarządzających plikami OBB lub korzystających z menedżerów plików zrozumienie tego mechanizmu jest kluczowe.
W tym artykule dowiemy się, czym jest pamięć o określonym zakresie, dlaczego Google ją wdrożyła, jak wpływa na zwykłych użytkowników i programistów oraz co to oznacza dla każdego, kto instaluje pliki APK lub XAPK poza Sklepem Play.
Problem ze starym modelem pamięci masowej
Przed Androidem 10 każda aplikacja, która zażądała pozwolenia READ_EXTERNAL_STORAGE lub WRITE_EXTERNAL_STORAGE, mogła uzyskać dostęp do praktycznie dowolnego pliku we współdzielonej pamięci urządzenia. Dotyczyło to zdjęć, dokumentów, plików do pobrania, a nawet plików utworzonych przez inne aplikacje. Chociaż ułatwiało to zarządzanie plikami, stwarzało poważne obawy dotyczące prywatności i bezpieczeństwa.
Rozważ prostą aplikację latarki. W starym modelu, jeśli udzieliłeś mu pozwolenia na przechowywanie, mógł po cichu czytać Twoje zdjęcia, skanować pobrane dokumenty, a nawet modyfikować pliki należące do innych aplikacji. Nie było szczegółowej kontroli. Albo dałeś aplikacji pełny dostęp do całej pamięci, albo całkowicie jej zabroniłeś.
Ten szeroki dostęp doprowadził do problemów w świecie rzeczywistym. Niektóre aplikacje zbierały dane użytkowników, skanując pamięć w poszukiwaniu wrażliwych plików. Inne pozostawiały osierocone pliki, które zaśmiecały urządzenie długo po odinstalowaniu aplikacji. Firma Google potrzebowała rozwiązania, które zrównoważyłoby użyteczność z prywatnością, a odpowiedzią była pamięć o ograniczonym zakresie.
Co właściwie robi pamięć o określonym zakresie
Pamięć o ograniczonym zakresie zasadniczo zmienia relację między aplikacjami a systemem plików. W tym modelu każda aplikacja otrzymuje własną prywatną piaskownicę (sandbox) w pamięci zewnętrznej, znajdującą się zazwyczaj w katalogu /Android/data/[package.name]/. Aplikacje mogą swobodnie odczytywać i zapisywać dane we własnej piaskownicy bez konieczności proszenia o jakiekolwiek uprawnienia.
Jednak dostęp do plików poza tą piaskownicą wymaga przejścia przez kontrolowane interfejsy API. Oto jak działa nowy model:
Pamięć specyficzna dla aplikacji
Każda aplikacja ma dedykowany katalog, do którego dostęp ma wyłącznie ona sama. Po odinstalowaniu aplikacji katalog ten jest automatycznie usuwany. Żadna inna aplikacja nie może odczytywać ani zapisywać danych w tej lokalizacji bez uprawnień roota. Eliminuje to problem pozostawionych plików i zapobiega podglądaniu danych między aplikacjami.
Kolekcje multimediów
W przypadku współdzielonych multimediów, takich jak zdjęcia, filmy i pliki audio, system Android udostępnia interfejs MediaStore API. Aplikacje mogą dodawać multimedia do wspólnych kolekcji oraz odczytywać pliki utworzone przez inne programy, ale wyłącznie za pośrednictwem tego uporządkowanego interfejsu. Aplikacja może przeglądać własne multimedia bez dodatkowych zgód, natomiast dostęp do multimediów innych aplikacji wymaga uprawnień READ_MEDIA_IMAGES, READ_MEDIA_VIDEO lub READ_MEDIA_AUDIO wprowadzonych w systemie Android 13.
Struktura dostępu do pamięci masowej
W przypadku dokumentów i innych plików innych niż multimedialne aplikacje muszą korzystać ze struktury dostępu do magazynu (SAF). Spowoduje to udostępnienie użytkownikowi systemowego selektora plików, który jawnie wybiera, do których plików lub katalogów aplikacja może uzyskać dostęp. Aplikacja nigdy nie uzyskuje pełnego dostępu do całego systemu plików.
Pozwolenie MANAGE_EXTERNAL_STORAGE
W przypadku aplikacji, które naprawdę potrzebują szerokiego dostępu do plików, takich jak menedżery plików, narzędzia do tworzenia kopii zapasowych i oprogramowanie antywirusowe, system Android zapewnia uprawnienie MANAGE_EXTERNAL_STORAGE. Jednak to uprawnienie wymaga specjalnej zgody Google w przypadku aplikacji rozpowszechnianych za pośrednictwem Sklepu Play i użytkownicy muszą je przyznać ręcznie w ustawieniach systemu, a nie w prostym oknie dialogowym.
Harmonogram wdrożenia
Firma Google nie narzuciła obowiązku przechowywania danych w określonym zakresie z dnia na dzień. Przejście następowało stopniowo:
- Wprowadzono pamięć o ograniczonym zakresie Android 10 (API 29):, ale aplikacje mogły zrezygnować z używania requestLegacyExternalStorage="true" w swoim manifeście. Dało to programistom czas na dostosowanie się.
- Android 11 (API 30): Starsza flaga została zignorowana w przypadku aplikacji przeznaczonych dla interfejsu API 30 lub nowszego. Pamięć o ograniczonym zakresie stała się obowiązkowa w przypadku nowych i zaktualizowanych aplikacji w Sklepie Play.
- Android 12 i nowsze wersje: Wprowadzono dalsze udoskonalenia, w tym szczegółowe uprawnienia do multimediów i poprawioną wydajność SAF.
- Android 13 (API 33): Szerokie uprawnienie READ_EXTERNAL_STORAGE zostało wycofane na rzecz określonych uprawnień do multimediów.
- Android 14 (API 34): Wprowadzono częściowy dostęp do zdjęć i filmów, dzięki czemu użytkownicy mogą przyznawać dostęp do określonych plików, a nie do całych bibliotek multimediów.
Jak pamięć o określonym zakresie wpływa na ładowanie boczne
Dla użytkowników, którzy instalują aplikacje spoza Sklepu Play, pamięć o określonym zakresie stwarza pewne praktyczne wyzwania, które warto zrozumieć.
Pobieranie i uzyskiwanie dostępu do plików APK
Gdy pobierasz plik APK za pośrednictwem przeglądarki, zazwyczaj ląduje on w folderze Pobrane. W przypadku magazynu o ograniczonym zakresie właścicielem tego pliku jest aplikacja przeglądarki. Jeśli chcesz go zainstalować przy użyciu innej aplikacji, np. menedżera plików, ten menedżer plików potrzebuje odpowiedniego dostępu. Większość nowoczesnych menedżerów plików radzi sobie z tym poprawnie poprzez SAF, ale starsze mogą mieć problemy.
Instalator pakietu systemowego nadal ma dostęp do plików wybranych bezpośrednio za pomocą selektora plików, więc podstawowy proces pobierania i instalowania pakietu APK nadal działa. Jednakże zautomatyzowane procesy instalacji, które opierały się na bezpośrednim dostępie do ścieżki pliku, mogą ulec awarii.
Pliki OBB i dane gier
To tutaj magazynowanie o ograniczonym zakresie powoduje największe tarcie w przypadku ładowarek bocznych. Wiele dużych gier korzysta z plików OBB (Opaque Binary Blob) przechowywanych w /Android/obb/[package.name]/. W starym modelu można było po prostu skopiować pliki OBB do odpowiedniego katalogu za pomocą dowolnego menedżera plików.
W przypadku magazynu o ograniczonym zakresie katalog /Android/obb/ jest ograniczony. W systemie Android 11 i nowszych wersjach zwykłe aplikacje nie mogą zapisywać danych w katalogu OBB innej aplikacji. Oznacza to, że jeśli pobierzesz plik XAPK zawierający dane OBB, instalator będzie potrzebował specjalnej obsługi, aby poprawnie umieścić te pliki.
Narzędzia takie jak nasz Ekstraktor OBB mogą pomóc w wyodrębnieniu plików OBB z pakietów XAPK, ale umieszczenie ich we właściwym katalogu w nowszych wersjach Androida może wymagać użycia menedżera plików z uprawnieniami MANAGE_EXTERNAL_STORAGE lub użycia poleceń ADB z komputera.
Uwagi dotyczące instalacji XAPK
Pliki XAPK łączą plik APK z danymi OBB i czasami dzielą konfiguracje APK. Zainstalowanie ich na urządzeniach z systemem Android 11 lub nowszym wymaga instalatora, który rozumie ograniczenia dotyczące miejsca na dane. Instalator musi albo posiadać uprawnienia MANAGE_EXTERNAL_STORAGE, albo użyć odpowiednich interfejsów API, aby umieścić pliki OBB we właściwej lokalizacji.
Jest to jeden z powodów, dla których konwersja plików XAPK do standardowego formatu APK może być przydatna. Samodzielny plik APK nie wymaga umieszczania pliku OBB, co upraszcza proces instalacji w nowszych wersjach Androida. Możesz użyć naszego Konwerter XAPK na APK, aby wyodrębnić podstawowy plik APK z pakietu XAPK.
Co programiści muszą wiedzieć
Jeśli tworzysz aplikacje na Androida, pamięć o ograniczonym zakresie wymaga ponownego przemyślenia sposobu obsługi plików:
- Użyj katalogów specyficznych dla aplikacji dla wszelkich plików, których potrzebuje tylko Twoja aplikacja. Nie wymagają one żadnych uprawnień i są automatycznie czyszczone podczas dezinstalacji.
- Skorzystaj z MediaStore dla zdjęć, filmów i dźwięku, które powinny być widoczne dla innych aplikacji i przetrwać dezinstalację.
- Użyj SAF-a, gdy aplikacja musi pracować z dokumentami lub katalogami wybranymi przez użytkownika.
- Unikaj zakodowanych na stałe ścieżek plików. Ścieżki takie jak /sdcard/MyApp/ nie są już niezawodne. Zamiast tego użyj Context.getExternalFilesDir().
- Zachowanie Testuj na wielu poziomach API. znacznie różni się w przypadku Androida 10, 11, 13 i 14.
Strategie migracji
Jeśli Twoja aplikacja przechowywała wcześniej pliki w pamięci współdzielonej, potrzebujesz planu migracji. Zalecanym podejściem jest skopiowanie istniejących plików do magazynu aplikacji przy pierwszym uruchomieniu po aktualizacji, a następnie usunięcie starych kopii. Użyj Environment.getExternalStorageDirectory() ze starszą flagą w okresie przejściowym, aby odczytać stare pliki, a następnie przenieś je do nowej lokalizacji.
Powszechne nieporozumienia
„Przechowywanie w ograniczonym zakresie oznacza, że aplikacje nie mogą uzyskać dostępu do żadnych plików”
To jest fałszywe. Aplikacje nadal mogą swobodnie uzyskiwać dostęp do własnych plików, współtworzyć udostępnione kolekcje multimediów i żądać dostępu do określonych plików za pomocą selektora systemu. Zmieniło się to, że aplikacje nie mogą już po cichu przeglądać całego systemu plików.
„Menedżerowie plików są zepsuci w nowych wersjach Androida”
Menedżery plików korzystające z uprawnienia MANAGE_EXTERNAL_STORAGE nadal działają prawidłowo. Użytkownik musi jedynie przyznać to specjalne uprawnienie w ustawieniach systemu. Większość popularnych menedżerów plików została już dostosowana do tego wymogu.
„Przechowywanie w określonym zakresie wpływa tylko na kartę SD”
Pamięć o ograniczonym zakresie dotyczy całej pamięci udostępnionej, w tym wewnętrznej pamięci udostępnionej. Termin „pamięć zewnętrzna” w systemie Android odnosi się do pamięci współdzielonej, do której może mieć dostęp wiele aplikacji, niekoniecznie fizycznej karty SD.
Praktyczne wskazówki dla użytkowników
Jeśli regularnie sideloadujesz aplikacje lub zarządzasz plikami na swoim urządzeniu z Androidem, oto kilka praktycznych zaleceń:
- Użyj nowoczesnego menedżera plików obsługujący MANAGE_EXTERNAL_STORAGE. Aplikacje takie jak Solid Explorer, MiXplorer i Total Commander dobrze przystosowały się do pamięci masowej o ograniczonym zakresie.
- Udzielaj uprawnień ostrożnie. Gdy menedżer plików poprosi o „Dostęp do wszystkich plików”, należy zrozumieć, że jest to uprawnienie MANAGE_EXTERNAL_STORAGE i jest ono niezbędne do zapewnienia pełnej funkcjonalności.
- Użyj ADB do uporczywych operacji na plikach. Jeśli nie możesz umieścić plików OBB za pomocą menedżera plików, podłączenie urządzenia do komputera i użycie adb push całkowicie ominie ograniczenia dotyczące zakresu przechowywania.
- Konwertuj złożone pakiety na prostsze formaty. Jeśli plik XAPK sprawia problemy na nowszym urządzeniu, wyodrębnienie samego komponentu APK może być ścieżką najmniejszego oporu.
- Aktualizuj aplikacje instalatora. Starsze wersje instalatorów XAPK mogą nie obsługiwać poprawnie pamięci masowej o określonym zakresie.
Przyszłość pamięci masowej Androida
Google stale udoskonala model pamięci masowej w kolejnych wydaniach systemu Android. W Androidzie 14 wprowadzono częściowy dostęp do multimediów, dzięki czemu użytkownicy mogą udostępniać aplikacji tylko wybrane zdjęcia zamiast całej biblioteki. Z kolei Android 15 przynosi dalsze ulepszenia wydajności i wygody obsługi szkieletu Storage Access Framework.
Trend jest jasny: Android zmierza w stronę modelu, w którym użytkownicy mają precyzyjną kontrolę nad tym, co każda aplikacja może zobaczyć i zmodyfikować. Chociaż stwarza to pewne tarcia dla zaawansowanych użytkowników i osób ładujących bocznie, znacznie poprawia prywatność i bezpieczeństwo szerszej bazy użytkowników.
Praca z pamięcią masową o ograniczonym zakresie bez przerywania danych aplikacji
Pamięć o ograniczonym zakresie (Scoped Storage) to jedna z najważniejszych zmian w architekturze Androida ostatnich lat. Ograniczając aplikacje do własnych piaskownic i wymagając wyraźnej zgody użytkownika na szerszy dostęp, Google radykalnie zwiększyło poziom prywatności platformy. Użytkownikom instalującym aplikacje spoza sklepu i ręcznie zarządzającym plikami zrozumienie tych ograniczeń pomaga radzić sobie z ewentualnymi utrudnieniami. Dla programistów natomiast dostosowanie się do tego modelu nie jest opcjonalne, lecz stanowi podstawowy wymóg nowoczesnego tworzenia aplikacji na Androida.
Instalowanie plików APK, umieszczanie plików OBB i codzienne zarządzanie pamięcią masową, wszystko to odbywa się w tym samym systemie: pamięć masowa o ograniczonym zakresie. Gdy zrozumiesz, jak to działa, będziesz mieć kontrolę nad swoim urządzeniem i nie będziesz zdany na łaskę aplikacji, które mogą nadużywać szerokiego dostępu do plików.