手机修改设备信息之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 修改设备信息

请大家尝试下 需要什么修改请告诉我 

简单写了下,替代xsharedpreferences,大家可以根据自己的业务去做处理

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Xposed 框架的模块可以通过自定义参数来实现一些特定的功能,具体步骤如下: 1. 在 Xposed 模块的 Java 代码中定义需要使用的参数,例如: ```java public static final String PREFS_NAME = "MyPrefs"; private static final String KEY_MY_PARAM = "my_param"; private static int myParam; public static void initZygote(XSharedPreferences prefs) { myParam = prefs.getInt(KEY_MY_PARAM, 0); } ``` 2. 在模块的资源文件夹中创建一个 XML 文件,用于保存自定义参数的值,例如: ```xml <?xml version='1.0' encoding='utf-8' standalone='yes' ?> <resources> <integer name="my_param">10</integer> </resources> ``` 3. 在模块的 Java 代码中读取 XML 文件中保存的参数值,并将其传递给模块的初始化方法,例如: ```java public void handleLoadPackage(final LoadPackageParam lpparam) throws Throwable { XSharedPreferences prefs = new XSharedPreferences("com.example.myapp", PREFS_NAME); int myParamValue = getResources().getInteger(R.integer.my_param); prefs.edit().putInt(KEY_MY_PARAM, myParamValue).apply(); MyModule.initZygote(prefs); } ``` 4. 在模块的 Java 代码中使用自定义参数,例如: ```java public void myMethod() { Log.i(TAG, "myParam=" + myParam); } ``` 通过这些步骤,Xposed 模块就可以使用自定义参数来实现特定的功能了。需要注意的是,Xposed 模块的自定义参数只能在模块初始化时读取一次,之后不能再修改。如果需要修改参数值,需要重新启动应用或重新安装模块。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值