/res和/assets目录之间的区别

我知道res目录中的文件可以从R.class访问,而资产的行为就像一个文件系统,但我想知道,在一般情况下,什么时候最好使用一个和另一个 谁能帮我了解一下资产和资产的真正区别?< / p >

140152 次浏览

如果您需要在Java代码中的某个地方引用它们,那么您宁愿将文件放到“res”目录中。

res文件夹中的所有文件都将被索引到R文件中,这使得加载它们更快(也更容易!)

两者都很相似。两者之间真正的主要区别在于,在res目录中,每个文件都有一个预编译的ID,可以通过R.id.[res id]轻松访问。这是有用的快速和轻松地访问图像,声音,图标…

assets目录更像一个文件系统,提供了更多的自由,可以把任何你想要的文件放在那里。然后,您可以访问该系统中的每个文件,就像通过Java访问任何文件系统中的任何文件一样。这个目录可以存放游戏细节、字典等等。希望这能有所帮助。

有了资源,就有了内置的支持,可以为不同的语言、OS版本、屏幕方向等提供替代方案,如在这里所述。这些资产都不具备。此外,API的许多部分支持使用资源标识符。最后,资源的名称被转换为常量字段名,在编译时进行检查,这样代码和资源本身之间不匹配的机会就会减少。这些都不适用于资产。

那么为什么要有资产文件夹呢?如果你想计算你想在运行时使用的资产,这很简单。对于资源,您必须声明一个包含可能使用的所有资源id的列表,并计算该列表的索引。(这有点尴尬,如果资源集在开发周期中发生变化,就会引入错误的机会。)(编辑:您可以使用getIdentifier按名称检索资源ID,但这失去了编译时检查的好处。)资产还可以组织到文件夹层次结构中,这是资源不支持的。这是一种不同的数据管理方式。虽然资源涵盖了大多数情况,但资产偶尔也有用处。

另一个区别是:库项目中定义的资源会自动导入到依赖于该库的应用程序项目中。对于资产而言,这种情况不会发生;资产文件必须出现在应用程序项目的资产目录中。[编辑:随着Android的新基于gradle的构建系统(与Android Studio一起使用),这不再是真的。库项目的资产目录被打包到.aar文件中,因此库项目中定义的资产被合并到应用程序项目中(因此,如果它们在引用库中,它们不必出现在应用程序的/assets目录中)。]

编辑:如果你想在你的应用程序中打包一个自定义字体,还会出现另一个区别。有API调用可以从存储在文件系统或应用程序的assets/目录中的字体文件创建Typeface。但是没有API可以从存储在res/目录中的字体文件(或从允许使用res/目录的InputStream)中创建Typeface。[注意:使用Android O(现在在alpha预览版中可用),你将能够包括自定义字体作为资源。请参阅这个早就该使用的特性的描述在这里。然而,只要你的最低API级别是25或更低,你就必须坚持将自定义字体打包为资产,而不是资源。

资产提供了一种在应用程序中包含任意文件(如文本、xml、字体、音乐和视频)的方法。如果你试图将这些文件作为“资源”,Android会将它们处理到它的资源系统中,你将无法获得原始数据。如果您希望不加改动地访问数据,Assets是一种方法。

我知道这是旧的,但只是为了让它更清楚,在官方的android文档中有一个解释:

http://developer.android.com/tools/projects/index.html

assets/

这是空的。您可以使用它来存储原始资产文件。保存在这里的文件将按原样编译为.apk文件,并保留原始文件名。您可以以与使用uri的典型文件系统相同的方式导航此目录,并使用AssetManager将文件作为字节流读取。例如,这是纹理和游戏数据的好位置。

res/raw/

对于任意原始资产文件。在这里保存资产文件而不是在assets/目录中保存资产文件的唯一不同之处在于您访问它们的方式。这些文件由aapt处理,应用程序必须使用R类中的资源标识符引用这些文件。例如,这是媒体的好地方,如MP3或Ogg文件。

Ted Hopp很好地回答了这个问题。我一直在使用res/raw为我的opengl纹理和着色器文件。我正在考虑将它们移动到一个资产目录,以提供一个分层组织。

这个帖子说服了我不要这么做。首先,因为我喜欢使用唯一的资源id。其次,使用InputStream/openRawResource或BitmapFactory读取文件非常简单。第三,在便携式图书馆中使用它是非常有用的。

以下是一些要点:

  1. 原始文件必须具有有效的Java标识符的名称,而 资产中的文件没有位置和名称限制。在其他 它们可以被分组在我们希望的任何目录中
  2. 原始文件很容易从Java和xml(即 您可以从manifest或其他XML文件中引用raw文件)
  3. 在这里保存资产文件,而不是只在assets/目录中 不同之处在于您访问它们的方式,如本文所述 李http://developer.android.com/tools/projects/index.html。< / >
  4. 库项目中定义的资源将自动导入到 依赖于库的应用程序项目。对于资产来说 不会发生;资产文件必须出现在资产目录中
  5. assets目录更像文件系统,提供更多的自由 你想放什么文件都可以。然后您可以访问每一个 系统中的文件,就像你访问任何文件一样 文件系统。比如游戏数据文件,字体,纹理 李等。< / > 的子文件夹中,Assets可以被组织成子文件夹 然而,你能做的唯一一件事是资产 获取一个输入流。因此,它没有多大意义存储您的 资产中的字符串或位图,但您可以存储自定义格式的数据 例如输入修正字典或游戏地图。
  6. Raw可以通过生成R.java文件来给你一个编译时检查 然而,如果你想复制你的数据库到私人目录你

结论

  1. Android API包含一个非常舒适的资源框架 还针对各种移动应用程序的最典型用例进行了优化。 你应该掌握资源,并尽可能地使用它们 然而,如果你的特殊情况需要更大的灵活性,Assets 有没有给你一个更低级的API来组织和

使用文件系统之类的资产来转储任何类型的文件。并使用分辨率来存储它所做的,布局,图像,值。