在Android开发中,图片资源的存放位置主要有以下几种常见目录,不同目录适用于不同场景,并涉及性能优化和适配问题:
1. res/drawable/ 与密度限定目录
- 基础目录为 `res/drawable/`,但推荐使用密度限定符的子目录(如 `drawable-mdpi`、`drawable-hdpi` 等),系统会根据设备屏幕密度自动选择合适资源。
- 限定符包括:`ldpi`(低)、`mdpi`(中)、`hdpi`(高)、`xhdpi`(超高)、`xxhdpi`(超超高)等。若未匹配到对应密度,系统会缩放就近密度的图片,可能导致性能损耗。
- 适用于静态图标、按钮背景等需要适配多屏幕的场景。
2. res/mipmap/
- 专为应用图标设计,与 `drawable` 类似但更规范。
- 优势在于系统在Launcher等场景下可能会优先处理 `mipmap` 中的资源,避免图标模糊。建议将启动图标(ic_launcher)放在此目录。
3. assets/
- 存放原始文件(如未压缩的PNG或SVG),通过 `AssetManager` 访问,路径需手动处理。
- 适合游戏纹理、动态加载的图片或需要保留目录结构的资源。不参与编译时压缩,需开发者自行优化。
4. 外部存储(Environment.getExternalStorageDirectory())
- 路径如 `/sdcard/Android/data/
- 需要动态权限(Android 10+需适配分区存储),且可能被用户清理。适合缓存或非敏感数据。
5. 内部存储(getFilesDir() 或 getCacheDir())
- 应用私有目录,无需权限访问,缓存图片建议用 `cacheDir`(系统可能自动清理)。
- 适用于临时图片或敏感数据,但空间有限(通常仅几十MB)。
6. 第三方存储(如Glide的缓存机制)
- 部分库(如Glide、Picasso)会内置缓存策略,通常位于 `/data/data/
扩展知识:
※ WebP格式替代PNG:WebP在Android 4.0+支持,可显著减少体积(约30%),但需注意解码性能权衡。
※ VectorDrawable:适用于简单图形的矢量资源(SVG转XML),放入 `drawable/` 可无损缩放,减少多密度图片数量。
※ Android 12折叠屏适配:新增 `drawable-watch` 等限定符,需关注多设备形态的资源拆分。
※ 资源别名:通过 `xml` 文件定义同一资源的不同情境引用(如夜间模式)。
选择策略需综合考虑安装包体积、内存占用及加载速度。高频率使用的图片建议优先放 `res/`,大图或动态资源可选择外部存储,并配合缓存策略减少IO开销。