我知道res
目录中的文件可以从R.class
访问,而资产的行为就像文件系统一样,但我想知道,一般情况下,最好使用其中一个和另一个。
任何人都可以帮助我了解资产和资产之间的真正差异吗?
答案 0 :(得分:271)
有了资源,内置支持为不同语言,操作系统版本,屏幕方向等提供替代方案,如here所述。这些都不适用于资产。此外,API的许多部分都支持使用资源标识符。最后,资源的名称将转换为在编译时检查的常量字段名称,因此代码和资源本身之间的不匹配机会就会减少。这些都不适用于资产。
那为什么要有资产文件夹?如果要计算要在运行时使用的资产,则非常简单。使用资源,您必须声明可能使用的所有资源ID的列表,并在列表中计算索引。 (如果资源集在开发周期中发生变化,这有点尴尬并引入错误机会。)(编辑:您可以使用getIdentifier
按名称检索资源ID,但这会失去编译时的好处检查。)资产也可以组织到文件夹层次结构中,资源不支持。这是一种管理数据的不同方式。虽然资源涵盖了大多数情况,但资产偶尔会被使用。
另一个不同之处:库项目中定义的资源会自动导入依赖于库的应用程序项目。对于资产,这不会发生;资产文件必须存在于应用程序项目的assets目录中。 [编辑:使用Android的新Gradle-based build system(与Android Studio一起使用),这已不再适用。库项目的资产目录打包到.aar文件中,因此库项目中定义的资产将合并到应用程序项目中(因此,如果它们位于引用的库中,则它们不必存在于应用程序的/assets
目录中) ]
编辑:如果您想在应用中打包自定义字体,则会出现另一个差异。 API calls可以从存储在文件系统或应用的Typeface
目录中的字体文件创建assets/
。但是没有API可以从存储在Typeface
目录(或res/
中的字体文件)中创建InputStream
,这将允许使用res/
目录。 [注意:使用Android O(现在可在Alpha预览版中使用),您可以将自定义字体包含为资源。请参阅此期待已久的功能的说明here。但是,只要您的最低API级别为25或更低,您就必须坚持将自定义字体打包为资产而不是资源。]
答案 1 :(得分:58)
两者非常相似。两者之间真正的主要区别在于,在res
目录中,每个文件都有一个预编译的ID
,可以通过R.id.[res id]
轻松访问。这对于快速轻松地访问图像,声音,图标很有用......
assets
目录更像是一个文件系统,可以更自由地放置您想要的任何文件。然后,您可以像访问任何文件系统中的任何文件一样访问该系统中的每个文件。这个目录适用于游戏细节,词典等等。希望有所帮助。
答案 2 :(得分:33)
我知道这是旧的,但为了说清楚,官方的android文档中有各自的解释:
来自http://developer.android.com/tools/projects/index.html
assets/
这是空的。您可以使用它来存储原始资产文件。您在此处保存的文件将按原样编译为.apk文件,并保留原始文件名。您可以使用URI以与典型文件系统相同的方式导航此目录,并使用AssetManager将文件作为字节流读取。例如,这是纹理和游戏数据的好位置。
res/raw/
对于任意原始资产文件。在此处而不是在assets /目录中保存资产文件的方式与访问它们的方式不同。这些文件由aapt处理,必须使用R类中的资源标识符从应用程序引用。例如,这是媒体的好地方,例如MP3或Ogg文件。
答案 3 :(得分:9)
以下是一些要点:
<强>结论强>
答案 4 :(得分:4)
如果你需要在Java代码中的某个地方引用它们,你就会把你的文件放到“res”目录中。
res文件夹中的所有文件都将在R文件中编入索引,这使得加载它们的速度更快(也更容易!)。
答案 5 :(得分:1)
使用像文件系统这样的资产来转储任何类型的文件。并使用res来存储它的内容,布局,图像,值。
答案 6 :(得分:0)
Ted Hopp非常好地回答了这个问题。我一直在使用res / raw作为我的opengl纹理和着色器文件。我正在考虑将它们移动到资产目录以提供分层组织。
这个帖子让我不相信。首先,因为我喜欢使用唯一的资源ID。其次,因为使用InputStream / openRawResource或BitmapFactory来读取文件非常简单。第三,因为能够在便携式库中使用它非常有用。
答案 7 :(得分:-5)
资产提供了一种在应用程序中包含文本,xml,字体,音乐和视频等任意文件的方法。如果您尝试将这些文件包含为“资源”,Android会将它们处理到其资源系统中,您将无法获取原始数据。如果您想要访问未经修改的数据,资产是一种方法。