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

我知道res目录中的文件可以从R.class访问,而资产的行为类似于文件系统,但是我一般想知道什么时候最好使用一个文件系统。
任何人都可以帮助我了解资源和资产之间的真正差异吗?

在资源方面,内置的支持可以为不同的语言,操作系统版本,屏幕方向等提供备选scheme,如下所述。 这些资产都不可用。 而且,API的很多部分都支持使用资源标识符。 最后,资源的名称变成了在编译时检查的常量字段名,所以代码和资源本身之间不匹配的机会就less了。 这些都不适用于资产。

那么为什么有一个资产文件夹? 如果你想在运行时计算你想要使用的资产,这很容易。 有了资源,您将不得不声明所有可能使用的资源ID列表,并计算列表中的索引。 (如果在开发周期中资源集合发生变化,这是一种尴尬,并引入了错误的机会。)(编辑:您可以使用getIdentifier通过名称检索资源ID,但是这会失去编译时检查的好处。也可以组织到不受资源支持的文件夹层次结构中。 这是pipe理数据的一种不同的方式。 虽然资源涵盖了大部分情况,但资产偶尔也会被使用。

另一个区别是:在库项目中定义的资源会自动导入到依赖于库的应用程序项目中。 对于资产,这不会发生; 资产文件必须存在于应用程序项目的资产目录中。 [编辑:使用Android的新的基于Gradle的构build系统 (与Android Studio一起使用),这不再是事实。 库项目的资产目录被打包到.aar文件中,因此库项目中定义的资产被合并到应用程序项目中(因此,如果它们位于引用库中,它们不必在应用程序的/assets目录中)

编辑:另一个区别出现,如果你想打包自定义字体与您的应用程序。 有API调用来从存储在文件系统或应用程序assets/目录中的字体文件创buildTypeface 。 但是,没有API可以通过res/目录中的字体文件(或者从允许使用res/目录的InputStream创buildTypeface 。 [ 注意:使用Android O(现在可以在Alpha预览中使用),您将能够将自定义字体作为资源。 请参阅这个姗姗来迟的function的描述。 但是,只要您的最低API等级为25或更低,就必须坚持将自定义字体打包为资源而不是资源。]

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

assets目录更像是一个文件系统,并提供更多的自由来放置你想要的任何文件。 然后,您可以访问该系统中的每个文件,就像通过Java访问任何文件系统中的任何文件时一样。 这个目录适合游戏细节,字典等等。 希望有所帮助。

我知道这是旧的,但只是为了说清楚,在官方的Android文档中有每个解释:

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

assets/

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

res/raw/

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

以下是一些关键点:

  1. 原始文件必须具有有效的Java标识符的名称,而“资源”中的文件没有位置和名称限制。 换句话说,他们可以分组在我们希望的任何目录中
  2. 原始文件很容易从Java引用,也可以从XML(也就是说,您可以从清单或其他XML文件中引用原始文件)。
  3. 保存资产文件在这里,而不是在资产/目录只有不同的方式,你访问他们的方式http://developer.android.com/tools/projects/index.html
  4. 在库项目中定义的资源会自动导入到依赖库的应用程序项目中。 对于资产,这不会发生; 资产文件必须存在于应用程序项目的资产目录中
  5. 资产目录更像是一个文件系统提供更多的自由,把你想要的任何文件在那里。 然后,您可以访问该系统中的每个文件,就像通过Java访问任何文件系统中的任何文件时一样。 像游戏数据文件,字体,纹理等
  6. 与资源不同,资产可以组织到资产目录中的子文件夹中。但是,您只能使用资产执行inputstream。 因此,将string或位图存储在资产中没有什么意义,但可以存储自定义格式的数据,例如input更正字典或游戏地图。
  7. Raw可以通过生成R.java文件给你一个编译时间检查。但是,如果你想将你的数据库复制到私有目录,你可以使用Assets来进行stream式处理。

结论

  1. Android API包含一个非常舒适的资源框架,该框架也针对各种移动应用程序的大多数典型用例进行了优化。 您应该掌握资源并尽可能地使用它们。
  2. 但是,如果您的特殊情况需要更多的灵活性,那么Assets可以为您提供较低级别的API,从而可以更高的自由度组织和处理您的资源。

如果你需要在Java代码的某个地方引用它们,你可以把你的文件放到“res”目录下。

并且res文件夹中的所有文件都将在R文件中编入索引,这使得加载它们的速度更快(并且更容易!)。

像文件系统一样使用资产来转储任何types的文件。 并使用res来存储它所做的,布局,图像,值。

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

这个线程说服我不要。 首先,因为我喜欢使用唯一的资源ID。 其次,因为使用InputStream / openRawResource或BitmapFactory读取文件非常简单。 第三,因为能够在便携式图书馆使用是非常有用的。

资产提供了在应用程序中包含文本,xml,字体,音乐和video等任意文件的方法。 如果您尝试将这些文件包含为“资源”,则Android会将其处理到其资源系统中,您将无法获取原始数据。 如果你想访问的数据不变,资产是一种方法来做到这一点。