Файловата система на мобилното устройство е начин за организиране, съхранение и именуване на данни във флаш паметта. Според Android Developers, 2026, мобилните операционни системи използват йерархична структура от директории, където всяко приложение работи в изолирана пясъчна кутия. Такава архитектура предотвратява неоторизиран достъп до данни и осигурява стабилна работа на системата при едновременно стартиране на множество приложения.
Основни точки
Файлова система е софтуерен компонент на операционната система, който управлява как данните се записват, четат и организират на физическия носител. На мобилни устройства файловата система изпълнява критично важни функции: управление на пространството на флаш паметта, контрол на достъпа до файлове въз основа на разрешения, регистриране на промени за възстановяване след повреди и оптимизиране на запис с оглед на характеристиките на NAND флаш паметта.
За разлика от десктоп операционните системи, мобилните файлови системи се проектират с оглед на ограничения ресурс от цикли на презаписване на флаш паметта. NAND клетките издържат ограничен брой операции на изтриване — от 3 000 до 10 000 цикъла за TLC и MLC памет съответно. За да се удължи животът на устройството за съхранение, файловите системи прилагат механизми за wear leveling (изравняване на износването) и TRIM команди. F2FS, разработена от Samsung специално за флаш памет, взема предвид геометрията на NAND масива и поставя данните по начин, който минимизира фрагментацията и броя на операциите за изтриване на блокове.
Съвременните мобилни устройства използват комбинация от няколко файлови системи. Вътрешната памет (дял /data) се форматира в EXT4 или F2FS на Android и APFS на iOS. SD картите традиционно използват exFAT за поддръжка на файлове по-големи от 4 GB или FAT32 за максимална съвместимост. Дялът /system на Android често се монтира само за четене и използва EXT4 или EROFS (Enhanced Read-Only File System) — компресирана файлова система, разработена от Huawei за намаляване на размера на системния дял.
Йерархия на директориите на Android се основава на Linux структура с корен в /. Всеки дял има своя файлова система, права за достъп и предназначение. Приложението може да получи достъп само до ограничен набор от директории — останалите са защитени с root права.
| Път | Дял | Файлова система | Достъп за приложение |
|---|---|---|---|
| /data | Userdata | F2FS / EXT4 | Само своя пясъчна кутия |
| /system | System | EROFS / EXT4 | Само четене (root) |
| /sdcard | External | exFAT / FAT32 | С разрешение |
| /cache | Cache | EXT4 | Само root |
| /vendor | Vendor | EROFS / EXT4 | Само четене (root) |
Дялът /data е основният дял за съхранение на потребителски данни, инсталирани приложения и техните настройки. Всяко приложение получава собствена директория на пътя /data/data/<package_name>/. Вътре в тази директория системата автоматично създава поддиректории: files/ за файлове на приложението, cache/ за временни файлове, databases/ за SQLite бази данни, shared_prefs/ за SharedPreferences. Правата за достъп до тази директория се задават при инсталиране на приложението и не могат да бъдат променяни без root достъп. Дялът /data се форматира в F2FS на повечето съвременни устройства, което осигурява до 40% по-висока скорост на случаен запис в сравнение с EXT4.
Дялът /system съдържа операционната система, системни приложения и библиотеки. Този дял се монтира само за четене, за да се предотврати случайна или злонамерена промяна на системни файлове. На устройства с Android 10+ и Project Treble дялът /system е динамичен и може да се актуализира чрез OTA пакети без необходимост от пълно префлашване. За приложенията дялът /system е недостъпен — опит за запис ще предизвика изключение SecurityException. Приложенията обаче могат да четат някои файлове от /system, например системни шрифтове и конфигурационни файлове, ако имат съответните разрешения.
Точката на монтиране /sdcard е символна връзка към дяла на емулирано или физическо външно хранилище. На устройства без SD карта /sdcard сочи към поддял вътре в /data, който е отделен за споделен достъп. Този дял е видим за потребителя, когато устройството е свързано към компютър чрез MTP протокол. Приложенията получават достъп до /sdcard чрез разрешения READ_EXTERNAL_STORAGE и WRITE_EXTERNAL_STORAGE, а от Android 10 — чрез Scoped Storage с използване на MediaStore API. Размерът на /sdcard обикновено е 60–80% от общия обем на флаш паметта на устройството, а остатъкът е запазен за дяла /data.
На iOS файловата система е организирана чрез Sandbox контейнери на приложенията. Всяко приложение получава изолирана директория, достъпът до която е ограничен на ниво ядро XNU. Потребителският дял използва файловата система APFS (Apple File System), представена в iOS 10.3. APFS поддържа моментни снимки, клониране на файлове и криптиране на ниво файл, което я прави оптимална за мобилни устройства.
Sandbox контейнерът на iOS включва четири основни директории: Documents, Library, tmp и SystemData. Всяка директория има собствена политика за архивиране, срок на съхранение на данни и ниво на достъп. Documents автоматично се включва в архивирането на iCloud и iTunes. Library съдържа поддиректории Caches (не се архивира), Preferences (архивира се) и Application Support (архивира се). Директорията tmp е предназначена за временни файлове — iOS може да ги изтрие при липса на място и не се включва в архивирането. SystemData се използва от самата система и е недостъпна за приложението чрез стандартни API.
let fm = FileManager.default
let documents = fm.urls(
for: .documentDirectory,
in: .userDomainMask
).first!
let caches = fm.urls(
for: .cachesDirectory,
in: .userDomainMask
).first!
let appSupport = fm.urls(
for: .applicationSupportDirectory,
in: .userDomainMask
).first!
Всяка директория на Sandbox контейнера има свой клас на защита (protection class). iOS поддържа четири класа: Complete Protection (файлът е недостъпен при заключено устройство), Protected Unless Open (вече отворените файлове са достъпни при заключване), Protected Until First User Authentication (файловете са достъпни след първото отключване) и No Protection (файловете са винаги достъпни след стартиране на устройството). По подразбиране всички файлове в Documents и Library получават клас Complete Protection, което гарантира максимална защита на потребителските данни. При създаване на файл може изрично да се посочи друг клас на защита, ако фоново приложение трябва да има достъп до данните при заключено устройство.
Управлението на достъпа до файлове на мобилни устройства е ключова разлика между Android и iOS. Android използва класическия Linux модел на права за достъп (четене, запис, изпълнение) с разширения за изолиране на приложенията. iOS прилага по-строгия Sandbox модел, където всяко приложение работи в изолиран контейнер и няма достъп до файлове на други приложения без специални механизми.
На Android всяко приложение се стартира с отделен UID (User ID). Всички файлове, създадени от приложението в неговата пясъчна кутия, принадлежат на този UID и не са видими за други приложения. За достъп до споделени директории (външно хранилище) приложението трябва да поиска разрешения READ_EXTERNAL_STORAGE и WRITE_EXTERNAL_STORAGE. От Android 11 разрешенията трябва да се искат по време на изпълнение, а приложение с targetSdkVersion 30+ за достъп до файлове на други приложения трябва да използва SAF. Нарушаването на модела на разрешения води до SecurityException, което се обработва от стандартен try-catch блок. Google Play автоматично проверява съответствието на приложението с политиката за разрешения преди публикуване.
if (ContextCompat.checkSelfPermission(
context,
Manifest.permission.READ_EXTERNAL_STORAGE
) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(
activity,
arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE),
REQUEST_CODE
)
}
iOS Sandbox е имплементиран на ниво ядро XNU и не позволява на приложението да напусне своя контейнер. Дори ако приложението получи достъп до URI на външен файл чрез Document Picker, операционната система създава временно копие в контейнера на приложението, вместо да предостави директен достъп до оригинала. За обмен на файлове между приложения iOS използва механизмите Share Sheet и UIActivityViewController, които копират файла от контейнера на едно приложение в контейнера на друго. За сигурно съхранение на идентификационни данни (токени, пароли, ключове) iOS предоставя Keychain — криптирано хранилище, достъпно за системата на ниво ядро. Keychain не е част от Sandbox контейнера и се управлява от отделен демон securityd, което осигурява допълнително ниво на защита дори в случай на компрометиране на приложението.
Изборът на файлова система пряко влияе върху производителността и надеждността на съхранението на данни. Всяка файлова система има своя архитектура, оптимизации и ограничения. За разработчика е полезно да разбира тези разлики, за да предвижда поведението на приложението на различни устройства.
При разработването на приложения вземете предвид, че различните файлови системи имат различни ограничения за дължина на името на файла (255 байта за EXT4 и F2FS, 255 Unicode символа за APFS), максимален размер на файла и поддръжка на специални символи. Например APFS допуска Unicode символи в имената на файлове, включително емоджи, докато EXT4 е ограничен до ASCII. Ако приложението създава файлове с имена на различни езици, тествайте работата на всички целеви устройства — име на файл, създадено правилно на APFS, може да бъде съкратено на EXT4.
Надеждната работа с файловата система на мобилно устройство изисква спазване на няколко ключови правила. Те се основават на анализ на типични грешки на разработчици и препоръки от официалната документация.
context.filesDir на Android, NSSearchPathForDirectoriesInDomains на iOS. Твърдите пътища се променят между версиите на операционната система и устройстватаFile.getUsableSpace() на Android и URLResourceValues.volumeAvailableCapacityKey на iOS. Предупреждавайте потребителя, ако свободното място е недостатъчноisExcludedFromBackup. На Android предпочитайте cacheDir за временни файловеОбърнете специално внимание на междуплатформените разлики. Пътищата до файлове на Android се изграждат с наклонена черта (/data/data/.../files/), на iOS — чрез URL схема (file:///var/mobile/.../Documents/). Ако вашето приложение използва мултиплатформена рамка (Flutter, React Native, Kotlin Multiplatform), унифицирайте файловите операции чрез платформени адаптери. Например Flutter предоставя пакета path_provider, който връща правилния път до Documents или filesDir на двете платформи без писане на платформено-зависим код. Никога не конкатенирайте пътища чрез низови операции — използвайте File.join() или URL.appendingPathComponent(), които правилно обработват разделителите на различни платформи.
Често задавани въпроси
На съвременни Android устройства (11+) за дяла /data се използва F2FS. На стари устройства — EXT4. Дялът /system използва EROFS или EXT4. SD картите се форматират в exFAT или FAT32 в зависимост от капацитета.
APFS поддържа моментни снимки, клониране на файлове, криптиране на ниво файл и контролни суми. EXT4 има журналиране и по-широка съвместимост. APFS е оптимизирана за SSD, EXT4 е универсална файлова система.
Използвайте FileManager.default.urls(for: .documentDirectory, in: .userDomainMask). Методът връща масив от URL адреси, първият елемент е основната директория Documents на Sandbox контейнера на приложението.
Scoped Storage е модел на достъп, въведен в Android 10, който ограничава директния достъп до файловата система. Приложенията без разрешение могат да четат само своите файлове. За достъп до споделени медийни файлове се използва MediaStore API.
exFAT е за предпочитане за SD карти с капацитет над 32 GB, тъй като поддържа файлове по-големи от 4 GB. FAT32 осигурява максимална съвместимост със стари устройства, но ограничава размера на файла до 4 GB.
Резюме
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също