参考:system\core\init\readme.txt
案例1:
当开机启动完毕,写入mpp2的寄存器,使其设置为PWM模式。
#add by eliot shao 2016.11.03 for mmp2-pwm function
on property:sys.boot_completed=1
write /sys/kernel/debug/spmi/spmi-0/address 0xa140
write /sys/kernel/debug/spmi/spmi-0/data 0x1a
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
案例2:
创建一个native service,在系统启动完毕后执行某脚本,完成一个简单的任务。
步骤:①在system/core/rootdir/init.rc中加入:
on property:sys.boot_completed=1
start service_set_bkl
service service_set_bkl /system/bin/setBKL.sh
user root
group root
disabled
oneshot
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
② 在device/qcom/slm753/slm753.mk中加入:
#add by eiot shao 2016.11.11 for bug 4612
PRODUCT_COPY_FILES += device/qcom/slm753/setBKL.sh:system/bin/setBKL.sh
- 1
- 2
- 1
- 2
将device/qcom/slm753/setBKL.sh脚本拷贝到system/bin/setBKL.sh
③ 在device/qcom/slm753/创建需要执行的脚本setBKL.sh
setBKL.sh脚本内容如下:
#!/system/bin/sh
busybox echo "eliot shao !!!native service for backlight setting!!for bug 4612"
#busybox echo 255 >/sys/class/leds/lcd-backlight/brightness
#sleep 2
#you can add some register setting such as:
busybox cat /sys/class/leds/lcd-backlight/brightness > /sys/class/leds/lcd-backlight/brightness
busybox echo "eliot shao !!!native service for backlight setting!"
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
Init语言包含了四个大类的声明:
Actions, Commands, Services, and Options.
Actions和Services隐性的声明了一个新的段,所有的commands和options都属于这些最近声明的段。
Actions take the form of:
on < trigger>
< command>
< command>
< command>
Services take the form of:
service < name> < pathname> [ < argument> ]*
< option>
< option>
常用Options(用于修饰service)
1、critical 表示这是一个关键的service,4分钟内退出4次,则系统重启进入recovery mode。
2、disabled 这个服务不会随着它的类启动而自动启动,必须明确指定服务名称启动。
3、setenv 设置环境变量。
4、socket [ [ [ ] ] ]
创建一个socket接口/dev/socket/,使本地service和Java可以通信。详见
http://blog.csdn.net/eliot_shao/article/details/53159989 。
5、user 执行service之前改变用户名。
6、group [ ]* 执行service之前改变用户组。
7、oneshot 当service退出后不会重启。
8、class 为service指定一个类名,具有相同类名的service可以一起启动和停止。
9、onrestart 启动一个Command,当service重新启动的时候。
Eg:
service servicemanager /system/bin/servicemanager
class core
user system
group system
critical
onrestart restart healthd
onrestart restart zygote
onrestart restart media
onrestart restart surfaceflinger
onrestart restart drm
常用Triggers说明:
1、boot eg: on boot 这是第一个触发的,当init进程启动时候。
2、= when the property is set to the specific value .
Eg:on property:sys.boot_completed=1
3、device-added- device-removed-
当一个设备节点被删除或者添加的时候,触发。
Eg:
on device-added-/dev/compass
start akmd
4、service-exited- 当制定的service退出的时候触发。
常用Commands说明
1、exec [ ]* Fork and execute a program ().
2、export
Set the environment variable equal to in the lobal environment
export PATH /sbin:/system/sbin:/system/bin
3、import 解析init配置文件,扩展当前的init.rc配置
4、chdir 改变当前的工作路径
5、chmod 改变文件的访问权限
6、chown 改变文件拥有者和组
7、class_start 启动某个class
Eg:
on nonencrypted
class_start main
class_start late_start
8、class_stop 停止某个class
9、enable 使能一个service 如果他是disable的。
10、insmod 安装模块
11、mkdir [mode] [owner] [group] 创建文件夹
12、mount
13、setenforce 0|1 设置SELinux system-wide的状态
14、setprop 设置system property
15、start 启动service
16、stop 停止service
17、wait [ ] 等待某个文件的出现
18、write 向文件写入字符串
Eg: write /proc/cpu/alignment 4
一个Init.conf的例子
Example init.conf
-----------------
# not complete -- just providing some examples of usage
#
on boot
export PATH /sbin:/system/sbin:/system/bin
export LD_LIBRARY_PATH /system/lib
mkdir /dev
mkdir /proc
mkdir /sys
mount tmpfs tmpfs /dev
mkdir /dev/pts
mkdir /dev/socket
mount devpts devpts /dev/pts
mount proc proc /proc
mount sysfs sysfs /sys
write /proc/cpu/alignment 4
ifup lo
hostname localhost
domainname localhost
mount yaffs2 mtd@system /system
mount yaffs2 mtd@userdata /data
import /system/etc/init.conf
class_start default
service adbd /sbin/adbd
user adb
group adb
service usbd /system/bin/usbd -r
user usbd
group usbd
socket usbd 666
service zygote /system/bin/app_process -Xzygote /system/bin --zygote
socket zygote 666
service runtime /system/bin/runtime
user system
group system
on device-added-/dev/compass
start akmd
on device-removed-/dev/compass
stop akmd
service akmd /sbin/akmd
disabled
user akmd
group akmd
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
Debugging notes
By default, programs executed by init will drop stdout and stderr into
/dev/null. To help with debugging, you can execute your program via the
Andoird program logwrapper. This will redirect stdout/stderr into the
Android logging system (accessed via logcat).