一句话总结:
assets 是“杂物间”,随便堆文件但得自己找;res 是“分类储物柜”,东西整齐但只能放指定物品。
核心区别对比表
| 对比项 | assets 目录 | res 目录 |
|---|---|---|
| 文件类型 | 任意文件(如 JSON、数据库、字体) | 限定类型(图片、布局、字符串等) |
| 编译处理 | 原样打包,无压缩或优化 | 编译时优化(如图片压缩、生成资源 ID) |
| 访问方式 | 通过 AssetManager 用路径读取(如 assets/file.txt) | 通过 R 类引用(如 R.drawable.icon) |
| 多语言/设备适配 | 需手动处理(如子目录区分) | 自动支持(如 values-zh、drawable-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/zh、assets/en),并在代码中判断加载。
- 要适配不同语言或设备,需手动创建子目录(如
-
res:- 系统自动支持,只需按规则创建目录(如
res/values-zh、res/drawable-hdpi),系统根据设备配置自动选择。
- 系统自动支持,只需按规则创建目录(如
4. 典型使用场景
-
用
assets的场景:- 需要直接访问原始文件(如加载 OpenGL 的 GLSL 着色器文件)。
- 存放不想被编译处理的文件(如预置的 SQLite 数据库、字体文件
.ttf)。
-
用
res的场景:- 图片、图标、布局文件、字符串、颜色值等常规资源。
- 需要自动适配不同设备或语言的情况。
避坑指南
-
不要往
res里乱塞文件:res有严格的文件命名规则(只能小写字母、数字、下划线),否则编译报错!
-
大文件放
assets:res目录下的文件(如音频)会被压缩,可能导致问题,建议大文件放assets。
-
性能注意:
assets读取需 IO 操作,频繁访问可能影响性能,必要时缓存到内存。
总结口诀
“assets 是杂物间,随便堆放需自管,
res 是分类柜,系统优化省麻烦,
图片布局放 res,原始数据进 assets,
多语言适配 res 自动,assets 手动自己干!”