【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,    0 },
    { "net.",             AID_SYSTEM,   0 },
    { "dev.",             AID_SYSTEM,   0 },
    { "runtime.",         AID_SYSTEM,   0 },
    { "sys.",             AID_SYSTEM,   0 },
    { "service.",         AID_SYSTEM,   0 },
    { "persist.sys.",     AID_SYSTEM,   0 },
    { "persist.service.", AID_SYSTEM,   0 },
    ……
     { NULL, 0, 0 }
};

  当然我们也可以添加自己所需要的persist属性前缀,比如“persist.test.”前缀,只需要在property_perms[]矩阵中添加{"persist.test.", AID_SYSTEM,   0}即可。



  使用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[]矩阵中添加

{00777, 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=1
    start new

on property:persist.test.test=0
    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

时间: 2024-10-23 10:32:13

【Android】使用persist属性来调用脚本文件的相关文章

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

一.前言 当写模块加载器时,获取当前脚本文件的绝对路径作为基础路径是必不可少的一步,下面我们一起来探讨一下这个问题吧! 二.各大浏览器的实现方式 [a]. Chrome和FF 超简单的一句足矣! var getCurrAbsPath = function(){ return document.currentScript.src; }; 这里利用了对象 document.currentScript ,它返回的是当前执行的script元素:然后调用script元素的src属性即可获取脚本文件的绝对路

ATL使用.rgs注册脚本文件操作注册表注册Com组件

1.      ATL注册组件 1.1     创建注册脚本 注册脚本通过操作 系统注册表完成Com服务的注册,通过数字形式而非代码API的形式完成,这种形式显得更加简单有效,因为它只需要几行数字代码就可以将一个Key添加到注册表中. 使用ATL向导时,会自动的生成一个后缀为.rgs的注册脚本文件,ATL在服务安装时,会自动的调用脚本文件,实现对注册表的修改,完成Com服务的注册. 1.1.1       基本术语 符号释义 符号 解释 ::= 相等 | 或 X+ 一个或多个Xs [X] X是可

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

每种语言都有自己的优势,互相结合起来各取所长程序执行起来效率更高或者说哪种实现方式较简单就用哪个,nodejs是利用子进程来调用系统命令或者文件,文档见http://nodejs.org/api/child_process.html,NodeJS子进程提供了与系统交互的重要接口,其主要API有: 标准输入.标准输出及标准错误输出的接口. NodeJS 子进程提供了与系统交互的重要接口,其主要 API 有: 标准输入.标准输出及标准错误输出的接口 child.stdin 获取标准输入 child.

3.addView调用之后导致子布局的android:layout_width=&quot;match_parent&quot;属性或者 android:layout_width=&quot;fll_parent&quot;属性无效。

典型错误案例: 经常我们会通过addView方法,动态添加一些子布局,比如下面的一段代码. LinearLayout linParent = (LinearLayout) findViewById(R.id.aty_slider_linParent); View vChild = mInflater.inflate(R.layout.view_loding, null); linParent.addView(vChild); view_loading是一个布局文件: <?xml version=

Android 上实现非root的 Traceroute -- 非Root权限下移植可执行二进制文件 脚本文件

作者 : 万境绝尘 转载请著名出处 : http://blog.csdn.net/shulianghan/article/details/36438365 示例代码下载 : -- CSDN : http://download.csdn.net/detail/han1202012/7639253; -- GitHub : https://github.com/han1202012/TracerouteAndBusybox ; 1. 原理思路 文件权限修改无法实现 : 如果 没有 root 权限,

android中打包含有Activity以及资源文件的jar包在工程中调用

研究如何将资源以及activity文件大包成jar文件供项目调用,走了不少弯路,也尝试了各种不同方式,都不太理想,最终还是从android的官方文档中找到了完美的解决,这里做一个总结. 最近刚刚发布了一款小应用<诗词大全>,有兴趣的朋友请实用提出您的宝贵意见,谢谢 这篇博文内容是结合android 开发文档的翻译以及个人在开发过程中的具体情况的一个总结 第一步,把普通的android project设置成库项目 库项目也是一个标准的android项目,因此你先创建一个普通的android项目.

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

脚本 first (测试示例1) #vi  first.sh 1 #!/bin/bash 2 echo 'your are in first file' 问)在当前脚本文件中调用另外一个脚本文件? 方法一: 使用 source 脚本 second (测试示例2)# vi second.sh 1 #!/bin/bash 2 echo 'your are in second file' 3 source first.sh 注意事项:分别建立# vi first.sh 和 second.sh 测试:#

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

前篇文章介绍了在delphi App(以下简称App)中可使用intent来调用Google ZXing 条码扫描器(以下简称zx),其各有优缺点,优点是我们不需关注zx本身的细节,只需调用其接口即可,缺点是需额外安装zx扫描程序,如此一来客户体验就不够好,那么可否将zx直接整合到App中呢,答案是可以, 但实际操作起来会稍显繁琐,我们具体来看下过程,其中分两部分:第一部分介绍如何配置编译zx源码,第二部分介绍如何与App整合. 第一部分:zx源码的配置和编译 1:下载源码 我选用的是2.3.0

Android -- Layout布局文件里的android:layout_height等属性为什么会不起作用?

有的时候,我们配置好的布局文件,在加载完成添加到我们的Activity中后发现,并没有安装我们设置的属性来布局,比如我们设置了android:layout_marginTop="100dip",但是运行程序后发现一点作用都没有,相似的还有layout_height等以android:layout_开头的属性设置都没有作用,这类问题以我们使用Adapter的作为数据源的时候作用居多,因为Adapter里有一个方法是getView,这个返回的VIew是一个从XML布局里加载的,一般如下: