android - 如何测量 Android 应用程序数据大小并识别存储泄漏?

标签 android sqlite caching storage

我制作了一个小型 Android 应用程序,现在已经使用了一段时间。我注意到,在设置中,在我的应用程序特性的“数据”行(我对分析“应用程序”行和“缓存”行上显示的数量不感兴趣),它显示大约 20 MB,这对我来说似乎很多。恐怕该应用存在存储泄漏(即它产生的数据永远不会被删除)。

我决定调查和测量可能占用那么多空间的东西。我用了很多 all the available storage options对于此应用程序:SQLite 数据库、内部文件、外部文件、共享首选项(和缓存文件,包括 Glide 图片加载)。

到目前为止,感谢 a question on SQLite DB ,我发现我的 DB 文件大约需要 500 kB。通过递归扫描文件夹 getFilesDir() 中的文件和文件夹,我发现我在内部和应用程序私有(private)的外部文件中使用了 10 kB 的数据。我还没有分析共享首选项的大小,但我存储的键/值对少于 20 个。

探索文件夹 getCacheDirs() 我还发现 Glide 使用大约 3 MB 的缓存(接近 Android 设置应用程序显示的内容)。

我的问题是,我错过了哪些线索,无法找到这 19.5 MB 数据的位置?我是否忘记了某种可能占用空间的存储空间?而且,更一般地说,是否有分析存储泄漏的工具(即应用程序产生的可能永远不会被删除的数据)?

最佳答案

按照@James 的建议,我开始探索不同的文件夹,在与同事讨论这个问题并尝试探索许多文件夹之后,我终于发现大部分数据来 self 以前的 Webview 的缓存。我正在发布我所有的调查,希望它会有所帮助。

我在应用程序启动时执行了以下代码,从我的主要 Activity 调用 analyseStorage(this):

public void analyseStorage(Context context) {
  File appBaseFolder = context.getFilesDir().getParentFile();
  long totalSize = browseFiles(appBaseFolder);
  Log.d(STORAGE_TAG, "App uses " + totalSize + " total bytes");
}

private long browseFiles(File dir) {
  long dirSize = 0;
  for (File f: dir.listFiles()) {
    dirSize += f.length();
    Log.d(STORAGE_TAG, dir.getAbsolutePath() + "/" + f.getName() + " uses " + f.length() + " bytes");
    if (f.isDirectory()) {
      dirSize += browseFiles(f);
    }
  }
  Log.d(STORAGE_TAG, dir.getAbsolutePath() + " uses " + dirSize + " bytes");
  return dirSize;
}

重要的是专门扫描 context.getFilesDir().getParentFile() 匹配文件夹 /data/data/my.app.package/

执行该代码后,我得到以下日志:

D/storage﹕ /data/data/my.app.package/lib uses 0 bytes
D/storage﹕ /data/data/my.app.package/cache uses 3371773 bytes
D/storage﹕ /data/data/my.app.package/databases uses 483960 bytes
D/storage﹕ /data/data/my.app.package/shared_prefs uses 604 bytes
D/storage﹕ /data/data/my.app.package/app_webview uses 9139469 bytes
D/storage﹕ /data/data/my.app.package/files uses 7723 bytes
D/storage﹕ /data/data/my.app.package/app_ACRA-approved uses 0 bytes
D/storage﹕ /data/data/my.app.package/app_ACRA-unapproved uses 0 bytes
D/storage﹕ App uses 13003529 total bytes

我能看到的是:

  • 缓存,仅Glide用于图片加载,占用3MB
  • SQLite数据库占用500kB
  • 共享首选项占用600B
  • 我以前拥有的所有 Webview 的缓存仍然需要 9MB
  • files 和其他文件夹下的其余文件主要由 ACRA 用于错误跟踪,占用 10kB

最后,我终于发现,我的大部分数据都去了Webview缓存,实际上并没有明确存储为缓存。我删除了这些文件,它实际上将我的应用程序的大小减少了 20MB,甚至比上面列出的还要多。我现在知道我的应用程序的数据需要多少数量级。

关于android - 如何测量 Android 应用程序数据大小并识别存储泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35951332/

相关文章:

sql - SQLite 中的更新语法

java - 当我循环遍历所有行时更新列

angular - 通过 Angular 6 Service Worker 中的新鲜度缓存 Assets

java - Hibernate缓存技术

facebook的Android共享 Intent -共享文本和链接

android - 在 Android 上播放音频

java - Android 数据库 SQLite 平均值

android - 关于外部 Jar -- android-support-v13.jar 的一些问题

android - 如何在 android 中禁用 GestureListener?

caching - 如何使用缓存旁路模式避免数据库查询 Storm