应用程序缓存目录 — 定义、用途及移动开发中的清理方法

作者: IT Sectr 发布日期: 2026-03-13 阅读时间: 10 分钟

应用程序缓存目录是临时数据存储,可在下次使用时重新创建。根据 Android Developers, 2026,系统可能在内存不足时删除此目录中的文件而不发出警告,因此应用程序不应依赖缓存数据来保存关键数据。正确使用缓存目录可减少占用的空间并加快内容加载速度。

要点

  • Cache Directory — 可重新创建的临时文件存储,不适用于永久数据
  • Android 提供 context.cacheDircontext.externalCacheDir 用于在内部和外部存储器上存储缓存
  • iOS 使用 NSCachesDirectory,该目录自动排除在 iCloud 备份之外
  • 系统可随时清除缓存 — 关键数据请存储在 Internal Storage 中
  • 手动清理通过应用设置中的缓存清理可提高用户信任度和评价

什么是应用程序缓存目录?

缓存目录是应用程序内部(或外部)存储器中的一个特殊目录,用于存放临时文件。与 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 设置磁盘缓存的最大大小可以控制占用的空间:超过限制时,库会自动删除最不常用的文件。

kotlin
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 和 iOS 的缓存清理机制

缓存清理可以自动(由系统执行)或手动(由用户或应用程序执行)进行。了解系统在不同场景下的行为对于防止数据丢失至关重要。

系统自动清理

Android 上,当 /data 分区的可用空间低于临界阈值(通常为 500 MB)时,系统会启动缓存清理进程。cacheflush 进程会分析所有已安装应用的缓存大小,并从最旧的文件开始删除最不常用的文件。用户还可以通过系统设置手动清理所有应用的缓存:“设置 → 存储 → 缓存 → 清除缓存”。在 iOS 上,从备份恢复设备时会发生自动缓存清理 — iOS 不会恢复 Library/Caches/ 的内容。此外,当设备可用空间不足时,iOS 可以选择性地删除 Caches 中的文件,对隔离数据使用可清除存储机制。

swift
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.cacheDircontext.externalCacheDir 中的所有文件即可清理自己的缓存。在 iOS 上,可以清理 Library/Caches/ 的内容,但不要删除目录本身 — 只删除其内容。建议在应用程序设置中向用户显示当前缓存大小和“清除缓存”按钮,并请求确认。根据 Google Play Console 的数据,具有缓存清理按钮的应用比没有此功能的应用少收到 22% 的空间不足投诉。缓存清理应该是安全的:应用程序应正确处理缓存文件被删除的情况,并在下次使用时透明地重新加载它们。

Android 和 iOS 上的 cacheDir 区别

尽管用途相同,但 Android 和 iOS 上缓存目录的实现存在显著差异。开发人员需要考虑到这些差异才能在两个平台上正确运行应用程序。

特性AndroidiOS
默认路径/data/data/<package>/cache/Library/Caches/
访问 APIcontext.cacheDirNSCachesDirectory
外部缓存context.externalCacheDir
备份不备份不备份
系统清理空间不足时从备份恢复时和空间不足时
用户可见性在应用设置中仅连接电脑时

Android 通过 context.externalCacheDir 提供单独的外部缓存目录 — 位于 SD 卡上(如果已安装),并且在卸载应用时不会删除。这对于大型媒体文件很方便,但会在存储卡上留下垃圾文件。iOS 没有外部缓存的概念:所有临时文件都存储在 Sandbox 容器内,并且卸载时保证删除。在 Android 上,缓存在应用设置中对用户可见,用户可以手动清理。在 iOS 上,系统设置不显示单个应用的缓存大小 — 除非开发人员在界面中添加了清理按钮,否则用户只能通过删除并重新安装应用来清理缓存。

一个重要的区别是恢复时的行为。在 iOS 上,从 iTunes 或 iCloud 备份恢复时,Caches 目录不会被恢复,因为 iOS 认为缓存数据会在首次启动时重新创建。在 Android 上,从 Google Drive 恢复时只备份 Internal Storage — 恢复后缓存保持为空。在这两种情况下,应用程序都应正确处理空缓存,不向用户显示错误且不丢失功能。

缓存管理建议

良好的缓存管理是影响用户体验和应用评级的因素之一。以下建议有助于避免常见问题并提高用户满意度。

  • 设置缓存大小限制。使用 DiskLruCache 或类似库,指定以 MB 为单位的最大容量。超过限制时,库会自动删除最不常用的文件
  • 在应用设置中实现清理按钮。显示当前缓存大小(格式如“12.5 MB”),并在清理前请求确认。清理后更新显示的大小
  • 不要在缓存中存储无法恢复的文件。如果数据对应用运行至关重要,请将其存储在 Internal Storage(Android)或 Documents(iOS)中,缓存中仅存放用于快速访问的副本
  • 写入前检查外部缓存的可用性。在 Android 上,如果 SD 卡未安装或不可用,context.externalCacheDir 可能返回 null。始终提供回退到内部缓存的方案
  • 使用过期策略(TTL)管理缓存数据。不要将文件存储超过必要时间:图片为 24–48 小时,API 响应为 5 分钟到 1 小时,取决于数据更新频率

定期监控应用分析中的缓存大小。将缓存大小指标发送到 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 会自动清理应用缓存吗?

是的,iOS 可以在空间不足或从备份恢复时删除 Library/Caches 中的文件。系统使用可清除存储机制自动清理非关键数据。

Android 上 cacheDir 和 externalCacheDir 有什么区别?

cacheDir 位于设备的内部存储器中,卸载应用时会被删除。externalCacheDir 位于 SD 卡上,卸载后可能仍然存在 — 需要在重新安装后首次启动时通过代码手动清理。

图片加载库如何管理缓存?

Glide、Picasso 和 Coil 等库使用两级缓存:L1 — 内存(用于即时访问的 LRU 缓存),L2 — 磁盘(应用的缓存目录)。磁盘缓存具有可配置的大小限制和旧文件删除策略。

总结

  • Cache Directory — 可重新创建数据的临时存储,系统可在空间不足时在不通知的情况下清理
  • Android 提供 cacheDir(内部存储器)和 externalCacheDir(SD 卡)— 两个目录都不备份,可能被系统清理
  • iOS 使用 Library/Caches,自动排除在 iCloud 和 iTunes 备份之外
  • 缓存数据类型 — 图片(库的 L2 缓存)、API 响应(OkHttp Cache)、预编译资源(着色器、临时数据库)
  • 缓存大小限制 — 不超过 100–200 MB,通过 DiskLruCache 或类似机制自动清理旧文件
  • 应用设置中的清理按钮可减少负面评价并提高用户信任度
  • 关键数据绝不存储在缓存中 — 使用 Internal Storage(Android)或 Documents Directory(iOS)进行持久存储

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读