一句话说透Android里面的Asset目录与res目录的区别

358 阅读2分钟

一句话总结:

assets 是“杂物间”,随便堆文件但得自己找;res 是“分类储物柜”,东西整齐但只能放指定物品。


核心区别对比表

对比项assets 目录res 目录
文件类型任意文件(如 JSON、数据库、字体)限定类型(图片、布局、字符串等)
编译处理原样打包,无压缩或优化编译时优化(如图片压缩、生成资源 ID)
访问方式通过 AssetManager 用路径读取(如 assets/file.txt通过 R 类引用(如 R.drawable.icon
多语言/设备适配需手动处理(如子目录区分)自动支持(如 values-zhdrawable-hdpi
使用场景原始数据、配置文件、第三方 SDK 资源图片、布局、字符串等常规资源

详细解释(现实比喻)

1. 文件类型与编译处理

  • assets

    • 像杂物间,可以随便扔任何文件(txt、mp3、db),系统不会处理它们。
    • 示例:存放未加密的 SQLite 数据库文件 app.db
  • res

    • 像分类储物柜,每个格子只能放指定物品(图片放 drawable,布局放 layout)。
    • 编译优化:图片可能被压缩,XML 转成二进制格式,生成 R.java 方便引用。
    • 示例:图片 icon.png 放 res/drawable,编译后通过 R.drawable.icon 访问。

2. 访问方式

  • assets

    // 读取 assets 目录下的 config.json  
    val inputStream = assets.open("config.json")  
    
    • 需要手动处理文件路径和 IO 流。
  • res

    // 获取 res/values/strings.xml 中的字符串  
    val appName = getString(R.string.app_name)  
    
    <!-- 在布局文件中引用图片 -->  
    <ImageView android:src="@drawable/icon" />  
    
    • 通过自动生成的 R 类直接引用,无需处理文件流。

3. 多语言/设备适配

  • assets

    • 要适配不同语言或设备,需手动创建子目录(如 assets/zhassets/en),并在代码中判断加载。
  • res

    • 系统自动支持,只需按规则创建目录(如 res/values-zhres/drawable-hdpi),系统根据设备配置自动选择。

4. 典型使用场景

  • 用 assets 的场景

    • 需要直接访问原始文件(如加载 OpenGL 的 GLSL 着色器文件)。
    • 存放不想被编译处理的文件(如预置的 SQLite 数据库、字体文件 .ttf)。
  • 用 res 的场景

    • 图片、图标、布局文件、字符串、颜色值等常规资源。
    • 需要自动适配不同设备或语言的情况。

避坑指南

  1. 不要往 res 里乱塞文件

    • res 有严格的文件命名规则(只能小写字母、数字、下划线),否则编译报错!
  2. 大文件放 assets

    • res 目录下的文件(如音频)会被压缩,可能导致问题,建议大文件放 assets
  3. 性能注意

    • assets 读取需 IO 操作,频繁访问可能影响性能,必要时缓存到内存。

总结口诀

“assets 是杂物间,随便堆放需自管,
res 是分类柜,系统优化省麻烦,
图片布局放 res,原始数据进 assets,
多语言适配 res 自动,assets 手动自己干!”