手机修改设备信息之XSharedPreferences使用
XSharedPreferences是xposed框架jar包里的一个存取数据类,实现了SharedPreferences.
那我们就想有SharedPreferences干嘛还要再去扩展呢。这就要首先了解下xposed原理(跪读)。
大致意思是Android系统有个主进程叫"Zygote",意思就是受精卵,为什么这样命名呢?
它是Android运行时的核心进程,当系统启动时,被一个叫/init.rc
的脚本启动这个Zygote进程。
进程内部启动一个Dalivk虚拟机,注册JNI函数,来加载一些需要的类和调用初始化方法。
如果监听到创建新进程,就会fork(复制)一份自身给新进程。这样新进程就有了自己的虚拟机和一些必要的资源,系统启动新进程就不需要再去启动虚拟机加载资源了,节省了启动时间(现在手机上打开一个app,确实没以前的老机器打开那么慢了)。
当你安装Xposed框架,就会往/system/bin 下复制一份继承自app_process的可执行文件,这个扩展的进程又往路径下添加一些额外jar包,并在一些地方从jar里调用方法。例如,在jvm创建后,Zygote main方法调用前,可以在Zygote里做我们想做的事情。
所有的应用程序都是通过zygote fork(复制)来的,共享java运行时库,共享xposedbridge jar资源。
当hook某个应用的某个方法时,就可以通过xposedbridge jar包里的XSharedPreferences类去加载指定路径下得xml文件来获取返回数据。所以XSharedPreferences不需要写进你编写的插件模块,只需编译即可。在gradle里要把compile或者implementation换成provided。
在主界面编写插件功能,一般都是通过Sharedprefences读写本地数据。XSharedPreferences是在重启手机后,initZygote时,通过XSharedPreferences去加载这个xml文件,把数据都读进内存。需要返回数据时就去map里去查找数据返回数据。
接着说下自己的奇葩码代码经历,我把所有功能都编写完,运行,修改数据,重启,擦没读出来。
前前后后折磨了我一星期(业余时间搞的),实在是想不明白,我存进xml里的数据用re任务管理器都可以查看的到,全部存在本地了,没有丢失。确定存是没问题,但是读取的时候打印log,全是空。XSharedPreferences这个类没动过,怎么会出这样的问题。
一步步排查,读写权限有,返回数据换成固定值,就OK,纳闷。确定是读不出来。又换其他手机一样读不出来,又去xposed市场装上别的插件,可以正常运行。排除其他原因,只能是我自己的代码有问题。不行就一点一点试,把存取数据代码一点一点给改了,突然发现可以了。
在存数据的时候,把Sharedpreferences.edit()每次都重新初始化一次。
自己被搞糊涂了,看了源码说是.edit()每次都会生成一个新的Editor对象,所以在创建Editor时尽量不要重复去创建。
另外因为SharedPreferences的Context.Mode_WORLD_READABLE模式在7.0以上版本上被废弃,官方也做了说明,让开发者换用contentprovider、service、broadcastReceiver来替代。
所以要放弃使用SharedPreferences,用contentprovider代替。
更新:
可以修改手机定位和手机设备信息的app上线Google play 修改设备信息
请大家尝试下 需要什么修改请告诉我