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

开启minifyEnabled后EncryptedSharedPreferences报keyset不存在如何解决

问题根因

你配置的-dontobfuscate仅关闭了类名、成员名的混淆重命名逻辑,但minifyEnabled=true时R8仍会默认执行**代码裁剪(Shrink)**操作,会删除它识别不到调用链路的类。AndroidX Security Crypto底层依赖Tink库,大量使用反射、SPI机制加载核心类,R8无法识别这类动态调用,会误删keyset读写相关的核心逻辑,最终抛出找不到keyset的错误。

解决方案

  • 第一步:添加专用保留规则,在proguard-rules.pro中加入以下配置,保留Crypto和Tink库的相关类不被裁剪:
# 保留AndroidX Security Crypto所有类及成员
-keep class androidx.security.crypto.** { *; }
-keepclassmembers class androidx.security.crypto.** { *; }

# 保留Tink加密库所有类及成员
-keep class com.google.crypto.tink.** { *; }
-keepclassmembers class com.google.crypto.tink.** { *; }

# 保留Tink SPI加载的实现类
-keep class * implements com.google.crypto.tink.KeyManager
-keep class * implements com.google.crypto.tink.PrivateKeyManager
-keep class * implements com.google.crypto.tink.KeysetReader
-keep class * implements com.google.crypto.tink.KeysetWriter
  • 第二步:清理旧存储数据测试
    如果之前未开混淆时已经生成过加密SharedPreferences文件,加密逻辑变更后无法兼容旧数据,建议完全卸载APP清除本地存储后重新安装测试,排除旧文件干扰。
  • 第三步:升级依赖版本
    低版本的security-crypto存在已知的R8兼容bug,建议升级到最新稳定版:
implementation "androidx.security:security-crypto:1.1.0"
  • 可选兜底方案:如果上述配置后仍有问题,可在proguard规则中添加-dontshrink关闭代码裁剪逻辑,仅保留压缩优化能力即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 08:21:01