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

Cri*_*ris 262 android android-assets

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

Ted*_*opp 280

随着资源,有内置的支持,提供不同的语言,操作系统版本,屏幕方向等的替代品,如所描述这里.这些都不适用于资产.此外,API的许多部分都支持使用资源标识符.最后,资源的名称将转换为在编译时检查的常量字段名称,因此代码和资源本身之间的不匹配机会就会减少.这些都不适用于资产.

那么为什么要有资产文件夹呢?如果要计算要在运行时使用的资产,则非常简单.使用资源,您必须声明可能使用的所有资源ID的列表,并在列表中计算索引.(如果资源集在开发周期中发生变化,这有点尴尬并引入错误机会.)(编辑:您可以使用名称检索资源ID getIdentifier,但这会失去编译时检查的好处.)资产可以也可以组织成文件夹层次结构,资源不支持.这是一种管理数据的不同方式.虽然资源涵盖了大多数情况,但资产偶尔会被使用.

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

编辑:如果您想要在您的应用程序中打包自定义字体,则会出现另一个差异.有一些API调用可以Typeface从存储在文件系统或应用程序assets/目录中的字体文件创建.但是没有API来创建一个Typeface存储在res/目录中的字体文件(或者来自一个InputStream允许使用该res/目录的字体文件).[ 注意:使用Android O(现在可在alpha预览中使用),您将能够将自定义字体包含为资源.请参阅此处针对这个早该进行的功能的说明.但是,只要您的最低API级别为25或更低,您就必须坚持将自定义字体打包为资产而不是资源.

  • @vwvwvwvwvwvwvwvwvw - 嗯......它不代表任何东西; 它只是意味着"资产"(如英文单词**asset**的复数形式:_a有用或有价值的东西_). (39认同)
  • @Prince - 否.`res res和'/ assets'目录中的所有内容都是只读的,因为它们打包在.apk文件中. (6认同)
  • `res` 代表资源,那么 `assets` 代表什么? (2认同)

DRi*_*FTy 60

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

assets目录更像是一个文件系统,可以更自由地放置您想要的任何文件.然后,您可以像访问任何文件系统中的任何文件一样访问该系统中的每个文件.这个目录适用于游戏细节,词典等等.希望有所帮助.

  • 如果我们想在我们的应用程序中添加external_fonts,那么我们将它们放在资产文件夹中. (5认同)
  • @TusharPandey现在我们不必将字体放在“Assets”文件夹中,Android系统现在包含“fonts”目录,我们可以将自定义字体文件放在那里,或者我们可以让Android studio为我们下载它。 (2认同)

小智 36

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

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

assets/

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

res/raw/

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

  • 我认为这实际上会混淆问题 - 纹理和ogg文件都是你提供给用户区域API(openGL/MediaPlayer)的大量数据...为什么他们会歧视这里? (4认同)

小智 9

以下是一些要点:

  1. 原始文件必须具有有效Java标识符的名称,而资产中的文件没有位置和名称限制.换句话说,它们可以分组在我们希望的任何目录中
  2. 原始文件很容易从Java和xml引用(即您可以从manifest或其他xml文件中引用raw中的文件).
  3. 在此处而不是在assets /目录中保存资产文件的方式与访问它们的方式不同,如 http://developer.android.com/tools/projects/index.html所述.
  4. 库项目中定义的资源会自动导入到依赖于库的应用程序项目中.对于资产,这不会发生; 资产文件必须存在于应用程序项目的assets目录中
  5. assets目录更像是一个文件系统,可以更自由地放置你想要的任何文件.然后,您可以像访问任何文件系统中的任何文件一样访问该系统中的每个文件.喜欢游戏数据文件,字体,纹理等.
  6. 与资源不同,资产可以组织到资产目录中的子文件夹中.但是,您可以对资产执行的唯一操作是获取输入流.因此,将字符串或位图存储在资源中没有多大意义,但您可以存储自定义格式数据,例如输入更正字典或游戏地图.
  7. Raw可以通过生成R.java文件为您提供编译时检查但是如果要将数据库复制到私有目录,则可以使用为流式传输而生成的资产.

结论

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