You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android字符串映射Drawable资源ID,避免阻止R8/Proguard资源收缩

Android库Drawable高效匹配与资源收缩兼容方案问题

我的Android库包含约1300个Drawable资源,在服务端驱动UI的场景下,应用需要通过后端返回的资源名称字符串,高效获取对应的Drawable。目前已经有从备用URL拉取图片的逻辑,核心目标是本地存在对应资源时立即返回,无需额外查询。

我可以很方便地生成并引入一个Kotlin映射函数来实现匹配,示例代码如下:

@DrawableRes fun toImageId(name: String): Int {
    return when(name) {
        "image_one"  -> R.drawable.image_one
        "image_two"  -> R.drawable.image_two
        ...
        "image_thirteen_hundred" -> R.drawable.image_thirteen_hundred
    }
}

但问题在于,这个映射函数会导致R8/Proguard无法收缩那些未被应用其他代码使用的图片,这会让多款集成该库的应用体积出现不可接受的增长。据我了解,目前没有办法将这个映射文件排除在资源使用检测范围之外。

不少资料推荐通过资源名称直接获取资源ID的方式,代码如下:

resources.getIdentifier(resIdName, "drawable", packageName)

这种方式可以避开资源收缩检测,但性能表现很差:在单元测试中,获取单个资源ID需要约2秒,遍历获取全部ID耗时近4秒。

请问有没有其他可行的解决方案?


编辑补充:@CommonsWare 指出,getIdentifier()在实际运行的应用中,性能比单元测试场景要好几个数量级,基本不会构成性能问题。


内容的提问来源于stack exchange,提问作者Tbadams

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 10:02:43