我知道res
目录中的文件可以从R.class
访问,而assets
则像文件系统一样运行,但是我想知道,在一般情况下,何时使用其中之一更好。
有人能帮我了解res
和assets
之间的真正区别吗?
我知道res
目录中的文件可以从R.class
访问,而assets
则像文件系统一样运行,但是我想知道,在一般情况下,何时使用其中之一更好。
有人能帮我了解res
和assets
之间的真正区别吗?
在资源中,有内置的支持提供不同语言、操作系统版本、屏幕方向等的备选方案,如此处所述。这些都不能用于资产。此外,API 的许多部分支持使用资源标识符。最后,资源的名称会转换为常量字段名称,在编译时进行检查,因此代码与资源本身之间的不匹配机会更小。这些都不适用于资产。
那么为什么需要资产文件夹呢?如果你想在运行时计算要使用的资产,这很容易。对于资源,您需要声明可能使用的所有资源 ID 列表并计算列表中的索引。(这有点棘手,并且在开发周期中资源集发生变化时会出现错误的机会。)(编辑:您可以使用getIdentifier
按名称检索资源 ID,但这会失去编译时检查的好处。)资产还可以组织成文件夹层次结构,而此功能不受资源支持。这是一种不同的数据管理方式。虽然资源覆盖了大多数情况,但资产偶尔也有用处。
另一个不同之处:在库项目中定义的资源会自动导入到依赖于该库的应用程序项目中。对于资产,这种情况并不会发生;资产文件必须存在于应用程序项目的资产目录中。(编辑:在 Android 的新基于 Gradle 的构建系统(与 Android Studio 一起使用)中,这不再是真实的。库项目的资产目录被打包到 .aar 文件中,因此在引用库时,库项目中定义的资产将合并到应用程序项目中(因此如果它们在引用的库中,则不必存在于应用程序的 /assets
目录中)。)
编辑:如果你想将自定义字体与你的应用程序一起打包,另一个区别就出现了。可以使用API调用从文件系统或应用程序的assets/
目录中创建Typeface
。但是,没有API可以从res/
目录中存储的字体文件(或InputStream
)创建Typeface
(这会允许使用res/
目录)。[注意:在Android O中(现在可用于alpha预览版),您将能够将自定义字体作为资源包含。请参见此迫切需要的功能的描述here。但是,只要您的最低API级别为25或更低,您就必须将自定义字体作为资产而不是作为资源进行打包。]
两者非常相似。真正的主要区别在于,在res
目录中,每个文件都被赋予一个预编译的ID
,可以通过R.id.[res id]
轻松访问。这对于快速轻松地访问图片、声音、图标等非常有用。
assets
目录更像一个文件系统,并提供更多自由将任何文件放入其中。然后,您可以像访问Java中的任何文件系统中的任何文件那样访问该系统中的每个文件。该目录适用于游戏详情、字典等内容。
我知道这已经很旧了,但为了澄清,官方android文档中有每个文件夹的解释:
来自http://developer.android.com/tools/projects/index.html
assets/
该文件夹为空。您可以使用它来存储原始资产文件。在此保存的文件将按原样编译为.apk文件,并保留原始文件名。您可以使用URI以及使用AssetManager将文件作为字节流读取的方式,像典型的文件系统一样导航到此目录。例如,这是纹理和游戏数据的好位置。
res/raw/
用于任意原始资产文件。将资产文件保存在此处而不是assets/目录中只是在访问它们的方式上有所不同。这些文件被aapt处理,必须使用R类中的资源标识符从应用程序引用它们。例如,这是媒体文件(如MP3或Ogg文件)的良好位置。
结论
资源提供了一种在应用程序中包含任意文件(如文本、XML、字体、音乐和视频)的方式。如果您尝试将这些文件作为“资源”包含,Android 将会将它们处理到其资源系统中,您将无法获取原始数据。如果您想访问未经处理的数据,资源是其中一种方法。
res
代表资源,那么assets
代表什么? - Vivek Warderaw/
目录中的文件? - Prince/res
和/assets
目录中的任何内容,因为它们被打包在.apk文件中并且是只读的。 - Ted Hopp