Ang internal storage ng app ay isang nakalaang espasyo sa device na accessible lamang sa partikular na app sa pamamagitan ng isolated storage. Ayon sa Android Developers, 2026, bawat app ay nakakakuha ng sarili nitong sandbox directory kung saan ang ibang apps ay walang direktang access. Ang ganitong approach ay nagpoprotekta sa data mula sa hindi awtorisadong pagbasa at tinitiyak ang matatag na operasyon sa multitasking na kapaligiran ng mga mobile device.
Mga Pangunahing Punto
Context.getFilesDir(), getCacheDir() at getDataDir() para sa access sa internal storageNSDocumentDirectory at NSCachesDirectory sa Sandbox container ng appAng internal storage ng app ay isang isolated directory na inilalaan ng operating system sa bawat app sa pag-install nito. Ang ibang apps at ang user sa pamamagitan ng standard file managers ay walang access sa directory na ito. Ginagarantiyahan ng system na ang data sa loob ng directory na ito ay ganap na tatanggalin kapag na-uninstall ang app. Ang approach na ito ay bumubuo ng pundasyon ng modelo ng seguridad ng mga mobile operating system, na pumipigil sa pagtagas ng kumpidensyal na impormasyon sa pagitan ng mga programa.
Hindi tulad ng external storage (SD card), ang internal storage ay palaging available at hindi nangangailangan ng pagsuri sa pagkakaroon ng media. Ang bilis ng pagbasa at pagsulat sa NAND flash memory ng mga modernong device ay umaabot sa 800–900 MB/s sequential read at 200–300 MB/s sequential write, na maihahambing sa SATA SSD. Ang laki ng inilaang lugar ay depende sa kabuuang kapasidad ng device at patakaran ng manufacturer: sa mga device na may 64 GB flash memory, ang app ay nakakakuha ng 16 hanggang 64 MB na paunang espasyo na may posibilidad ng pagpapalawak kung kinakailangan.
Nag-iiba ang arkitektura ng internal storage sa Android at iOS. Sa Android, bawat app ay nakakakuha ng directory na /data/data/<package_name>/, kung saan lumilikha ang system ng mga subdirectory na files/, cache/ at databases/. Sa iOS, ang app ay gumagana sa isang Sandbox container na may mga directory na Documents/, Library/ at tmp/, bawat isa ay may kanya-kanyang layunin at backup policy.
Ang mga developer ay may ilang paraan ng pag-save ng data sa internal storage ng app. Bawat paraan ay lumulutas ng sarili nitong gawain at angkop para sa partikular na uri ng data. Ang pagpili ng tamang paraan ay direktang nakakaapekto sa performance ng app, kaginhawaan ng pag-develop, at seguridad ng data ng user.
Ang pinakamababang antas na paraan ay direktang pagsulat ng mga file sa files directory. Maaaring lumikha ang app ng anumang mga file at directory sa loob ng sandbox nito. Ang paraang ito ay angkop para sa pag-imbak ng media files, dokumento ng user, at anumang binary data na hindi nangangailangan ng structured na organisasyon. Sa Android, ang access sa directory ay sa pamamagitan ng tawag na Context.getFilesDir(), na nagbabalik ng absolute path sa file directory ng app. Sa iOS, ang katulad na function ay ginagawa ng NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).
Para sa pag-imbak ng key-value pairs, nag-aalok ang Android ng SharedPreferences at ang mas modernong DataStore batay sa Kotlin coroutines at protobuf protocol. Ang SharedPreferences ay nag-iimbak ng data sa XML file sa loob ng directory na /data/data/<package>/shared_prefs/. Sa kabila ng pagiging simple ng paggamit, ang SharedPreferences ay may mga disadvantages: ang synchronous write ay maaaring magdulot ng pagkaantala sa UI thread, at ang kakulangan ng type safety ay nagpapataas ng panganib ng errors. Nilulutas ng DataStore ang mga problemang ito sa pamamagitan ng pagbibigay ng asynchronous API batay sa Flow at buong suporta sa uri sa pamamagitan ng protobuf schemas.
Para sa structured data na may relational na ugnayan, ang optimal na pagpipilian ay SQLite o ang Room wrapper. Ang database ay naka-imbak sa isang file sa loob ng directory na databases/ at sumusuporta sa buong SQL syntax. Ang Room ay isang opisyal na Jetpack library na nagbibigay ng type-safe API, awtomatikong schema migration, at suporta para sa coroutines. Ang laki ng database ay maaaring umabot ng ilang gigabytes nang walang makabuluhang pagkawala ng performance na may tamang indexing. Ang SQLite sa mobile device ay nagpoproseso ng hanggang 50,000 write operations bawat segundo sa modernong flagship processors.
Para sa pag-imbak ng kumpidensyal na data, tulad ng authentication tokens at encryption keys, nag-aalok ang Android ng EncryptedSharedPreferences. Ang wrapper na ito sa standard SharedPreferences ay awtomatikong nag-e-encrypt ng keys at values gamit ang AES256-GCM-None. Ang encryption ay ginagawa sa antas ng file bago isulat sa disk, kaya kahit na may physical access sa device, hindi mababasa ng attacker ang nilalaman. Ang EncryptedSharedPreferences ay bahagi ng AndroidX Security library, na kasama rin ang EncryptedFile para sa pag-encrypt ng buong file.
Android SDK ay nagbibigay ng set ng mga method para sa paggamit ng internal storage sa pamamagitan ng Context class. Bawat method ay nagbabalik ng path sa partikular na system directory sa loob ng sandbox ng app. Suriin natin ang mga basic na operasyon ng pagsulat at pagbasa ng file sa halimbawa ng Kotlin.
Ang pangunahing method para makuha ang path sa internal file directory ay context.filesDir. Ito ay nagbabalik ng File object na tumuturo sa directory na /data/data/<package>/files/. Sa unang pagtawag, awtomatikong nililikha ng system ang lahat ng kinakailangang parent directory. Ang laki ng mga file sa internal storage ay hindi tahasang nililimitahan, ngunit ang kabuuang dami ng data ay hindi dapat lumampas sa available na espasyo ng /data partition, na karaniwang 60–80% ng kabuuang kapasidad ng flash memory ng device.
val context = getApplicationContext()
val file = File(context.filesDir, "notes.txt")
file.writeText("Nilalaman ng tala")
val content = file.readText()
println("Binasa: $content")
Ang mga method na writeText at readText ay extension functions ng standard library ng Kotlin. Awtomatiko nilang pinamamahalaan ang pagbubukas at pagsasara ng mga stream, na pumipigil sa memory leaks. Para sa paggamit ng binary data, gamitin ang writeBytes at readBytes, na hindi nangangailangan ng encoding at gumagana sa ByteArray arrays. Kapag gumagamit ng malalaking file, inirerekomenda ang paggamit ng buffered streams: BufferedReader at BufferedWriter para sa text, BufferedInputStream at BufferedOutputStream para sa binary data.
Para sa organisasyon ng mga file sa hierarchy, gumawa ng mga subdirectory sa loob ng filesDir. Ito ay tumutulong sa pag-istruktura ng data ayon sa uri: mga larawan, dokumento, export file. Ang method na mkdirs() ay lumilikha ng lahat ng nawawalang directory sa path, kasama ang mga nested. Siguraduhin na ang operasyon ng paggawa ay matagumpay — ang method ay nagbabalik ng true lamang kapag gumagawa ng mga bagong directory. Ang error sa paggawa ay kadalasang nauugnay sa kakulangan ng espasyo sa /data partition o pagkaubos ng inodes ng file system.
val imagesDir = File(context.filesDir, "images")
if (imagesDir.mkdirs()) {
println("Direktoryo ginawa")
}
val imageFile = File(imagesDir, "photo.jpg")
imageFile.writeBytes(byteArray)
Para sa pagsuri ng available na espasyo bago magsulat ng malalaking file, gamitin ang File.getFreeSpace() o File.getUsableSpace(). Ang pangalawang method ay nagbabalik ng bilang ng bytes na available sa kasalukuyang app na isinasaalang-alang ang security quotas — ito ay mas tumpak sa konteksto ng multi-user device. Kung ang available na espasyo ay mas maliit kaysa sa inaasahang laki ng file, magpakita ng mensahe sa user at magmungkahi na magbakante ng espasyo sa mga setting ng device.
Sa iOS, bawat app ay gumagana sa isang isolated na Sandbox container. Ang system ay hindi nagbibigay ng API para lumabas sa mga hangganan nito nang walang espesyal na entitlements. Ang pangunahing tool para sa paggamit ng file system ay ang FileManager class mula sa Foundation framework. Ang Sandbox container ay may kasamang ilang standard na directory, bawat isa ay may kanya-kanyang backup policy.
Ang Documents directory ay para sa data ng user na dapat mapanatili sa pagitan ng mga paglulunsad ng app at ma-restore mula sa backup. Awtomatikong isinasama ng iOS ang directory na ito sa backup sa iCloud at iTunes. Ang method na urls(for:in:) ay nagbabalik ng array ng URL addresses ng hiniling na directory — ang unang elemento ng array ay ang pangunahing.
let fm = FileManager.default
let docs = fm.urls(
for: .documentDirectory,
in: .userDomainMask
).first!
let fileURL = docs.appendingPathComponent("data.plist")
try data.write(to: fileURL)
FileManager ay sumusuporta sa kumpletong set ng file operations: paggawa, pagkopya, paglipat, pagtanggal at pagpapalit ng pangalan. Bawat operasyon ay maaaring magbunga ng error, kaya lahat ng tawag ay dapat na nakabalot sa do-catch construct. Bigyang-pansin ang pagtanggal ng mga file — ang operasyon ay hindi na mababawi at ang pag-restore ng data pagkatapos ng removeItem(at:) ay imposible nang walang paunang backup.
Hindi lahat ng data sa Sandbox container ay kailangang mapunta sa iCloud backup. Halimbawa, ang cache ng mga na-download na larawan o pansamantalang processing file ay hindi kailangang i-restore — sila ay muling lilikhain sa susunod na paggamit. Para i-exclude ang isang directory o file mula sa backup, itakda ang attribute na isExcludedFromBackup sa true. Inirerekomenda ng Apple na palaging i-exclude mula sa backup ang data na maaaring i-restore nang malayuan, upang mabawasan ang volume ng iCloud storage at mapabilis ang oras ng pag-restore.
var cacheURL = fm.urls(
for: .cachesDirectory,
in: .userDomainMask
).first!
cacheURL.hasExcludedFromBackupKey = true
var values = URLResourceValues()
values.isExcludedFromBackup = true
try cacheURL.setResourceValues(values)
Bawat uri ng storage sa isang mobile device ay may sariling layunin at mga patakaran ng paggamit. Ang pag-unawa sa mga pagkakaibang ito ay tumutulong sa developer na pumili ng tamang lugar para sa bawat uri ng data. Nasa ibaba ang paghahambing ng tatlong pangunahing uri ng storage na available sa app.
| Katangian | Internal Storage | Cache Directory | External Storage |
|---|---|---|---|
| Visibility para sa ibang apps | Nakatago | Nakatago | Accessible |
| Pag-alis kapag na-uninstall ang app | Kumpleto | Kumpleto | Depende sa lokasyon |
| Backup | Sa Android — hindi, sa iOS — oo (Documents) | Hindi | Lamang kapag nag-sync |
| Availability nang walang media | Palagi | Palagi | Nangangailangan ng SD card |
| Panganib ng pagkawala ng data | Minimal | Mataas | Katamtaman |
| Inirerekomendang laki ng file | Hanggang 100 MB | Hanggang 50 MB | Kahit ano |
Internal storage ay optimal para sa pag-imbak ng configuration ng app, database file at dokumento ng user na hindi dapat ma-access ng ibang programa. Ang cache directory ay para sa pansamantalang file na maaaring muling likhain sa susunod na paggamit: mga na-download na larawan, API responses, intermediate processing data. Ang external storage ay pinaka-angkop para sa malalaking media file (mga larawan, video, musika) at data na gustong ibahagi ng user sa ibang apps sa pamamagitan ng shared access.
Ang pagpili ng uri ng storage ay nakakaapekto rin sa ranking ng app sa Google Play at App Store. Ang mga app na nag-iimbak ng malaking volume ng data sa internal storage nang walang paglilinis ay nakakatanggap ng negatibong reviews: nagrereklamo ang mga user tungkol sa kakulangan ng espasyo. Ayon sa pananaliksik ng App Annie, 62% ng mga user ay nagtatanggal ng app kung ito ay gumagamit ng higit sa 500 MB ng internal storage ng device nang walang opsyon sa paglilinis.
Tamang pamamahala ng internal storage ng app ay nagpapabuti ng performance, seguridad at karanasan ng user. Ang mga sumusunod na rekomendasyon ay batay sa opisyal na dokumentasyon ng Android at iOS, pati na rin sa praktikal na karanasan sa pag-develop ng mga app na may milyun-milyong pag-install.
Ang espesyal na atensyon ay dapat ibigay sa pag-test ng mga boundary case. Suriin ang behavior ng app kapag puno ang internal storage, biglang naantala ang pagsulat (app crash, tawag sa telepono) at kapag nag-restore mula sa iOS backup. Sa bawat isa sa mga scenario na ito, ang data ay dapat manatiling consistent o ma-restore sa huling stable na estado. Gumamit ng transactional files: isulat ang data sa isang pansamantalang file, pagkatapos ay atomically palitan ang pangalan nito sa target file. Ito ay pumipigil sa pagbasa ng corrupted data kapag may failure sa pagsulat.
Huwag kalimutan ang kontrol ng user. Magbigay sa settings ng app ng opsyon sa paglilinis ng pansamantalang data at pagpapakita ng ginamit na volume ng internal storage. Ayon sa Google Play Console, ang mga app na may ganitong feature ay tumatanggap ng 18% mas maraming positibong review sa kategoryang „Performance”.
Mga Madalas Itanong
Lahat ng data mula sa internal storage ng app ay ganap na tatanggalin. Ginagarantiyahan ng operating system ang kawalan ng natitirang mga file, kasama ang mga database, settings at pansamantalang file. Ang data sa external storage ay maaaring manatili.
Nang walang root access sa device, ang ibang apps ay hindi maaaring magbasa ng mga file mula sa Internal Storage ng ibang app. Sa Android, kinakailangan ang superuser privileges, at sa iOS, ang isolation ay ginagarantiyahan sa kernel level sa pamamagitan ng Sandbox.
Walang explicit na limitasyon, ngunit ang kabuuang volume ay limitado sa available na espasyo sa /data partition. Inirerekomenda na huwag lumampas ng 100 MB bawat app — ang mas malalaking volume ay mas mainam na ilagay sa external storage o cloud.
filesDir ay para sa permanenteng data ng app at hindi tinatanggal ng system nang walang pangangailangan. cacheDir ay para sa pansamantalang file na maaaring tanggalin ng system kapag kulang ang memory. Hindi ginagarantiyahan ng system ang integridad ng cacheDir.
Ang direktang pagkopya mula sa Internal Storage papunta sa SD card ay ipinagbabawal ng security policy. Gamitin ang MediaStore API sa Android 10+ o SAF (Storage Access Framework) para gumawa ng mga kopya ng data sa shared access na may pahintulot ng user.
Buod
Gagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.
Basahin din