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

Jetpack Compose应用升级后崩溃,全新安装正常运行

升级后Drawable加载崩溃的问题排查与解决

核心原因

升级场景下,Android资源缓存机制或增量更新的资源ID映射出现异常,导致painterResource无法正确识别Drawable类型。即便你确认iconResId初始化无误,旧版本遗留的资源缓存仍可能让新资源ID指向错误的资源类型,触发IllegalArgumentException。

可行解决方案

  • 清理应用资源缓存
    在Application的onCreate方法中添加缓存清理逻辑,强制刷新资源缓存:

    override fun onCreate() {
        super.onCreate()
        // 清除AppCompat的Drawable缓存
        AppCompatDelegate.getDrawableCache()?.clear()
        // 刷新布局缓存
        resources.flushLayoutCache()
    }
    
  • 显式处理Drawable转换
    绕过painterResource的自动类型检测,手动获取Drawable并转换为Painter:

    val context = LocalContext.current
    val drawable = ContextCompat.getDrawable(context, myDataClass.iconResId)
    val painter = drawable?.let { rememberDrawablePainter(it) }
    
    painter?.let {
        Image(
            painter = it,
            contentDescription = ""
        )
    }
    
  • 排查打包配置问题

    • 检查build.gradle中shrinkResources是否开启,若开启需确保旧资源未被误标记为无用资源
    • 临时关闭android.enableResourceOptimizations=true(在gradle.properties中),排查是否是资源优化导致的ID映射异常
  • 动态获取资源ID
    避免直接使用硬编码的资源ID,改为动态获取当前版本的资源ID:

    // 替换为你的资源名称
    val iconResId = context.resources.getIdentifier(
        "your_icon_name",
        "drawable",
        context.packageName
    )
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 03:17:02