ระบบแอนดรอยด์ได้มีการออกแบบพื้นที่ภายในเครื่องเพื่อให้ผู้ใช้และแอปสามารถจัดเก็บข้อมูลได้ โดยมีการแบ่งพื้นที่เก็บข้อมูลภายในเครื่องออกเป็นหลายส่วน เพื่อให้นักพัฒนาสามารถเลือกเก็บข้อมูลไว้ในแต่ละที่ได้อย่างเหมาะสม

เนื้อหาในบทความนี้จะอ้างอิงจาก Android 5.0 Lollipop (API Level 21) ขึ้นไป

บทความที่เกี่ยวข้อง

โดยแอนดรอยด์จะมีการแบ่งพื้นที่เก็บข้อมูลเป็น 2 ส่วนด้วยกัน

  • Internal Storage พื้นที่สำหรับเก็บไฟล์และข้อมูลที่จำเป็นต่อการทำงานของระบบแอนดรอยด์และแอปที่ติดตั้งอยู่ในเครื่อง เป็นพื้นที่ที่ผู้ใช้งานทั่วไปไม่สามารถเข้าถึงได้
  • External Storage พื้นที่สำหรับเก็บไฟล์และข้อมูลภายนอกพื้นที่ของแอปหรือระบบแอนดรอยด์ที่ผู้ใช้สามารถเข้าถึงได้

พื้นที่เก็บข้อมูลแต่ละแบบจะมีจุดประสงค์ในการใช้งานที่แตกต่างกัน ขึ้นอยู่กับว่าเป็นข้อมูลแบบไหน และใครสามารถเข้าถึงไฟล์ดังกล่าวได้บ้าง

ข้อมูลที่อยู่ใน Internal Storage

ถึงแม้จะบอกว่าเป็น Internal Storage ก็ตาม แต่ Directory ที่แอปสามารถเรียกใช้งานได้ก็จะมีแค่ Directory ที่แอปเป็นเจ้าของเท่านั้น ส่วน Directory ที่อยู่นอกเหนือจากนั้นจะถูกจำกัดสิทธิ์โดยระบบแอนดรอยด์

ดังนั้น Internal Storage ที่ว่านี้จึงเป็น App Internal Storage หรือพื้นที่ที่ระบบแอนดรอยด์เตรียมไว้ให้สำหรับแต่ละแอปนั่นเอง โดยจะอยู่ใน /data/data/<package_name>

ยกตัวอย่างเช่น แอปที่มี Package Name เป็น com.akexorcist.sleepingforless ก็จะมี Directory ของตัวเองอยู่ที่ /data/data/com.akexorcist.sleepingforless

Directory ใน Internal Storage สำหรับข้อมูลแต่ละประเภท

ใน App-specific Internal Storage ที่ว่านี้ก็จะมีการแบ่ง Directory สำหรับเก็บข้อมูลแต่ละประเภทแยกกันดังนี้

  • App Preferences (Key-value Pair หรือที่รู้จักกันในชื่อ Shared Preferences) จะอยู่ใน /data/data/<package_name>/shared_prefs
  • Cache จะอยู่ใน /data/data/<package_name>/cache
  • Database (Structured Data) จะอยู่ใน /data/data/<package_name>/databases
  • File จะอยู่ใน /data/data/<package_name>/files

โดยปกติพื้นที่ที่เป็น App-specific Internal Storage จะเข้าถึงได้เฉพาะระบบแอนดรอยด์และแอปที่เป็นเจ้าของ Package Name เท่านั้น แต่ถ้าเป็น Debug App ที่ติดตั้งในระหว่างการพัฒนาแอป ระบบแอนดรอยด์จะเปิดให้ใครก็ได้สามารถเข้าถึงข้อมูลใน Internal Storage ของแอปนั้น ๆ ได้

จึงเป็นที่มาว่าทำไมนักพัฒนาจึงสามารถกดดูไฟล์ข้อมูลที่อยู่ในแอปของตัวเองที่กำลังพัฒนาผ่าน File Explorer ของ Android Studio ได้เลย และกดดูของแอปตัวอื่นที่เป็น Signed App ไม่ได้

ไม่จำเป็นต้องขอ Permission ในการเข้าถึงข้อมูล

เนื่องจากข้อมูลอยู่ในพื้นที่ที่แอปเป็นเจ้าของ จึงไม่จำเป็นต้องขอ Permission ในการเข้าถึงข้อมูลเหล่านั้น สามารถเรียกใช้งานได้ทันที

ข้อมูลหายเมื่อแอปถูกลบออกจากเครื่อง

ถึงแม้ว่าข้อมูลที่เก็บไว้ใน Internal Storage จะอยู่ถาวรไม่ว่าจะปิดแอปหรือปิดเครื่องก็ตาม แต่ถ้าผู้ใช้กดลบแอปออกจากเครื่อง ข้อมูลทั้งหมดที่เก็บไว้ใน Intenal Storage ก็จะหายไปด้วย

