开启shrinkResources和minifyEnabled后Android应用崩溃求助
你的崩溃问题核心是混淆工具(ProGuard)修改了SharedPreferences依赖的键名,导致读取数据时出现类型转换错误。我帮你梳理下具体的解决步骤和原因:
一、快速修复方案
你需要在项目的混淆规则文件(proguard-rules.pro)中添加保护规则,避免SharedPreferences相关的常量和类被混淆:
保护Base类中的SharedPreferences键常量
在proguard-rules.pro里加入以下规则:# 保留Base类中用于SharedPreferences的键常量不被混淆 -keepclassmembers class com.testApp.Base { public static final String LWP_JSON_DAY; }这条规则能确保
LWP_JSON_DAY这个键名在混淆后依然保持原样,不会被重命名。可选:保护整个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

