在Android开发中,res是resources(资源)目录的缩写,存放项目静态资源的根目录,其作用与结构如下:
1. 核心功能
- 资源分类管理:通过子目录(如`drawable`、`layout`、`values`等)分类存储图片、布局、字符串等非代码资源,与Java/Kotlin代码逻辑分离,便于维护和多设备适配。
- 自动生成索引:编译器会为`res`下的资源生成唯一的`R.java`(或R.kt)ID,通过`R.type.name`形式调用,避免硬编码路径。
2. 主要子目录与资源类型
- `drawable/`:存放图片(PNG/JPG)、矢量图(XML)、选择器(Selector)等,支持多分辨率目录(如`drawable-hdpi`)。
- `layout/`:存储界面布局XML文件,定义UI结构与组件属性。
- `values/`:存放全局常量,如字符串(`strings.xml`)、颜色(`colors.xml`)、尺寸(`dimens.xml`)、样式(`styles.xml`)等。
- `mipmap/`:专用于应用图标(`ic_launcher`),系统会根据设备DPI自动选择匹配分辨率。
- `anim/`:存放动画资源(属性动画或补间动画的XML定义)。
- `raw/`:直接存储原始文件(如音频、视频),需通过`Resources.openRawResource()`读取。
3. 扩展知识与最佳实践
- 多版本适配:通过后缀(如`-v21`、`-land`)提供不同API版本或横竖屏的专属资源,系统自动匹配。
- 资源限定符:使用`-en`、`-zh`等语言后缀或`-sw600dp`等屏幕尺寸后缀,实现国际化或响应式设计。
- 资源合并规则:构建时,Gradle会按优先级合并主模块与依赖库的资源,冲突时默认主模块覆盖库资源。
- 性能优化:避免在`drawable`中使用过大位图;用`VectorDrawable`替代多套位图以减少APK体积。
4. 与其他目录的区别
- `assets/`:需通过`AssetManager`访问的原始文件,不支持自动生成ID或动态配置,适合游戏资源或二进制数据。
- `res/` vs `resources.arsc`:编译后,`res`的内容会被压缩并生成二进制索引文件`resources.arsc`,用于快速检索资源。
5. 注意事项
- 文件名必须为小写字母、数字或下划线(如`icon_home.png`),否则编译报错。
- 资源ID为final静态常量,不可动态修改,但可通过`Configuration`切换资源配置(如语言)。