关于setpropex工具使用的几点问题记录

来源:互联网 发布:上海师范大学网络支付 编辑:程序博客网 时间:2024/04/28 10:30

如果需要修改Android的ro.类型的系统属性,大概有两种方法:一种是需要解锁boot loader,定制自己的boot.img文件;另一种是用setpropex工具。

两种方法都需要root权限,第一种方法比较复杂,但好处是可以永久性的修改属性,第二种方法很简单,但是只是暂时的,系统重启就失效了。

我这里使用了第二种方法,只要用root权限去运行setpropex设置属性,然后adb root来以root权限重启adb守护进程,最后把system_server进程kill掉,等待它重启就可以了,这是为了重启Dalvik。

上面的过程是理论上的,但是我在实际操作工程中却是失败的,我的运行环境是Nexus 5,系统是4.4.4版本。


为了解决问题我看了setpropex的源码,大概的过程是先通过/proc/<pid>/maps文件找到init进程空间中"/dev/__properties__ (deleted)"的地址范围,然后通过/proc/<pid>/mem读取这部分的内容,这部分内容实际上就是存储的系统属性了,找到你要修改的属性地址,然后通过ptrace写入要修改的值就可以了。另外说句题外话,关于/proc/<pid>/mem还有一个漏洞,叫做memprodroid,利用它可以做很多事情,有兴趣可以看一下。


但是结合我的实际环境,发现init进程的maps文件中并没有"/dev/__properties__ (deleted)",而是"/dev/__properties__",查了一下后面的deleted标志的意义是将一个被删除的文件映射到内存以后,文件后面会添加deleted标志,我系统里是有这个文件的,至于为什么和原始程序不一样我还没搞清楚。

然后我将程序改成后者重新编译运行以后依然是失败的,调试发现是在解析这部分内容的时候出错了,对比setpropex的解析部分代码和bionic中__system_property_get函数的源码发现区别很大,而且其中有两个比较重要的数据结构prop_area和prop_info也不一样,prop_area应该是存储整个系统属性共享内存的结构,prop_info是具体属性的结构。而且setpropex和ndk中<sys/_system_properties.h>中这两个结构的定义是一样的,也就是说这两个结构体在ndk中和AOSP中bionic源码中的定义都不一样,不知道为什么??


这里稍微讲一下系统属性的相关概念,系统属性是由init进程管理的,在init进程启动的时候会启动一个系统属性service,Android中所有对系统属性的修改和查询都是通过这个service来实现的,即service是运行在init进程中的。在这个service启动的时候会从四个文件中加载系统属性:

/default.prop

/system/build.prop

/system/default.prop

/data/local.prop


这几个文件是被加载到一块共享内存中的,然后在每个进程启动的时候都会将这块共享内存映射到自己的进程内存空间中,这个映射过程是在bionic libc的__libc_preinit函数实现的,它会在libc被加载的时候自动执行。

这里只大概讲一下概念,具体的可以看另外一篇我转载的文章,点击直达。


上面的问题是我在使用setpropex过程中遇到的问题,到现在依然没有解决,先做个记录留待以后解决吧。


参考链接:

1. http://www.cnblogs.com/bastard/archive/2012/10/11/2720314.html

2. http://blog.csdn.net/jackyu613/article/details/6136620

3. http://blog.csdn.net/xujianqun/article/details/6363318

0 0
原创粉丝点击