【Android Framework】開機執行自定義腳本之Init.rc文件的妙用與如何編寫開機腳本?

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

案例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
② 在device/qcom/msm8909/msm8909.mk中加入:

#add by eiot shao 2016.11.11 for bug 4612
PRODUCT_COPY_FILES += device/qcom/msm8909/setBKL.sh:system/bin/setBKL.sh
將device/qcom/msm8909/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!"

Init語言包含了四個大類的聲明
Actions, Commands, Services, and Options.

Actions and Services implicitly declare a new section. All commands or options belong to the section most recently declared. Commands or options before the first section are ignored.

Actions和Services隱性的聲明瞭一個新的段,所有的commands和options都屬於這些最近聲明的段。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 <name> <value> 設置環境變量。

4、socket <name> <type> <perm> [ <user> [ <group> [ <context> ] ] ] 創建一個socket接口/dev/socket/<name>,使本地service和java可以通信。

5、user <username> 執行service之前改變用戶名。

6、group <groupname> [ <groupname> ]* 執行service之前改變用戶組。

7、oneshot 當service退出後不會重啓。

8、class <name> 爲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、<name>=<value> when the property <name> is set to the specific value <value>. Eg:on property:sys.boot_completed=1

3、device-added-<path> device-removed-<path> 當一個設備節點被刪除或者添加的時候,觸發。

  Eg:
    on device-added-/dev/compass
          start akmd
4、service-exited-<name> 當制定的service退出的時候觸發。


常用Commands說明
1、exec <path> [ <argument> ]* Fork and execute a program (<path>).

2、export <name> <value>

  Set the environment variable <name> equal to <value> in the lobal environment
  export PATH /sbin:/system/sbin:/system/bin
3、import <filename> 解析init配置文件,擴展當前的init.rc配置

4、chdir <directory> 改變當前的工作路徑

5、chmod <octal-mode> <path> 改變文件的訪問權限

6、chown <owner> <group> <path> 改變文件擁有者和組

7、class_start <serviceclass> 啓動某個class

Eg: 
on nonencrypted
    class_start main
    class_start late_start
8、class_stop <serviceclass> 停止某個class

9、enable <servicename> 使能一個service 如果他是disable的。

10、insmod <path> 安裝模塊

11、mkdir <path> [mode] [owner] [group] 創建文件夾

12、mount <type> <device> <dir> [ <mountoption> ]* 掛載設備到某個目錄

13、setenforce 0|1 設置SELinux system-wide的狀態

14、setprop <name> <value> 設置system property

15、start <service> 啓動service

16、stop <service> 停止service

17、wait <path> [ <timeout> ] 等待某個文件的出現

18、write <path> <string> 向文件寫入字符串

 Eg: write /proc/cpu/alignment 4

**selinux問題

新增service遇到selinux問題,可參考如下方法添加規則;
例如:service名爲meig_camera_service

1、新建meig_camera_service.te,後續service相關權限都可以在這裏添加:
      先加入下面內容:
type meig_camera_service, domain, domain_deprecated; # 定義 domain
type meig_camera_service_exec, exec_type, file_type; # 定義 可執行文件類型
init_daemon_domain(meig_camera_service) # 賦權 domain

2、service.te 中添加服務類型定義:
type meig_camera_service_service, service_manager_type;

3、service_contexts中添加 服務 映射規則:
xxx_camera_service u:object_r:xxx_camera_service_service:s0

4、file_contexts中添加 可執行文件 映射規則:
/system/bin/xxx_camera_service u:object_r:xxx_camera_service_exec:s0

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章