最近在使用SharedPreference犯了一个错误,出于页面唯一性的需求,使用了类名作为SharedPreference保存数据时的key,又因为是封装代码,所以也没直接使用“MainActivity”这些String常量,而是调用了ClassName.class.getSimpleName()。自测的时候没测出问题,但是在打release包测试时就出bug了。
初步定位问题是:旧版本保存的数据在新版本覆盖安装后获取不到。
因为debug包是没问题的,很自然就想到了是代码混淆后发生了问题:
代码混淆的时候会将类名、方法名等映射到一些无意义的字符,如:’a’, ‘e’, ‘f’等,但又不是每个版本的映射结果都一样,所以在新版本中如果还想由包含ClassName.class.getSimpleName()的key获得value的时候就取不到值了,因为映射结果已经变了。
举个例子,旧版本中,代码混淆将MainActivity的类名映射成了“a”(MainActivity.class.getSimpleName()会返回“a”),SharedPreference保存数据时就使用了“a”作为key;而在新版本中,代码混淆将MainActivity的类名映射成了“b”(MainActivity.class.getSimpleName()会返回“b”),这时,使用MainActivity.class.getSimpleName()作为key去查询数据,就是使用“b”作为key去查询数据,自然就查询不到了,因为你想查询的数据旧版本中是以“a”作为key来保存的。
保存数据时慎用ClassName.class.getSimpleName()等这些会被混淆的代码作key
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...