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属性来调用脚本文件的更多相关文章

  1. JS魔法堂:获取当前脚本文件的绝对路径

    一.前言 当写模块加载器时,获取当前脚本文件的绝对路径作为基础路径是必不可少的一步,下面我们一起来探讨一下这个问题吧! 二.各大浏览器的实现方式 [a]. Chrome和FF 超简单的一句足矣! va ...

  2. nodejs调用脚本(python/shell)和系统命令

    每种语言都有自己的优势,互相结合起来各取所长程序执行起来效率更高或者说哪种实现方式较简单就用哪个,nodejs是利用子进程来调用系统命令或者文件,文档见http://nodejs.org/api/ch ...

  3. matlab初学者_脚本文件调用函数文件

    问题: matlab里面有两种文件,一种是脚本文件,一种是函数文件,为了模块化程序,我们需要把专门的功能写成一个函数封装到某个函数文件里面. 那么来看如何在脚本文件里调用函数文件中的函数. 注意点: ...

  4. Shell脚本中引用、调用另一个脚本文件的2种方法

    Shell脚本中引用.调用另一个脚本文件的2种方法 http://www.jb51.net/article/67903.htm

  5. Shell中 调用/引用/包含 另外的脚本文件的两种方法

    脚本 first (测试示例1) #!/bin/bash echo 'your are in first file' 问)在当前脚本文件中调用另外一个脚本文件? 方法一: 使用 source 脚本 s ...

  6. Delphi Android 将Google ZXing 整合(调用Jar文件)

    前篇文章介绍了在delphi App(以下简称App)中可使用intent来调用Google ZXing 条码扫描器(以下简称zx),其各有优缺点,优点是我们不需关注zx本身的细节,只需调用其接口即可 ...

  7. Python核心笔记:在python文件中如何调用其它python脚本文件,你肯定不会

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:zhujuyu 笔者在自学python的时候遇到了这样一个练习题:将 ...

  8. ? 原创: 铲子哥 搜狗测试 今天 shell编程的时候,往往不会把所有功能都写在一个脚本中,这样不太好维护,需要多个脚本文件协同工作。那么问题来了,在一个脚本中怎么调用其他的脚本呢?有三种方式,分别是fork、source和exec。 1. fork 即通过sh 脚本名进行执行脚本的方式。下面通过一个简单的例子来讲解下它的特性。 创建father.sh,内容如下: #!/bin/bas

    ? 原创: 铲子哥 搜狗测试 今天 shell编程的时候,往往不会把所有功能都写在一个脚本中,这样不太好维护,需要多个脚本文件协同工作.那么问题来了,在一个脚本中怎么调用其他的脚本呢?有三种方式,分别 ...

  9. 远程调用shell脚本文件和远程复制文件

    1.安装sshpass yum install sshpass 2.本地调用远程服务器的shell脚本文件: sshpass -p sa ssh root@192.168.56.105 -C &quo ...

随机推荐

  1. arcgis javascript dojo

    一.为什么说ArcGIS API for JavaScript是构建于Dojo之上的? 1. 编写ArcGIS API for JavaScript的ESRI开发者使用Dojo来简化他们的开发过程,同 ...

  2. 习惯&感恩

    A不喜欢吃鸡蛋,都给了B吃,刚开始B很感谢,久而久之便习惯了.习惯了,便理所当然了. 后来有一天,A将鸡蛋给了C,B就不爽了.她忘记了这个鸡蛋本来就是A的,A想给谁都可以. 为此,她们大吵一架,从此绝 ...

  3. linux系统的文件和文件类型

    文件 当你创建一个文件的时候,系统保存了有关该文件的全部信息,包括:• 文件的位置.• 文件类型.• 文件长度.• 哪位用户拥有该文件,哪些用户可以访问该文件.• i节点.• 文件的修改时间.• 文件 ...

  4. 【转】Android Gson的使用

    Android Gson 2014 年 05 月 22 日 android 目前的客户端大都有和服务端进行交互,而数据的格式基本就是json了,于是在Android开发中就经常用到json解析,方便的 ...

  5. 《OD大数据实战》Oozie环境搭建

    一.Oozie环境搭建 1. 下载oozie-4.0.0-cdh5.3.6.tar.gz 下载地址:http://archive.cloudera.com/cdh5/cdh/5/ 2. 解压 tar ...

  6. JS生成指定长度的随机数

    /** * 生成指定长度的UUID * @param len * @param radix * @returns uuid * eg: createUUID(8, 2) "01001010& ...

  7. JSON 之 SuperObject(3): 访问

    测试数据提前加入 Memo1 中: 代码文件: unit Unit1; interface uses   Windows, Messages, SysUtils, Variants, Classes, ...

  8. Qt之设置QWidget背景色

    简述 QWidget是所有用户界面对象的基类,这意味着可以用同样的方法为其它子类控件改变背景颜色. Qt中窗口背景的设置,下面介绍三种方法. 使用QPalette 使用Style Sheet 绘图事件 ...

  9. UVa 11137 (完全背包方案数) Ingenuous Cubrency

    题意:用13.23……k3这些数加起来组成n,输出总方案数 d(i, j)表示前i个数构成j的方案数则有 d(i, j) = d(i-1, j) + d(i, j - i3) 可以像01背包那样用滚动 ...

  10. HDU 1024 (不重叠m段最大和) Max Sum Plus Plus

    题解是看的这里的: http://www.acmerblog.com/hdu-1024-Max-Sum-Plus-Plus-1276.html 当前这个状态是dp[i][j],i 表示当前的段,j表示 ...