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
相关产品推荐
相关产品推荐

