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


当前回答

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

其他回答

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

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

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

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

assets目录更像一个文件系统,提供了更大的自由,可以在其中放置任何您想要的文件。然后,您可以访问该系统中的每个文件,就像通过Java访问任何文件系统中的任何文件一样。这个目录可以存放游戏细节、字典等等。

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

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

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

So why have an assets folder at all? If you want to compute the asset you want to use at run time, it's pretty easy. With resources, you would have to declare a list of all the resource IDs that might be used and compute an index into the the list. (This is kind of awkward and introduces opportunities for error if the set of resources changes in the development cycle.) (EDIT: you can retrieve a resource ID by name using getIdentifier, but this loses the benefits of compile-time checking.) Assets can also be organized into a folder hierarchy, which is not supported by resources. It's a different way of managing data. Although resources cover most of the cases, assets have their occasional use.

One other difference: resources defined in a library project are automatically imported to application projects that depend on the library. For assets, that doesn't happen; asset files must be present in the assets directory of the application project(s). [EDIT: With Android's new Gradle-based build system (used with Android Studio), this is no longer true. Asset directories for library projects are packaged into the .aar files, so assets defined in library projects are merged into application projects (so they do not have to be present in the application's /assets directory if they are in a referenced library).]

EDIT: Yet another difference arises if you want to package a custom font with your app. There are API calls to create a Typeface from a font file stored in the file system or in your app's assets/ directory. But there is no API to create a Typeface from a font file stored in the res/ directory (or from an InputStream, which would allow use of the res/ directory). [NOTE: With Android O (now available in alpha preview) you will be able to include custom fonts as resources. See the description here of this long-overdue feature. However, as long as your minimum API level is 25 or less, you'll have to stick with packaging custom fonts as assets rather than as resources.]