我制作了一个小型 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/