当前位置:   article > 正文

Android 系统添加脚本_seclabel u:r:shell:s0

seclabel u:r:shell:s0

基于 AN8.0 ,添加一个脚本,在需要时调用。适用于有aosp源码的同学。

1.编写脚本

编写一个 work.sh 脚本。
脚本最好是轻量级的,不要做太厚重的工作。
推荐操作是执行轻量级拷贝操作、修改某个文件的值、设置某些系统参数等。

编写脚本需要注意,
在 windows 环境下编写代码,放到代码服务器上后,通过 vi 查看,
如果每行末尾都没有 ^M ,脚本OK,直接使用即可。

如果每行末尾都有 ^M ,需要逐行手动删除。!!!
若不删除,编译出的软件,脚本是无法正常执行的。

编译烧录后的软件,如果脚本执行有问题,可能的原因之一就是这个。

2.将脚本加入编译

修改 device/xxx/xxx/device-common.mk 文件,将编写的 work.sh 文件添加拷贝操作,拷贝到 system/bin/ 目录,如

PRODUCT_COPY_FILES += \
+       $(DEVICE_SOURCES)/script/work.sh:system/bin/work.sh \
  • 1
  • 2

编译烧录后的软件,通过串口或adb,可以看到system/bin/ 目录存在 work.sh 脚本。
串口直接执行 ./system/bin/work.sh 命令就可以执行这个脚本了。
当然,最终是要用代码执行的,串口执行是为了快速看到效果,节约调试脚本的时间。

3.在适当的时机调用

3.1 开机后调用

系统开机后会将 dev.bootcomplete 属性置为 1 ,可以通过这个属性判断系统启动了。
修改 device/xxx/xxx/init.rc ,添加

on property:dev.bootcomplete=1 //1
    start work
	
service work /system/bin/work.sh //2
    disabled
    oneshot
    seclabel u:r:shell:s0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

服务名(就是service 名称)和脚本名称可以不一致,系统调用时是通过服务名调用的。

注释1处的意思是:当 dev.bootcomplete 属性值为 1 时,执行 work 这个 service (注意,这个不是安卓四大组件之一的Service)。
注释2处的意思是:执行 work 这个 service ,work 这个 service 指向 /system/bin/work.sh 脚本,即执行 /system/bin/work.sh 脚本。后面的 disabled、oneshot、seclabel u:r:shell : s0 三个语句,照抄原有的例子就行,不同的安卓版本,写法会有些差异。

补充下这三个语句的意思:
disabled :此服务不会自动启动,需要通过显示调用服务名来启动
oneshot :服务退出后,不要主动去重启它。也就是只执行一次。
seclabel u:r:shell :s0 :我也不知道,后续补上。

由此可以引申出,在其他属性为特定值生效。
如,在 persist.sys.config 属性为 1 时,执行 /system/bin/loadsetmix.sh 脚本,可以这样写。

on property:persist.sys.config=1
    start loadsetmix
	
service loadsetmix /system/bin/loadsetmix.sh
    disabled
    oneshot
    seclabel u:r:shell:s0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

重启后生效。如果在代码里实时修改了 persist.sys.config 属性的值,不一定能触发执行 /system/bin/loadsetmix.sh 脚本。待验证。

3.2 代码里才调用

系统添加了脚本后,不通过属性判断来执行,在代码里实时调用,就不用重启了。
修改 device/xxx/xxx/init.rc ,添加如下,

service set_work /system/bin/do_set_work.sh
    disabled
    oneshot
    seclabel u:r:shell:s0
  • 1
  • 2
  • 3
  • 4

默认是不会执行 /system/bin/do_set_work.sh 脚本的,需要执行时,代码调用如下,

import android.os.SystemProperties;

SystemProperties.set("ctl.start", "set_work"); //3
  • 1
  • 2
  • 3

需要是系统应用才能执行,
注释3处的意思是:执行 set_work 这个 service,也就是执行 /system/bin/do_set_work.sh 脚本 。也印证了,

服务名(就是service 名称)和脚本名称可以不一致,系统调用时是通过服务名调用的。

4.编译验证

因为改动涉及到 device/xxx/xxx/init.rc ,无法通过模块替换实现(如有知道的也分享下),需要全编译。
全编译后只调试脚本的话,是可以只替换脚本的。
全编译烧录后的软件,/system/bin/ 目录下的脚本权限是 755 ,替换时需要修改。

init.rc 相关知识点参考了《深入理解Android内核设计思想》第7章 Android 启动过程。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/134467
推荐阅读
相关标签
  

闽ICP备14008679号