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

启用ProGuard/R8后Jetpack Compose的rememberSaveable失效求助

问题解决:ProGuard/R8导致Composable状态丢失(rememberSaveable失效)

核心原因

rememberSaveable依赖Jetpack Compose的状态保存机制,该机制需要Kotlin元数据注解、状态序列化逻辑以及Compose内部状态管理类的支持。完全启用混淆/摇树优化时,R8可能误移除或混淆了这些关键组件,导致状态无法被正确持久化和恢复。

需要添加的ProGuard规则

在现有规则基础上,补充以下规则:

# 保留Compose状态保存相关的核心类与成员,防止被摇树或混淆
-keep class androidx.compose.runtime.saveable.** { *; }
-keepclassmembers class androidx.compose.runtime.saveable.** { *; }

# 明确保留Kotlin元数据注解,Compose依赖它识别状态与Composable函数
-keepattributes Metadata

# 保留MutableState相关类,确保状态对象的结构不被破坏
-keep class androidx.compose.runtime.MutableState { *; }
-keep class androidx.compose.runtime.SnapshotStateKt { *; }

# 保留默认的状态序列化器(针对String等基本类型)
-keep class androidx.compose.runtime.saveable.SaverKt { *; }
-keep class androidx.compose.runtime.saveable.Saver { *; }

规则说明

  • androidx.compose.runtime.saveable.**:该包包含rememberSaveable的核心实现、状态注册表和序列化逻辑,必须完整保留才能保证状态的持久化流程正常运行。
  • Metadata属性:Kotlin编译器生成的元数据注解,Compose依赖它追踪Composable函数与状态的关联关系,缺失会导致状态无法被正确绑定到目标Composable。
  • MutableState与SnapshotStateKt:状态对象的核心类,确保状态的读写逻辑不被混淆破坏。
  • Saver相关类:负责状态的序列化与反序列化,String等基本类型的默认序列化器就在其中,缺失会导致状态无法被转存和恢复。

验证步骤

  1. 将上述规则追加到现有ProGuard配置文件中
  2. 构建完全启用混淆的Release安装包
  3. 测试Composable的重建场景(如横竖屏切换、应用进程重启),确认状态是否正常保留

额外优化建议

如果包体仍然偏大,可以:

  • 精简现有规则中过于宽泛的-keep配置(比如-keep class com.fasterxml.** { *; }可以改为只保留你实际用到的Jackson子类)
  • 启用R8的针对性优化选项(如-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*),但需逐一测试兼容性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 23:25:24