应用程序缓存目录是临时数据存储,可在下次使用时重新创建。根据 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 缓存(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 文件(预写日志)、回滚日志和索引页。这些文件存储在主数据库旁边,但临时数据库(例如全文搜索或分析)可以指定存储在缓存目录中。预编译的 OpenGL 和 Vulkan 着色器程序也会缓存到此目录中,从而加快图形场景的首次加载速度。在 iOS 上,NSCachesDirectory 建议用于存储 Core Data 的预编译数据和图像处理的临时文件。
缓存清理可以自动(由系统执行)或手动(由用户或应用程序执行)进行。了解系统在不同场景下的行为对于防止数据丢失至关重要。
在 Android 上,当 /data 分区的可用空间低于临界阈值(通常为 500 MB)时,系统会启动缓存清理进程。cacheflush 进程会分析所有已安装应用的缓存大小,并从最旧的文件开始删除最不常用的文件。用户还可以通过系统设置手动清理所有应用的缓存:“设置 → 存储 → 缓存 → 清除缓存”。在 iOS 上,从备份恢复设备时会发生自动缓存清理 — 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)
}
开发人员可以实现编程式缓存清理,根据用户请求或按计划执行。在 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。始终提供回退到内部缓存的方案定期监控应用分析中的缓存大小。将缓存大小指标发送到 Firebase Analytics 或类似系统。如果平均缓存大小超过 100 MB,请优化缓存策略:减少不常用数据的 TTL,在缓存前实施图片压缩(使用 WebP 代替 PNG,将 JPEG 质量降低至 85%),使用分页从服务器加载内容。请记住,使用 16–32 GB 设备的用户对应用大小尤其敏感:当缓存达到 200 MB 时,许多用户开始寻找清理方法或干脆删除应用。根据 Google 的调查,38% 的用户因缓存无节制增长和占用空间而卸载了至少一个应用。
常见问题
不会,清理缓存只会删除临时文件(已保存的图片、服务器响应)。用户数据(密码、设置、数据库)存储在 Internal Storage 中,不受缓存清理影响。
Google Play 建议不超过 100 MB。对于媒体内容密集的应用(社交网络、即时通讯工具),在实现自动清理和通过离散缓存设置限制的前提下,最多可达到 200 MB。
是的,iOS 可以在空间不足或从备份恢复时删除 Library/Caches 中的文件。系统使用可清除存储机制自动清理非关键数据。
cacheDir 位于设备的内部存储器中,卸载应用时会被删除。externalCacheDir 位于 SD 卡上,卸载后可能仍然存在 — 需要在重新安装后首次启动时通过代码手动清理。
Glide、Picasso 和 Coil 等库使用两级缓存:L1 — 内存(用于即时访问的 LRU 缓存),L2 — 磁盘(应用的缓存目录)。磁盘缓存具有可配置的大小限制和旧文件删除策略。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。