Init.rc妙用及語法說明

參考: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

案例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

② 在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

將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

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

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).

發佈了26 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章