【Android】使用persist属性来调用脚本文件
Android系统中有许多属性,属性由两个部分组成:name & value,可以使用这些属性来记录系统设置或进程之间的信息交换。Android系统在启动过程时会按序从以下几个文件中加载系统属性:
1./default.prop
2./system/build.prop
3./system/default.prop
4./data/local.prop
5./data/property/*
属性会按照以上文件的顺序进行加载,并且后加载的属性值会更新原先的属性值。在系统重启后,有的属性会消失,但可以定义以“persist.”为开头的属性值,当在系统中通过setprop命令设置这个属性时,就会在/data/property/目录下会保存一个副本。这样在系统重启后,按照加载流程这些persist属性的值就不会消失了。
如果要在系统中添加新的persist属性的话,要满足添加的属性其前缀必须为property_service.c文件中property_perms[]矩阵中定义的。
property_perms[] = {
{ "net.dns", AID_RADIO, },
{ "net.", AID_SYSTEM, },
{ "dev.", AID_SYSTEM, },
{ "runtime.", AID_SYSTEM, },
{ "sys.", AID_SYSTEM, },
{ "service.", AID_SYSTEM, },
{ "persist.sys.", AID_SYSTEM, },
{ "persist.service.", AID_SYSTEM, },
……
{ NULL, , }
};
当然我们也可以添加自己所需要的persist属性前缀,比如“persist.test.”前缀,只需要在property_perms[]矩阵中添加{"persist.test.", AID_SYSTEM, }即可。
使用persist属性来调用脚本文件可以分3步完成:添加脚本文件;添加persist属性;在init.<device>.rc中添加service。
step1.添加脚本文件
将脚本文件“fortest.sh”放到source/system/core/rootdir/etc/目录下,当然也可以放在其它位置。然后在source/device/厂商/设备/目录下的device.mk文件中添加PRODUCT_COPY_FILES命令
PRODUCT_COPY_FILES += \
/system/core/rootdir/etc/fortest.sh:/system/etc/fortest.sh
通过PRODUCT_COPY_FILES命令可以将在源码中添加的脚本文件“fortest.sh”最终生成到系统的/system/etc/目录下。若想通过persist属性运行该脚本文件的话,仅在系统中添加脚本文件是不够的,这是因为现在/system/etc/fortest.sh脚本还没有可执行权限。
为了给脚本文件添加用户模式 & 文件权限,我有尝试在源码init.<device>.rc中的on boot section添加
chown root root /system/etc/fortest.sh
chmod 0777 /system/etc/fortest.sh
但是调试后发现,通过ls /system/etc/fortest.sh -al后显示:-rw-r--r-- root root /system/etc/fortest.sh,没有完成预期目标啊,有尝试在其它section放入该段代码,但一直没有成功。
最后通过在android_filesystem_config.h中实现添加文件的uid & gid & 操作权限。在android_filesystem_config.h中的android_files[]矩阵中添加
{, AID_SYSTEM, AID_SHELL, "system/etc/fortest.sh"}
step2.添加persist属性
由前文可以知道,添加自定义的persist属性可以使用android源码中已经存在的前缀,当然也可以使用自己定义的前缀。只需要在propery_service.c文件中的property_perms[]矩阵中添加自定义的persist.test.前缀。
之前有在init.<device>.rc文件中通过“setprop persist.test.test 0”也可以完成该功能,但是由于每次系统重启时,init进程会加载init.rc & init.<device>.rc文件,所以不可避免的都要运行一次“setprop persist.test.test 0”该命令。这样导致persist.test.test每次在系统重启后都恢复到原来的初始值。这与persist属性想要实现的作用有点矛盾了。
在source/device/厂商/设备/BoardConfig.mk文件中添加自定义的persist.test.test属性,并将其default value设置为1 or 0。
ADDITONAL_DEFAULT_PROPERTIES += persist.test.test 0
这样就可以在系统中的default.prop中生成persist.test.test属性,并且其初始值为0。除了该添加方法外,也可以在source/device/厂商/设备/system.prop中添加自定义的属性。
step3.在init.<device>.rc中添加service
关于init.rc的介绍可以参照source/system/core/readme.txt。init由4个部分组成:Actions、Services、Commands & Options。
【Actions】
Actions其实就是一组被命名的命令序列。actions 都有一个触发条件,触发条件决定了action何时执行。当一个事件发生如果匹配action的触发条件,那么这个action将会被添加到预备执行队列的尾部(除非它已经在队列当中)
每一个action中的命令将被顺序执行。init进程负责在其它activities(如:设备创建/销毁,属性设置,进程重启)之间执行这些命令序列。
【Services】
services 是一些由init 启动 和 重新(如果有需要)启动的程序,当然这些程序如果是存在的。
【Options】
options 是service的修饰符,用来告诉init 怎样及何时启动service。
在init.<device>.rc中on boot section后添加一个新的service,命名为new,其对应的脚本文件位置为/system/etc/fortest.sh,将user & group设置为root,自动启动设置为disable,并且该服务只启动一次。
通过Options命令实现当persist.test.test属性发生变化时,开启service “new”。
service new /system/etc/fortest.sh
user root
group root
disable
oneshot on property:pesist.test.test=
start new on property:persist.test.test=
stop new
总结:本文主要描述添加persist属性,脚本文件和service的流程,当persist属性值发生变化时,开启服务,并最终调用脚本文件。
ps:希望有在init.rc文件中通过chmod命令添加文件权限成功的大神给予帮助。谢谢!
参考文章:http://www.cnblogs.com/leaven/archive/2010/12/25/1917007.html
http://blog.sina.com.cn/s/blog_6b936f150101jhfl.html
【Android】使用persist属性来调用脚本文件的更多相关文章
- JS魔法堂:获取当前脚本文件的绝对路径
一.前言 当写模块加载器时,获取当前脚本文件的绝对路径作为基础路径是必不可少的一步,下面我们一起来探讨一下这个问题吧! 二.各大浏览器的实现方式 [a]. Chrome和FF 超简单的一句足矣! va ...
- nodejs调用脚本(python/shell)和系统命令
每种语言都有自己的优势,互相结合起来各取所长程序执行起来效率更高或者说哪种实现方式较简单就用哪个,nodejs是利用子进程来调用系统命令或者文件,文档见http://nodejs.org/api/ch ...
- matlab初学者_脚本文件调用函数文件
问题: matlab里面有两种文件,一种是脚本文件,一种是函数文件,为了模块化程序,我们需要把专门的功能写成一个函数封装到某个函数文件里面. 那么来看如何在脚本文件里调用函数文件中的函数. 注意点: ...
- Shell脚本中引用、调用另一个脚本文件的2种方法
Shell脚本中引用.调用另一个脚本文件的2种方法 http://www.jb51.net/article/67903.htm
- Shell中 调用/引用/包含 另外的脚本文件的两种方法
脚本 first (测试示例1) #!/bin/bash echo 'your are in first file' 问)在当前脚本文件中调用另外一个脚本文件? 方法一: 使用 source 脚本 s ...
- Delphi Android 将Google ZXing 整合(调用Jar文件)
前篇文章介绍了在delphi App(以下简称App)中可使用intent来调用Google ZXing 条码扫描器(以下简称zx),其各有优缺点,优点是我们不需关注zx本身的细节,只需调用其接口即可 ...
- Python核心笔记:在python文件中如何调用其它python脚本文件,你肯定不会
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:zhujuyu 笔者在自学python的时候遇到了这样一个练习题:将 ...
- ? 原创: 铲子哥 搜狗测试 今天 shell编程的时候,往往不会把所有功能都写在一个脚本中,这样不太好维护,需要多个脚本文件协同工作。那么问题来了,在一个脚本中怎么调用其他的脚本呢?有三种方式,分别是fork、source和exec。 1. fork 即通过sh 脚本名进行执行脚本的方式。下面通过一个简单的例子来讲解下它的特性。 创建father.sh,内容如下: #!/bin/bas
? 原创: 铲子哥 搜狗测试 今天 shell编程的时候,往往不会把所有功能都写在一个脚本中,这样不太好维护,需要多个脚本文件协同工作.那么问题来了,在一个脚本中怎么调用其他的脚本呢?有三种方式,分别 ...
- 远程调用shell脚本文件和远程复制文件
1.安装sshpass yum install sshpass 2.本地调用远程服务器的shell脚本文件: sshpass -p sa ssh root@192.168.56.105 -C &quo ...
随机推荐
- PHP读取Mongodb数据报错,Cannot natively represent the long 8331412483000 on this platform
在使用PHP进行读取Mongo数据时,如果读取的int数据过大时,会自动转变为int64位. 并会报以下错误: Cannot natively represent the long 833141248 ...
- URAL1495. One-two, One-two 2(dp)
1495 牵扯一点数位 保存数的时候我是按2进制保存的 把1当作0算 把2当作1算 滚动数组 dp[i][j][(g*10+j)%n] = min(dp[i][j][(g*10+j)%n],dp[i- ...
- 编写类String的构造函数、析构函数和赋值函数
已知类String的原型为: class String { public: String(const char *str = NULL); // 普通构造函数 String(const Str ...
- java连接mysql的一个小例子
想要用java 连接数据库,需要在classpath中加上jdbc的jar包路径 在eclipse中,Project的properties里面的java build path里面添加引用 连接成功的一 ...
- POJ 1988 Cube Stacking
题意:有编号为1~N的N个小木块,有两种操作 M x y 将木块x所在的堆放到木块y所在的堆的上面 C x 询问木块x下面有多少块木块 代码巧妙就巧妙在GetParent函数中在进行路径压缩的同时,也 ...
- Bitset位图
位图(bitmap)就是用每一位来存放某种状态,适合于大规模数据但是数据状态又不是很多的情况下,通常来判断数据是否存在.位图的常见应用有两种: 1.存放大规模数据,例如腾讯的面试题,给40亿个unsi ...
- 虚拟机安装centos 6 报错Erro processing drive
错误提示: Error processing drive: pci-0000:00:10-scsi-0:0:0:0 20480MB VMware,VMware Virtual S This devic ...
- 谷歌浏览器如何设置可以解决Ajax跨域问题?
Ajax本身是不支持跨域的,跨域问题其实很简单,通过浏览器的相应设置可以完成两个不同的服务器或两个不同服务下的项目互相访问.希望大家给予评价及投票. 方法/步骤 首先谷歌快捷方式上右击,在下拉列表 ...
- 纠结的ARC
xcode不断进步,在xcode4中引入了ARC的概念.您用或者不用它就在那里,于是有了本文:如何在未使用arc的工程中引入一个使用了arc特性的文件,如何在arc工程中引用未使用arc的文件.其实说 ...
- 【转】谈一谈PHP字串清除空格函数不安全
清除空格的方法是不安全的,部分原因是因为字符中的空格非常多,例如 "addslashes的问题在 于黑客 可以用0xbf27来代替单引号,而addslashes只是将0xbf27修改为0xb ...