ดังนั้นถ้าไม่อยากให้ลบแอปแล้วข้อมูลหายไปด้วย การเก็บข้อมูลไว้ใน Shared Storage ที่อยู่ใน External Storage จึงเป็นทางเลือกที่เหมาะสมกว่า

ขนาดของข้อมูลจะถูกแสดงใน App Info ของแอปด้วย

ไม่ว่าแอปดังกล่าวจะเก็บไฟล์ข้อมูลใด ๆ ไว้ใน Internal Storage เมื่อผู้ใช้กดเข้าไปที่ App Info ของแอป และเลือกเมนู Storage ก็จะเห็นพื้นที่ที่แอปใช้ไปด้วย ซึ่งจะคำนวณจากไฟล์ที่เก็บไว้ใน Internal Storage นั่นเอง

ดังนั้นการเก็บข้อมูลไว้ใน Internal Storage เป็นจำนวนเยอะ ๆ จึงไม่ใช่เรื่องดีเท่าไร เพราะผู้ใช้อาจจะมองได้ว่าแอปของเรากินพื้นที่เครื่องเยอะเกินไป ถ้าจำเป็นต้องเก็บไฟล์ขนาดใหญ่ลงในเครื่องจริง ๆ แนะนำให้เก็บไว้ใน External Storage แทนดีกว่า

และปุ่ม Clear Storage (บางเครื่องจะเป็นคำว่า Clear Data) ก็คือการลบข้อมูลของแอปที่อยู่ใน Internal Storage ทั้งหมดนั่นเอง ในขณะที่ปุ่ม Clear Cache จะเป็นการลบ Cache Directory เท่านั้น

ข้อมูลที่อยู่ใน External Storage

External Storage ออกแบบมาให้เก็บข้อมูลใด ๆ ก็ตามที่ไม่สามารถเก็บไว้ใน Internal Storage ได้ เช่น ไฟล์ข้อมูลที่มีขนาดใหญ่, หรืออยากให้ข้อมูลอยู่ในเครื่องถึงแม้ว่าจะลบแอปออกไปแล้ว เป็นต้น

อย่ายึดติดกับ Directory Path ของ External Storage

อย่างแรกสุดที่นักพัฒนาควรรู้ก็คือ External Storage ไม่ได้มี Directory Path ที่ตายตัว ขึ้นอยู่กับผู้ผลิต (Manufacturer) ว่าจะกำหนดไว้แบบไหน

เช่น External Storage ของ Google Pixel 4 จะอยู่ที่ /sdcard และ /storage/self/primary  เป็นต้น ในขณะที่เครื่องรุ่นอื่นหรือยี่ห้ออื่นอาจจะมี Path ที่แตกต่างกันออกไป

นั่นจึงเป็นที่มาว่าทำไมนักพัฒนาไม่ควรเข้าถึง External Storage ด้วยการกำหนด Path โดยตรง แต่ให้เรียกผ่าน API ที่แอนดรอยด์เตรียมไว้ให้แทน

External Storage มีการแบ่งพื้นที่เป็น 2 ส่วน

ถึงแม้ว่า External Storage จะเป็นพื้นที่ที่ผู้ใช้สามารถเข้าถึงได้ แต่ระบบแอนดรอยด์ได้มีการแบ่งพื้นที่ออกเป็น 2 ส่วนเพื่อรองรับการใช้งานจากแอปในรูปแบบที่แตกต่างกัน

  • App External Storage เป็นพื้นที่เก็บข้อมูลใน External Storage สำหรับแต่ละแอป
  • Shared Storage เป็นพื้นที่เก็บข้อมูลส่วนกลางที่ใครก็สามารถเข้าถึงได้

App External Storage

เป็นพื้นที่เก็บข้อมูลที่คล้ายกับ Internal Storage ตรงที่แอปแต่ละตัวจะมีพื้นที่เป็นของตัวเอง แต่เป็นพื้นที่ในส่วนของ External Storage แทน แต่ความแตกต่างตรงที่ App External Storage จะเป็นพื้นที่ที่ผู้ใช้สามารถใช้แอป File Manager เพื่อเข้ามาจัดการกับข้อมูลที่อยู่ในนั้นได้ ซึ่งต่างจาก Internal Storage ที่ผู้ใช้ไม่สามารถเข้าไปทำอะไรได้เลย

โดย Directory ของ App External Storage จะแบ่งออกเป็น 4 ส่วนด้วยกัน

  • File จะอยู่ใน <external_storage>/Android/data/<package_name>/files
  • Cache จะอยู่ใน <external_storage>/Android/data/<package_name>/cache
  • OBB จะอยู่ใน <external_storage>/Android/obb/<package_name>/
  • Media จะอยู่ใน <external_storage>/Android/media/<package_name>/

