赞
踩
基于 AN8.0 ,添加一个脚本,在需要时调用。适用于有aosp源码的同学。
编写一个 work.sh
脚本。
脚本最好是轻量级的,不要做太厚重的工作。
推荐操作是执行轻量级拷贝操作、修改某个文件的值、设置某些系统参数等。
编写脚本需要注意,
在 windows 环境下编写代码,放到代码服务器上后,通过 vi 查看,
如果每行末尾都没有 ^M ,脚本OK,直接使用即可。
如果每行末尾都有 ^M ,需要逐行手动删除。!!!
若不删除,编译出的软件,脚本是无法正常执行的。
编译烧录后的软件,如果脚本执行有问题,可能的原因之一就是这个。
修改 device/xxx/xxx/device-common.mk
文件,将编写的 work.sh
文件添加拷贝操作,拷贝到 system/bin/
目录,如
PRODUCT_COPY_FILES += \
+ $(DEVICE_SOURCES)/script/work.sh:system/bin/work.sh \
编译烧录后的软件,通过串口或adb,可以看到system/bin/
目录存在 work.sh
脚本。
串口直接执行 ./system/bin/work.sh
命令就可以执行这个脚本了。
当然,最终是要用代码执行的,串口执行是为了快速看到效果,节约调试脚本的时间。
系统开机后会将 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
服务名(就是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
重启后生效。如果在代码里实时修改了 persist.sys.config 属性的值,不一定能触发执行 /system/bin/loadsetmix.sh 脚本。待验证。
系统添加了脚本后,不通过属性判断来执行,在代码里实时调用,就不用重启了。
修改 device/xxx/xxx/init.rc
,添加如下,
service set_work /system/bin/do_set_work.sh
disabled
oneshot
seclabel u:r:shell:s0
默认是不会执行 /system/bin/do_set_work.sh 脚本的,需要执行时,代码调用如下,
import android.os.SystemProperties;
SystemProperties.set("ctl.start", "set_work"); //3
需要是系统应用才能执行,
注释3处的意思是:执行 set_work 这个 service,也就是执行 /system/bin/do_set_work.sh 脚本 。也印证了,
服务名(就是service 名称)和脚本名称可以不一致,系统调用时是通过服务名调用的。
因为改动涉及到 device/xxx/xxx/init.rc
,无法通过模块替换实现(如有知道的也分享下),需要全编译。
全编译后只调试脚本的话,是可以只替换脚本的。
全编译烧录后的软件,/system/bin/ 目录下的脚本权限是 755 ,替换时需要修改。
init.rc 相关知识点参考了《深入理解Android内核设计思想》第7章 Android 启动过程。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。