背景
应用程序的某些文件只能存储在 res/raw 或 assets 文件夹中。
这两个文件夹的工作方式非常相似。res/raw 文件夹允许更加容易地访问文件,并具有资源文件的所有其他优点;而 assets 文件夹则允许访问文件,无论文件名和结构(包括文件夹和子文件夹)如何。
加载文件的主要思路对于它们两者基本相同。你只需要根据自己的需求选择使用哪一个更方便。
问题
我记得很久以前,我发现了这两个文件夹的一些特殊行为:
assets 文件夹中的每个文件夹都有最大文件数限制。我想大约是 500,但不确定。我很早就注意到这种行为了。
有人说,在 assets 文件夹中的文件有文件大小的限制(例如这里)。但我从未见过这样的限制,甚至在 Android 2.3 上也没有。
有人说(例如这里),并且现在仍然相信(例如这里),如果你从 res/raw 加载文件,它占用的内存比从 assets 文件夹中加载要多得多。
我的尝试
对于第一点,我在项目中从未需要使用更多的文件。当时,我们只是将文件分成了更多的文件夹。
对于第二点,就像我写的那样,我从未注意到过这个问题。我使用了更大的文件大小。
对于问题 #3,我尝试创建一个示例项目以比较两种方法之间的内存使用情况。我没有注意到两种方法之间(内存使用或加载时间)存在任何差异,尤其是没有明显的差异。不幸的是,我只有一个设备(Nexus 5x),而且它运行着相当新的Android版本(8.1)。从特定的Android版本开始可能没有使用这两种方法之间的区别。另外一个原因是在Java上测量内存使用更加困难,因为GC的缘故,并且我已经注意到在Android 8.x上,内存的工作方式与以前有些不同(写在这里)。
我尝试了解上述文件夹之间的差异和限制,但所有我找到的文章都过时了,所以我认为事情可能已经发生了改变。
问题
实际上只有一个问题,但我想将其分开以防答案复杂:
在使用res/raw和assets文件夹时,是否存在任何重大或独特的限制或差异?
从assets文件夹中读取文件是否真的比使用res/raw占用更少的内存?是否如此之多,以至于即使是最受欢迎的开发人员之一(这里),现在仍然选择使用它?
上述限制是否存在于特定的Android版本中,然后它们变得完全相同,没有任何限制(当然除了res/raw的文件命名方式,但这只是其工作原理)?
如果是这样,从哪个Android版本开始它们的工作方式基本相同?