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

开启shrinkResources和minifyEnabled后Android应用崩溃求助

解决开启混淆后SharedPreferences引发的ClassCastException崩溃问题

你的崩溃问题核心是混淆工具(ProGuard)修改了SharedPreferences依赖的键名,导致读取数据时出现类型转换错误。我帮你梳理下具体的解决步骤和原因:

一、快速修复方案

你需要在项目的混淆规则文件(proguard-rules.pro)中添加保护规则,避免SharedPreferences相关的常量和类被混淆:

  1. 保护Base类中的SharedPreferences键常量
    在proguard-rules.pro里加入以下规则:

    # 保留Base类中用于SharedPreferences的键常量不被混淆
    -keepclassmembers class com.testApp.Base {
        public static final String LWP_JSON_DAY;
    }
    

    这条规则能确保LWP_JSON_DAY这个键名在混淆后依然保持原样,不会被重命名。

  2. 可选:保护整个WallpaperPreference类
    如果担心这个类的方法或字段被混淆影响逻辑,也可以直接保留整个类的结构:

    -keep class com.testApp.preference.WallpaperPreference { *; }
    

二、问题原因分析

当你开启minifyEnabled true时,ProGuard会自动对代码中的类名、字段名、方法名进行混淆压缩,以此减小包体积并保护代码。但你的代码中SharedPreferences的存储和读取完全依赖Base.LWP_JSON_DAY这个字符串常量——如果这个常量被混淆成了其他短名称,那么getInt方法读取的就不是你之前用putInt存储的键,反而可能读到了其他类型的存储值(比如某个String类型的键被混淆后和它重名),于是就触发了ClassCastException。

而关闭混淆后,键名保持原始状态,自然能正确读取int类型的数据,不会出现崩溃。

三、额外验证步骤

你可以去项目的build/outputs/mapping/release/目录下找到mapping.txt文件,搜索LWP_JSON_DAY,如果它被重命名成了类似a这样的短名称,就完全验证了我们的判断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 19:32:52