最近在使用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...