内容
[Description]
如何用init&init.rc 来执行应用程序, 脚本,java 程序
[Keyword]
init init.rc exec native sh java
[Solution]
1. 首先确认对应的程序,脚本已经内置,如内置在了system/bin 目录, 如果不会内置,可以查看FAQ FAQ04153: 如何将任意一个文件(包括可执行文件)内置到手机中?
2. 确认对应的用户是否有权限能够执行这个应用程序,可以用ls -a -l 的命令来查看。如果需要修改权限,可以参考 FAQ FAQ02625: 如何修改system 下面文件的权限
3. 在init.rc 中执行
3.1 如果是开机只短暂执行一次即可退出,那么可以用exec 命令在on post-fs-data 段中执行,通常为修改文件权限,更改用户之类,如果该程序是直接内置在init 中的命令,可以直接call, 如果不是,那么需要用exec 执行
内置应用程序可以参考: system/core/init/keywords.h
具体可以参考如:
on post-fs-data
write /proc/bootprof "INIT:post-fs-data"
# We chown/chmod /data again so because mount is run as root + defaults
chown system system /data
chmod 0771 /data
......
# add your action, such as exec program-path I.E exec /sbin/e2fsck -p
# if the command is init-internal, call the command directly I.E chmod chown....
3.2 当作一个service 来启动,通常表现为这个程序可能长久的运行,或者可能被多次启动,即可以定义为一个service。简单如:
service bootanim /system/bin/bootanimation
class main
user graphics
group graphics media
disabled
oneshot
注意的是service 要顶格写,然后它的action 和 属性描述要空4个空格后开始写。更多属性描述和action 可以参考 system/core/init/readme.txt
3.3 程序为shell 脚本时,shell 脚本的第一行一定必须是 #! /system/bin/sh 否则将作为一个native 二进制程序解析,即会出下行的错误
cannot execve xxxxxx.sh: Exec format error
3.4 执行java 程序,java 程序执行比较特别,因为它是通过app_process 拉起,可以参考如 frameworks/base/cmds/am/am 的写法。启动service 时,如:
service xxxx am
.....
一般不推荐这样直接使用java 程序, 因为通常DVM 的拉起需要zygote 先完成启动
[参考文档&FAQ]
1. FAQ04153: 如何将任意一个文件(包括可执行文件)内置到手机中?
2. FAQ02625: 如何修改system 下面文件的权限
3. 工程代码: system/core/init/keywords.h
4. 工程文档: system/core/init/readme.txt
|