แอปที่เป็นเจ้าของไฟล์สามารถเข้าถึง File และ Cache โดยไม่จำเป็นต้องขอ Permission ส่วน Media จะต้องขอ Permission เสมอ และ OBB จะต้องขอ Permission ในแอนดรอยด์บางเวอร์ชันเท่านั้น

Shared Storage

เป็นพื้นที่ส่วนรวมที่ทุกแอปสามารถเข้าถึงได้ แต่ต้องมี Permission เท่านั้น และเป็นพื้นที่หลักที่ผู้ใช้งานจะเข้าถึงและจัดการไฟล์ต่าง ๆ ที่อยู่ภายในเครื่องผ่านแอป File Manager

โดยพื้นที่ของ Shared Storage คือพื้นที่ทั้งหมดที่อยู่ใน External Storage ยกเว้น <external_storage>/Android ที่เป็นพื้นที่ของ App External Storage

ข้อมูลใน App External Storage จะหายเมื่อแอปถูกลบออกจากเครื่องเช่นกัน

เมื่อผู้ใช้ทำการลบแอปออกจากเครื่อง ข้อมูลที่เก็บไว้ใน App External Storage ก็จะถูกลบออกไปเช่นเดียวกับ App Internal Storage

ดังนั้นถ้าไม่อยากให้ลบแอปแล้วข้อมูลหายไปด้วย การเก็บข้อมูลไว้ใน Shared Storage ที่อยู่ใน External Storage จึงเป็นทางเลือกที่เหมาะสมกว่า

ขนาดของข้อมูลใน App External Storage จะถูกแสดงใน App Info ของแอปเช่นกัน

เฉกเช่นเดียวกับ App Internal Storage เมื่อมีข้อมูลที่เก็บไว้ใน App External Storage ก็จะถูกนับรวมและแสดงอยู่ใน App Info ด้วยเช่นกัน และเมื่อผู้ใช้กด Clear Storage (Clear Data) หรือ Clear Cache ก็จะมีผลกับ App External Storage เช่นกัน

SD Card ก็นับว่าเป็น External Storage ด้วยเช่นกัน

อุปกรณ์แอนดรอยด์ที่รองรับ SD Card จะมี Directory Path อยู่ที่ /sdcard และถ้าไม่รองรับ SD Card ในอุปกรณ์แอนดรอยด์บางรุ่นก็อาจจะทำ Alias ไปที่ External Storage ของเครื่องด้วยเช่นกัน

แอป File Manager สามารถเข้าถึงข้อมูลใน External Storage ได้ทั้งหมด

ถึงแม้ว่านักพัฒนาสามารถเก็บข้อมูลไว้ใน External Storage เพื่อให้ข้อมูลยังคงอยู่ในตอนที่แอปโดนลบทิ้ง แต่ผู้ใช้ก็สามารถใช้แอป File Manager เพื่อเข้าไปดูข้อมูลหรือลบไฟล์ทิ้งได้อยู่ ซึ่งจะต่างจากการเก็บข้อมูลไว้ใน Internal Storage ที่แอป File Manager ไม่สามารถเข้าถึงได้

การจัดการกับข้อมูลใน Internal Storage หรือ External Storage

สำหรับ Internal Storage จะไม่ซับซ้อนมากนัก เพราะเป็นพื้นที่ที่แอปสามารถใช้งานได้เลย แต่สำหรับ External Storage ไม่ว่าจะเป็น App External Storage หรือ Shared Storage ก็ตาม จะมีคำสั่งหรือ API ให้ใช้งานแตกต่างกัน และต้องการ Permission ที่แตกต่างกันออกไป โดยขึ้นอยู่กับเวอร์ชันของแอนดรอยด์ด้วย

ดังนั้นเพื่อป้องกันปัญหาจาก Device Storage ที่สามารถเกิดขึ้นจากในแอปได้ นักพัฒนาควรทำตาม Documentation และ Best Practice ของ Android Developers เพื่อให้แอปสามารถทำงานได้ถูกต้องและรองรับแอนดรอยด์เวอร์ชันใหม่ ๆ ในอนาคตได้ง่าย

สรุป

ระบบแอนดรอยด์มี Device Storage สำหรับเก็บข้อมูลเพื่อให้แอปสามารถใช้งานได้ตามต้องการ โดยมีการแบ่งพื้นที่ออกเป็นหลายกลุ่มที่มีจุดประสงค์และรูปแบบการใช้งานที่แตกต่างกันออกไป เพื่อให้ตอบโจทย์กับการทำงานของแอปได้หลากหลายรูปแบบ

ในขณะเดียวกัน นักพัฒนาก็ต้องทำความเข้าใจ Device Storage ในแต่ละแบบด้วย เพื่อให้แอปสามารถใช้งานและจัดการกับข้อมูลในรูปแบบต่าง ๆ ได้อย่างเหมาะสมนั่นเอง

แหล่งข้อมูลอ้างอิง