使用资产或res/raw文件夹时是否存在重大差异或限制?

11

背景

应用程序的某些文件只能存储在 res/raw 或 assets 文件夹中。

这两个文件夹的工作方式非常相似。res/raw 文件夹允许更加容易地访问文件,并具有资源文件的所有其他优点;而 assets 文件夹则允许访问文件,无论文件名和结构(包括文件夹和子文件夹)如何。

加载文件的主要思路对于它们两者基本相同。你只需要根据自己的需求选择使用哪一个更方便。

问题

我记得很久以前,我发现了这两个文件夹的一些特殊行为:

  1. assets 文件夹中的每个文件夹都有最大文件数限制。我想大约是 500,但不确定。我很早就注意到这种行为了。

  2. 有人说,在 assets 文件夹中的文件有文件大小的限制(例如这里)。但我从未见过这样的限制,甚至在 Android 2.3 上也没有。

  3. 有人说(例如这里),并且现在仍然相信(例如这里),如果你从 res/raw 加载文件,它占用的内存比从 assets 文件夹中加载要多得多。

我的尝试

对于第一点,我在项目中从未需要使用更多的文件。当时,我们只是将文件分成了更多的文件夹。

对于第二点,就像我写的那样,我从未注意到过这个问题。我使用了更大的文件大小。

对于问题 #3,我尝试创建一个示例项目以比较两种方法之间的内存使用情况。我没有注意到两种方法之间(内存使用或加载时间)存在任何差异,尤其是没有明显的差异。不幸的是,我只有一个设备(Nexus 5x),而且它运行着相当新的Android版本(8.1)。从特定的Android版本开始可能没有使用这两种方法之间的区别。另外一个原因是在Java上测量内存使用更加困难,因为GC的缘故,并且我已经注意到在Android 8.x上,内存的工作方式与以前有些不同(写在这里)。

我尝试了解上述文件夹之间的差异和限制,但所有我找到的文章都过时了,所以我认为事情可能已经发生了改变。

问题

实际上只有一个问题,但我想将其分开以防答案复杂:

  1. 在使用res/raw和assets文件夹时,是否存在任何重大或独特的限制或差异?

  2. 从assets文件夹中读取文件是否真的比使用res/raw占用更少的内存?是否如此之多,以至于即使是最受欢迎的开发人员之一(这里),现在仍然选择使用它?

  3. 上述限制是否存在于特定的Android版本中,然后它们变得完全相同,没有任何限制(当然除了res/raw的文件命名方式,但这只是其工作原理)?

  4. 如果是这样,从哪个Android版本开始它们的工作方式基本相同?

1个回答

4

使用res/raw和assets文件夹有哪些主要或独特的限制或区别?

现在,在Android中,我们对assets或raw中任何文件的最大限制大小没有任何限制。

Android文档:

将任意文件以原始形式保存。要使用原始InputStream打开这些资源,请使用资源ID调用Resources.openRawResource(),即R.raw.filename。

但是,如果您需要访问原始文件名和文件层次结构,则可以考虑将某些资源保存在assets/目录中(而不是res/raw/)。位于assets/中的文件不会被赋予资源ID,因此只能使用AssetManager读取它们。

从assets文件夹中读取文件(通过创建输入流)是否真的比使用res/raw占用更少的内存?甚至连最受欢迎的开发人员之一(在这里)都决定选择它,即使在今天也是如此吗?

没有,我没有发现任何内存使用方面的差异。这是Android目前存在的最大混乱之一,同时我们也没有任何关于它们内存限制的官方文档。

这些限制是否存在于特定的Android版本中,然后在没有任何限制的情况下变得相同(当然除了res/raw文件命名,但那只是它的工作原理)?

在Android 2.3之前,我们对资产文件夹有1 MB的内存限制。请参考link

如果是这样,从哪个Android版本开始它们的工作方式大致相同?

从Android 2.3开始,我们没有任何与内存相关的限制,这是在2010年12月推出的。


  1. 我记得有一个限制,但我没有在任何地方看到它被提到。我必须有大量的文件,并且由于它存在问题,我不得不将它们分成更多的文件夹。
  2. 那么他为什么要花时间去做呢?他甚至还放了一篇关于此的文章链接(这里:http://blog.danlew.net/2013/08/20/joda_time_s_memory_issue_in_android/)。文章中写道:“由于某种原因,如果您使用getResourceAsStream(),它会进行一些相当极端的缓存并占用大量内存。” 3.+4. 好的。
- android developer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接