Answers:
随着资源,有内置的支持,提供不同的语言,操作系统版本,屏幕方向等的替代品,如所描述这里。这些都不适用于资产。而且,API的许多部分都支持使用资源标识符。最后,资源的名称将转换为在编译时检查的常量字段名称,因此,代码与资源本身之间不匹配的可能性较小。这些都不适用于资产。
那么为什么要有一个资产文件夹呢?如果要在运行时计算要使用的资产,这非常简单。使用资源时,您将必须声明所有可能使用的资源ID的列表,并计算该列表中的索引。(这有点尴尬,如果资源集在开发周期中发生变化,则会带来出错的机会。)(编辑:您可以使用来按名称检索资源ID getIdentifier
,但这会失去编译时检查的好处。)资产可以还可以组织成文件夹层次结构,资源不支持该层次结构。这是管理数据的另一种方式。尽管资源涵盖了大多数情况,但资产还是偶尔使用。
另一个区别是:库项目中定义的资源会自动导入到依赖库的应用程序项目中。对于资产,这不会发生。资产文件必须存在于应用程序项目的资产目录中。[编辑:使用Android的新的基于Gradle的构建系统(与Android Studio一起使用),这不再是事实。库项目的资产目录打包到.aar文件中,因此库项目中定义的资产将合并到应用程序项目中(因此,/assets
如果它们位于引用的库中,则它们不必出现在应用程序的目录中)。
编辑:如果您想将自定义字体与应用程序打包在一起,则会出现另一个区别。有一些API调用可Typeface
从存储在文件系统或应用程序assets/
目录中的字体文件创建。但是,没有API可以Typeface
从存储在res/
目录中的字体文件(或从InputStream
允许使用res/
目录的)创建。[ 注意:使用Android O(现在可以在alpha预览中使用),您将可以包括自定义字体作为资源。请参阅此处有关此过期功能的说明。但是,只要您的最低API级别为25或更低,就必须坚持将自定义字体包装为资产而不是资源。]
raw/
文件?
/res
和'/ assets'目录中的所有内容均为只读,因为它们打包在.apk文件中。
两者非常相似。两者之间真正的主要区别是在res
目录中,每个文件都经过了预编译ID
,可以通过轻松访问R.id.[res id]
。这对于快速轻松地访问图像,声音,图标非常有用。
该assets
目录更像一个文件系统,并提供了更大的自由度,可将您想要的任何文件放入其中。然后,您可以像通过Java访问任何文件系统中的任何文件一样来访问该系统中的每个文件。该目录非常适合诸如游戏详细信息,字典等内容。希望能有所帮助。
Assets
文件夹中,Android系统现在包含fonts
目录,我们可以在其中放置自定义字体文件,也可以让Android Studio为我们下载它。
我知道这很老了,但是为了清楚起见,在官方的android文档中有每个说明:
来自http://developer.android.com/tools/projects/index.html
assets/
这是空的。您可以使用它来存储原始资产文件。您在此处保存的文件将原样编译为.apk文件,并且保留原始文件名。您可以使用与使用URI的典型文件系统相同的方式浏览此目录,并使用AssetManager将文件读取为字节流。例如,这是纹理和游戏数据的理想位置。
res/raw/
用于任意原始资产文件。在此处而不是在assets /目录中保存资产文件的区别仅在于访问它们的方式不同。这些文件由aapt处理,必须使用R类中的资源标识符从应用程序中引用。例如,这是存放MP3或Ogg文件等媒体的好地方。
以下是一些关键点:
结论
如果需要在Java代码中的某处引用它们,则可以将文件放入“ res”目录。
res文件夹中的所有文件都将在R文件中建立索引,这使得加载它们变得更快(更容易!)。
泰德·霍普(Ted Hopp)回答得很好。我一直在为我的opengl纹理和着色器文件使用res / raw。我当时正在考虑将它们移至资产目录以提供层次结构。
这个线程说服我不要这样做。首先,因为我喜欢使用唯一的资源ID。其次,因为使用InputStream / openRawResource或BitmapFactory读取文件非常简单。第三,因为能够在可移植库中使用非常有用。
资产提供了一种在应用程序中包括文本,xml,字体,音乐和视频等任意文件的方法。如果您尝试将这些文件作为“资源”包括在内,Android会将它们处理到其资源系统中,并且您将无法获取原始数据。如果您想访问原始数据,则资产是一种处理方式。
res/raw
,则可以使用来获取原始数据openRawResource(resourceName)
。
res
代表资源,那assets
代表什么?