
Programujeme pre Android /13. časť
V tejto časti seriálu budeme pokračovať v procese vývoja vzorovej aplikácie db_sync. Zameriame sa na prácu so súbormi. V prvom rade uvedieme základné fakty týkajúce sa súborových systémov (file systems), ktoré dokáže využiť OS Android. Následne v stručnosti opíšeme triedy a metódy, ktoré budeme používať pri práci so súbormi v rámci našej vzorovej aplikácie.
Súborové systémy využívané Androidom
Skutočnosť, že operačný systém Android využíva linuxové jadro, má priamy súvis so súborovými systémami, ktoré dokáže využiť (spravovať), a takisto aj s hierarchiou zložiek (súborov). Základom hierarchie je jednoduchý integrovaný strom zložiek (súborov) začínajúci sa zložkou „/“ (koreň – root stromu). Do koreňovej zložky sú zahrnuté všetky ostatné zložky (súbory) vrátane zložiek reprezentujúcich ostatné médiá (interné či externé).
Cestou (path) sa rozumie časť integrovanej stromovej štruktúry vedúca ku konkrétnej zložke (súboru), resp. dátovému médiu. Absolútnou cestou je cesta začínajúca sa zložku „/“. Android používa koncept pripájania (mount) a odpájania (umount) zložiek (médií) známy z prostredia Linuxu. Stromovú štruktúru delí na internú (internal flash drive) a externú (external drive) časť (priestor). Stále pritom hovoríme o jedinom integrovanom strome, ktorého jednotlivé zložky tvoria tzv. prípojné body (mount points) či už pre súborové systémy, alebo pre ostatné médiá (napr. karty SD). Všetky súborové systémy sú teda vždy súčasťou spoločnej stromovej hierarchie.
Operácie so zložkami (súbormi), resp. médiami využívajú abstraktnú vrstvu jadra nazývanú VFS (Virtual File System). Konkrétnou implementáciou VFS sú aj súborové systémy. Tie sú implementované vo forme modulov jadra (zabudované v jadre, resp. dynamicky nahrávané) a využívané v okamihu zadania požiadavky na pripojenie konkrétneho súborového systému, resp. zariadenia.
Najčastejšie používané súborové systémy Androidu sú:
pre pamäte flash | pre ostatné médiá | pre „pseudo“ systémy |
exFAT, F2FS, JFFS2, YAFFS2 | EXT2 / EXT3 / EXT4, MSDOS, VFAT | cgroup, rootfs, procfs, sysfs, tmpfs |
Podobne ako v Linuxe je na kompletnú správu hierarchie stromu nevyhnutné vystupovať ako administrátor (root). Iba vtedy možno vidieť a modifikovať všetky časti stromu. Štruktúru stromu možno prezerať napr. pomocou ADM s privilégiami konkrétneho používateľa.
Hierarchia systémových zložiek smartfónu Samsung SM-G357FZ, zobrazená nástrojom Android Device Monitor
Aj keď sú všetky uvedené fakty štandardom, ten sa nie vždy úplne dodržiava a niektorí výrobcovia zariadení sa od neho viac či menej odchyľujú. Nám nezostáva nič iné ako na tieto odchýlky reagovať a prispôsobiť im svoje aplikácie.
Hierarchia systémových zložiek
Napriek tomu, že usporiadanie zložiek najvyššej úrovne (top level) nemusí byť na všetkých zariadeniach rovnaké, spoločný koncept vychádza z nasledujúcej štruktúry:
acct | evidencia (accounting) používateľov |
cache | úložisko dočasných údajov |
d, etc, sdcard, vendor | symbolické odkazy na /sys/kernel/debug, /system/etc, /mt/sdcard, /system/vendor |
data, dev, mnt | prípojné body pre /dev/block/mtdblock1, tmpfs – dostupné zariadenia, interné / externé karty SD a ostatné súborové systémy |
init | aplikácia vykonávajúca skript init.rc – konfigurácia zariadenia po štarte |
proc, sbin | prístup k dátovým štruktúram jadra, binárne súbory démonov |
root | domáca zložka používateľa root |
sys, system | objekty a vlastnosti objektov zariadení jadra, zložky pôvodne zaradené do koreňa štandardného linuxového stromu |
Práca so súbormi a aplikácia db_sync
Dôvod, pre ktorý sme sa rozhodli pracovať so súbormi v rámci aplikácie db_sync, je umožniť používateľom pridávať do tabuliek databáz súbory ľubovoľných typov, čo je bežná funkcionalita podobných aplikácií. Tento článok tvorí úvod k téme práce so súbormi. Teórii, ako aj praktickej implementácii sa budeme venovať aj nabudúce.Práca so súbormi a aplikácia db_sync
Trieda File
V prvom rade sa musíme oboznámiť s triedou File, ktorá je určená na vykonávanie rôznych činností so zložkami (directory) a súbormi (file). File je abstraktná reprezentácia entity identifikovanej cestou – relatívnou či absolútnou. Entita (zložka, súbor) nemusí pri vytvorení objektu triedy File existovať.
Pri práci s objektmi triedy File vychádzame z principiálneho delenia úložného priestoru Androidu na interný a externý priestor. To platí aj v prípade, že v našom zariadení nemáme nijaký externý disk. Rozdiely sú nasledujúce:
interný priestor | externý priestor | ||
vždy dostupný, ale iba z aplikácie, ktorá priestor vlastní | nemusí byť vždy dostupný (napr. po vybratí karty SD), obsah môže čítať ľubovoľná aplikácia | ||
po odinštalovaní aplikácie systém zmaže obsah priestoru | po odinštalovaní aplikácie systém zmaže obsah priestoru, iba ak bol vytvorený v zložke sprístupnenej pomocou getExternalFilesDir() | ||
bez nutnosti povolenia prístupu | pred použitím musí byť aplikácii povolený prístup v manifeste WRITE_EXTERNAL_STORAGE | ||
sprístupnenie zložky | getFilesDir() | s voľne dostupným obsahom | getExternalStoragePublicDirectory() |
so súkromným obsahom – obsah bude odstránený po odinštalovaní aplikácie | getExternalFilesDir() |
Diagram reprezentujúci proces uloženia (upload) súboru (napr. s obrázkom) na webový server
Pri práci so súbormi budeme v princípe využívať triedu FileInputStream (BufferedInputStream), pomocou ktorej načítavame údaje (bajty) zo súborov a triedu FileOutputStream (BufferedOutputStream), pomocou ktorej ukladáme údaje (bajty) do súborov. Používame pri tom konkrétne metódy read() a write().
Pri prenose súborov medzi zariadením a webovým serverom využijeme triedu Base64. Tá obsahuje nástroje na zakódovanie a dekódovanie binárnych údajov (napr. obrázkov) na ich textovú reprezentáciu (nevyhnutná na korektný prenos obsahu obrázkov na webový server) v súlade s pravidlami kódovania MIME Base64 Content-Transfer-Encoding (RFC2045).
Zobrazit Galériu