最近在使用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来保存的。
网友评论