ไดเรกทอรีแคชของแอปพลิเคชันคือพื้นที่จัดเก็บข้อมูลชั่วคราวที่สามารถสร้างใหม่ได้เมื่อใช้งานครั้งถัดไป ตามข้อมูลจาก Android Developers, 2026 ระบบสามารถลบไฟล์ออกจากไดเรกทอรีนี้เมื่อหน่วยความจำไม่เพียงพอโดยไม่ต้องแจ้งเตือน ดังนั้นแอปพลิเคชันไม่ควรพึ่งพา ความคงอยู่ของแคช สำหรับข้อมูลที่สำคัญอย่างยิ่ง การใช้ไดเรกทอรีแคชอย่างถูกต้องช่วยลดพื้นที่จัดเก็บและเร่งความเร็วในการโหลดเนื้อหา
ประเด็นสำคัญ
context.cacheDir และ context.externalCacheDir สำหรับเก็บแคชบนหน่วยความจำภายในและภายนอกNSCachesDirectory ซึ่งถูกยกเว้นจากการสำรองข้อมูล iCloud โดยอัตโนมัติไดเรกทอรีแคช คือไดเรกทอรีพิเศษในหน่วยความจำภายใน (หรือภายนอก) ของแอปพลิเคชันที่ออกแบบมาสำหรับไฟล์ชั่วคราว ความแตกต่างหลักจาก Internal Storage: ระบบมีสิทธิ์ลบไฟล์ออกจากแคชโดยไม่ต้องแจ้งเตือนหากอุปกรณ์มีพื้นที่ว่างน้อย ดังนั้นแอปพลิเคชันไม่ควรเก็บสำเนาเดียวของข้อมูลผู้ใช้สำคัญไว้ในแคช แคชเหมาะสำหรับรูปภาพที่ดาวน์โหลด การตอบสนองของเซิร์ฟเวอร์ ทรัพยากรที่คอมไพล์ล่วงหน้า และข้อมูลอื่นใดที่สามารถกู้คืนจากระยะไกลหรือสร้างใหม่โดยโปรแกรม
บน Android ไดเรกทอรีแคชอยู่ที่ /data/data/<package>/cache/ และเข้าถึงได้ผ่าน context.cacheDir ขนาดแคชไม่ได้ถูกจำกัดอย่างชัดเจน แต่ Google Play แนะนำไม่ให้เกิน 100 MB เนื่องจากแอปที่มีแคชขนาดใหญ่มักได้รับรีวิวเชิงลบจากผู้ใช้ บน iOS ไดเรกทอรีแคชอยู่ในคอนเทนเนอร์ Sandbox ที่ Library/Caches/ และเข้าถึงได้ผ่าน NSCachesDirectory iOS สามารถลบไฟล์จาก Caches เมื่อกู้คืนอุปกรณ์จากการสำรองข้อมูลหรือเมื่อพื้นที่ไม่เพียงพออย่างรุนแรง — ผู้ใช้ควรได้รับแจ้งเกี่ยวกับเรื่องนี้ในเอกสารประกอบของแอป
การทำความเข้าใจว่าข้อมูลใดสามารถวางใน แคช ได้อย่างปลอดภัยและข้อมูลใดควรเก็บใน Internal Storage หรือ Documents เป็นทักษะสำคัญของนักพัฒนา การใช้แคชที่ไม่ถูกต้องนำไปสู่ปัญหาสองประการที่ตรงกันข้าม: แอปใช้พื้นที่มากเกินไป (หากนักพัฒนาเก็บสิ่งที่ควรอยู่ใน Documents ไว้ในแคช) หรือผู้ใช้สูญเสียข้อมูล (หากนักพัฒนาเก็บสิ่งที่ควรถูกจัดเก็บอย่างถาวรไว้ในแคช) ปฏิบัติตามกฎง่ายๆ: หากข้อมูลสามารถกู้คืนได้ — แคช หากการกู้คืนเป็นไปไม่ได้ — Internal Storage หรือ Documents
ข้อมูลประเภทต่างๆ มี ความเร็วในการสร้างใหม่ และข้อกำหนดด้านพื้นที่แตกต่างกัน การทำความเข้าใจคุณลักษณะเหล่านี้ช่วยให้นักพัฒนาเลือกได้อย่างถูกต้องว่าไฟล์ใดควรใส่ในแคชและไฟล์ใดในพื้นที่จัดเก็บถาวร
ประเภทข้อมูลที่ถูกแคชที่พบบ่อยที่สุดคือ รูปภาพ ที่ดาวน์โหลดจากเครือข่าย ไลบรารีอย่าง Glide, Picasso และ Coil จะบันทึกรูปภาพที่ดาวน์โหลดไว้ในไดเรกทอรีแคชของแอปโดยอัตโนมัติ ขนาดแคชรูปภาพทั่วไปในแอปโซเชียลมีตั้งแต่ 50 ถึง 200 MB ขนาดแคชขึ้นอยู่กับความละเอียดหน้าจอของอุปกรณ์และปริมาณเนื้อหาที่ดู Glide ใช้แคชสองระดับ: ตรวจสอบแคช L1 ใน RAM ก่อน (อัลกอริทึม LRU) จากนั้นตรวจสอบแคช L2 บนดิสก์ ซึ่งช่วยให้โหลดรูปภาพที่ดูซ้ำๆ ได้อย่างรวดเร็วโดยไม่ต้องร้องขอเครือข่ายเพิ่มเติม การกำหนดค่าขนาดสูงสุดของแคชดิสก์ผ่าน DiskCacheStrategy ช่วยควบคุมพื้นที่ที่ใช้: เมื่อเกินขีดจำกัด ไลบรารีจะลบไฟล์ที่ไม่ได้ใช้น้อยที่สุดโดยอัตโนมัติ
val cacheDir = File(context.cacheDir, "image_cache")
val maxSize = 50 * 1024 * 1024 // 50 MB
val cache = DiskLruCache.open(cacheDir, 1, 1, maxSize)
cache.edit("key")?.let { editor ->
editor.newOutputStream(0).use { stream ->
// เขียนข้อมูลไปยังแคช
}
}
การตอบสนองของคำขอ API สามารถ ถูกแคช เพื่อการเข้าถึงแบบออฟไลน์และลดภาระของเซิร์ฟเวอร์ OkHttp รองรับการแคชในตัวผ่านคลาส Cache ส่วนหัวการตอบสนอง Cache-Control และ ETag จัดการนโยบายแคช: เซิร์ฟเวอร์ระบุว่าการตอบสนองจะถือว่าใช้ได้นานเท่าใด ด้วยการกำหนดค่าที่เหมาะสม แคชคำขอเครือข่ายสามารถลดเวลาในการโหลดข้อมูลได้ 60–80% ในการเข้าชมซ้ำ และให้ฟังก์ชันการทำงานพื้นฐานของแอปโดยไม่ต้องเชื่อมต่ออินเทอร์เน็ต ขนาดแคชคำขอเครือข่ายไม่ค่อยเกิน 10–20 MB แต่เมื่อใช้งานหนักอาจถึง 50 MB กำหนดค่าขนาดแคชสูงสุดผ่านคอนสตรัคเตอร์ OkHttpClient.Builder และตรวจสอบความถูกต้องของข้อมูลที่แคชไว้ทุกครั้งที่เริ่มต้นแอป
ฐานข้อมูล SQLite สามารถสร้างไฟล์ชั่วคราวระหว่างการทำงาน: ไฟล์ WAL (Write-Ahead Log), วารสาร rollback และหน้าดัชนี ไฟล์เหล่านี้จะถูกเก็บไว้ข้างฐานข้อมูลหลัก แต่สำหรับฐานข้อมูลชั่วคราว (เช่น การค้นหาข้อความแบบเต็มหรือการวิเคราะห์) สามารถระบุตำแหน่งในไดเรกทอรีแคชได้ โปรแกรม shader OpenGL และ Vulkan ที่คอมไพล์ล่วงหน้าก็ถูกแคชในไดเรกทอรีนี้เช่นกัน ซึ่งช่วยเร่งการโหลดฉากกราฟิกครั้งแรก บน iOS แนะนำให้ใช้ NSCachesDirectory สำหรับเก็บข้อมูล Core Data ที่คอมไพล์ล่วงหน้าและไฟล์ประมวลผลรูปภาพชั่วคราว
การล้างแคชสามารถเกิดขึ้น โดยอัตโนมัติ (โดยระบบ) หรือ ด้วยตนเอง (โดยผู้ใช้หรือแอป) การทำความเข้าใจพฤติกรรมของระบบในสถานการณ์ต่างๆ เป็นสิ่งจำเป็นเพื่อป้องกันการสูญเสียข้อมูล
บน Android ระบบจะเริ่มกระบวนการล้างแคชเมื่อพื้นที่ว่างในพาร์ติชัน /data ลดลงต่ำกว่าเกณฑ์วิกฤต (โดยปกติ 500 MB) กระบวนการ cacheflush จะวิเคราะห์ขนาดแคชของแอปทั้งหมดที่ติดตั้งและลบไฟล์ที่ไม่ได้ใช้น้อยที่สุด โดยเริ่มจากไฟล์ที่เก่าที่สุด ผู้ใช้ยังสามารถล้างแคชของแอปทั้งหมดด้วยตนเองผ่านการตั้งค่าระบบ: “การตั้งค่า → พื้นที่จัดเก็บ → แคช → ล้างแคช” บน iOS การล้าง Caches อัตโนมัติเกิดขึ้นเมื่อกู้คืนอุปกรณ์จากการสำรองข้อมูล — iOS ไม่ได้กู้คืนเนื้อหาของ Library/Caches/ นอกจากนี้ iOS อาจลบไฟล์จาก Caches แบบเลือกสรรเมื่อพื้นที่ว่างหมด โดยใช้กลไกพื้นที่จัดเก็บที่สามารถล้างได้สำหรับข้อมูลที่แยกออกมา
let fm = FileManager.default
let cachesURL = fm.urls(
for: .cachesDirectory,
in: .userDomainMask
).first!
let contents = try fm.contentsOfDirectory(
at: cachesURL,
includingPropertiesForKeys: nil
)
for fileURL in contents {
try fm.removeItem(at: fileURL)
}
นักพัฒนาสามารถ implement การล้างแคชโดยโปรแกรม ตามคำขอของผู้ใช้หรือตามกำหนดเวลา บน Android การล้างแคชของแอปเองทำได้โดยการลบไฟล์ทั้งหมดใน context.cacheDir และ context.externalCacheDir บน iOS ให้ล้างเนื้อหาของ Library/Caches/ แต่อย่าลบไดเรกทอรี本身 — ลบเฉพาะเนื้อหาเท่านั้น แนะนำให้แสดงขนาดแคชปัจจุบันแก่ผู้ใช้ในการตั้งค่าแอปพร้อมกับปุ่ม “ล้างแคช” พร้อมการยืนยัน ตาม Google Play Console แอปที่มีปุ่มล้างแคชได้รับการร้องเรียนเกี่ยวกับพื้นที่ไม่เพียงพอน้อยกว่า 22% เมื่อเทียบกับแอปที่ไม่มีฟีเจอร์นี้ การล้างแคชควรปลอดภัย: แอปต้องจัดการสถานการณ์เมื่อไฟล์ที่แคชไว้ถูกลบอย่างถูกต้องและโหลดซ้ำอย่างโปร่งใสเมื่อเข้าถึงครั้งถัดไป
แม้จะมี วัตถุประสงค์ เดียวกัน การใช้งานไดเรกทอรีแคชบน Android และ iOS มีความแตกต่างอย่างมีนัยสำคัญ นักพัฒนาต้องคำนึงถึงสิ่งเหล่านี้เพื่อให้แอปทำงานได้อย่างถูกต้องบนทั้งสองแพลตฟอร์ม
| คุณลักษณะ | Android | iOS |
|---|---|---|
| เส้นทางเริ่มต้น | /data/data/<package>/cache/ | Library/Caches/ |
| API การเข้าถึง | context.cacheDir | NSCachesDirectory |
| แคชภายนอก | context.externalCacheDir | ไม่มี |
| การสำรองข้อมูล | ไม่ได้รับการสำรอง | ไม่ได้รับการสำรอง |
| การล้างโดยระบบ | เมื่อพื้นที่ไม่เพียงพอ | เมื่อกู้คืนจากการสำรองและเมื่อพื้นที่ไม่เพียงพอ |
| การมองเห็นต่อผู้ใช้ | ในการตั้งค่าแอป | เฉพาะเมื่อเชื่อมต่อกับคอมพิวเตอร์ |
Android มีไดเรกทอรีแคชภายนอกแยกต่างหากผ่าน context.externalCacheDir — อยู่ในการ์ด SD (หากติดตั้ง) และจะไม่ถูกลบเมื่อถอนการติดตั้งแอป ซึ่งสะดวกสำหรับไฟล์สื่อขนาดใหญ่ แต่สร้างความเสี่ยงในการทิ้งขยะบนการ์ดหน่วยความจำ iOS ไม่มีแนวคิดเรื่องแคชภายนอก: ไฟล์ชั่วคราวทั้งหมดจะถูกเก็บไว้ภายในคอนเทนเนอร์ Sandbox และจะถูกลบอย่างแน่นอนเมื่อถอนการติดตั้ง บน Android แคชจะปรากฏแก่ผู้ใช้ในการตั้งค่าแอป และผู้ใช้สามารถล้างได้ด้วยตนเอง บน iOS การตั้งค่าระบบไม่แสดงขนาดแคชของแต่ละแอป — ผู้ใช้สามารถล้างแคชได้โดยการลบและติดตั้งแอปใหม่เท่านั้น เว้นแต่นักพัฒนาจะเพิ่มปุ่มล้างในอินเทอร์เฟซ
ความแตกต่างที่สำคัญ — พฤติกรรมเมื่อกู้คืน บน iOS เมื่อกู้คืนจากการสำรองข้อมูล iTunes หรือ iCloud ไดเรกทอรี Caches จะไม่ถูกกู้คืน เนื่องจาก iOS ถือว่าข้อมูลที่แคชไว้จะถูกสร้างใหม่เมื่อเริ่มต้นครั้งแรก บน Android เมื่อกู้คืนจาก Google Drive จะมีเพียง Internal Storage เท่านั้นที่ถูกสำรอง — แคชจะยังคงว่างเปล่าหลังการกู้คืน ในทั้งสองกรณี แอปต้องทำงานอย่างถูกต้องกับแคชที่ว่างเปล่า โดยไม่แสดงข้อผิดพลาดแก่ผู้ใช้หรือสูญเสียฟังก์ชันการทำงาน
การจัดการแคชที่เหมาะสม เป็นปัจจัยหนึ่งที่มีผลต่อประสบการณ์ผู้ใช้และการให้คะแนนแอป คำแนะนำต่อไปนี้จะช่วยหลีกเลี่ยงปัญหาทั่วไปและเพิ่มความพึงพอใจของผู้ใช้
context.externalCacheDir อาจคืนค่า null หากไม่ได้ติดตั้งการ์ด SD หรือไม่พร้อมใช้งาน ให้เตรียม fallback ไปยังแคชภายในเสมอติดตาม ขนาดแคช อย่างสม่ำเสมอในการวิเคราะห์แอป รวมการรายงานเมตริกขนาดแคชใน Firebase Analytics หรือระบบที่คล้ายกัน หากขนาดแคชเฉลี่ยเกิน 100 MB ให้ปรับกลยุทธ์การแคชให้เหมาะสม: ลด TTL สำหรับข้อมูลที่ไม่ได้ใช้บ่อย, implement การบีบอัดรูปภาพก่อนแคช (WebP แทน PNG, ลดคุณภาพ JPEG เหลือ 85%), ใช้การแบ่งหน้าเพื่อโหลดเนื้อหาจากเซิร์ฟเวอร์ จำไว้ว่าผู้ใช้ที่มีอุปกรณ์ 16–32 GB มีความไวต่อขนาดแอปเป็นพิเศษ: เมื่อแคชถึง 200 MB ผู้ใช้จำนวนมากเริ่มมองหาวิธีล้างหรือเพียงแค่ลบแอป ตามการสำรวจของ Google ผู้ใช้ 38% เคยลบแอปอย่างน้อยหนึ่งตัวเนื่องจากการเติบโตของแคชที่ไม่สามารถควบคุมได้และการใช้พื้นที่จัดเก็บ
คำถามที่พบบ่อย
ไม่ การล้าง แคช จะลบเฉพาะไฟล์ชั่วคราว (รูปภาพที่บันทึกไว้ การตอบสนองของเซิร์ฟเวอร์) ข้อมูลผู้ใช้ (รหัสผ่าน การตั้งค่า ฐานข้อมูล) ถูกเก็บใน Internal Storage และไม่ได้รับผลกระทบเมื่อล้างแคช
Google Play แนะนำไม่ให้เกิน 100 MB สำหรับแอปที่มีเนื้อหาสื่อเข้มข้น (โซเชียลเน็ตเวิร์ก แอปส่งข้อความ) สามารถสูงถึง 200 MB ได้ โดยมีเงื่อนไขว่าต้อง implement การล้างอัตโนมัติและกำหนดขีดจำกัดผ่านแคชแบบแยก
ใช่ iOS สามารถลบไฟล์จาก Library/Caches เมื่อพื้นที่ไม่เพียงพอหรือเมื่อกู้คืนจากการสำรองข้อมูล ระบบใช้กลไกพื้นที่จัดเก็บที่สามารถล้างได้สำหรับการล้างข้อมูลที่ไม่สำคัญโดยอัตโนมัติ
cacheDir อยู่ในหน่วยความจำภายในของอุปกรณ์และจะถูกลบเมื่อถอนการติดตั้งแอป externalCacheDir อยู่ในการ์ด SD และอาจยังคงอยู่หลังการถอนการติดตั้ง — ต้องล้างด้วยตนเองผ่านโค้ดในการเริ่มต้นครั้งแรกหลังจากติดตั้งใหม่
ไลบรารีอย่าง Glide, Picasso และ Coil ใช้แคชสองระดับ: L1 — RAM (แคช LRU สำหรับการเข้าถึงทันที), L2 — ดิสก์ (ไดเรกทอรีแคชของแอป) แคชดิสก์มีขีดจำกัดขนาดที่กำหนดค่าได้และนโยบายการลบไฟล์เก่า
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม