android init中的service

     android的init進程初始化的時候,除瞭對系統作一些必要的初始化外,就是啟動service瞭。而service是定義在init腳本中的,故很有必要瞭解一下,init中對service的處理。
struct service
        該數據結構保存瞭和service相關的信息。service下可以定義option,這些option被保存在這個結構體中;除此之外還保存瞭service的運行時管理信息,具體如下:
[cpp]
struct service { 
        /* list of all services */ 
    struct listnode slist; 
 
    const char *name; // 名稱 
    const char *classname; // 類別: default 
 
    unsigned flags; // 選項,參見init.h中SVC_宏定義 
    pid_t pid; // service所在進程的pid 
    time_t time_started;    /* time of last start */ 
    time_t time_crashed;    /* first crash within inspection window */ 
    int nr_crashed;         /* number of times crashed within window */ 
     
    uid_t uid; // effective user ID 
    gid_t gid; // effective group ID 
    gid_t supp_gids[NR_SVC_SUPP_GIDS]; // supplementary group IDs 
    size_t nr_supp_gids; // supp_gids的大小 
 
    struct socketinfo *sockets; // 為service創建的sockets 
    struct svcenvinfo *envvars; // 為service設置的環境變量 
 
    struct action onrestart;  /* Actions to execute on restart. */ 
     
    /* keycodes for triggering this service via /dev/keychord */ 
    int *keycodes; 
    int nkeycodes; 
    int keychord_id; 
 
    int ioprio_class; // io優先級 
    int ioprio_pri; 
 
    int nargs; // 參數個數,參見下面的說明 
    /* "MUST BE AT THE END OF THE STRUCT" */ 
    char *args[1]; // service [service name] [args] NULL # 包含瞭service的參數的個數+1 
}; /*     ^——-'args' MUST be at the end of this struct! */ 
解析service節
        定義service:service <name> <parthname> [ <argument> ]*。pathname代表啟動service時用到的命令。
        開始解析service節的函數為parse_service()。該函數的主要功能是:創建service對象,解析定義service的行,然後設置service的默認的class為default。
解析service的option
        解析service的option位於函數parse_line_service()中,該函數中支持的option如下:
capability # 暫時未實現
class <name> # 設置名稱為name的類別,感覺有點像開機啟動service的優先級,默認的class名稱為default
console # 需要在android屏幕上打開控制臺
disabled # 設置後,不能自動的通過class名稱啟動,必須顯式的通過service名稱啟動
ioprio <rt|be|idle> <0-7> # 設置io優先級
group <groupname> [ <groupname> ]* # 設置服務進程的effective group ID(第一個參數)和supplementary group IDs(第二個到最後)
keycodes <keycodes> [ <keycodes> ]* # keycodes相關
oneshot # 服務退出時,不再啟動,但可以通過名稱啟動
onrestart # 服務重啟時,執行的命令,可能是服務的重啟的時候,需要作一些額外的工作
critical # 是device-critical service,在4分鐘內退出超過4次,那麼設備會重啟到recover模式下
setenv <name> <value> # 設置服務的環境變量
socket <name> <type> <perm> [ <user> [ <group> ]  ] # 為服務創建socket,可以創建多個
user <effectuserid> # 設置服務進程的effective user ID
啟動service
        啟動service的函數為service_start(struct service *svc, const char *dynamic_args)。dynamic_args隻有當service的option中有oneshot是才會用到,此時會通過替換掉啟動服務的命令參數啟動服務。
        service的option會記錄在struct service中,故啟動service時,考慮到這些選項即可。同時,會記錄下service的pid、狀態等。
        在init進程中,啟動service可以有以下的方式:
        1.action下面添加和啟動服務相關的command即可。action中和操作服務相關的命令有:
        class_start <serviceclass> # 啟動所有指定class的服務
        class_stop <serviceclass> # 停止所有指定class的服務,後續沒法通過class_start啟動
        class_reset <serviceclass> # 停止服務,後續可以通過class_start啟動
        restart <servicename> # 重啟指定名稱的服務,先stop,再start
        start <servicename> # 啟動指定名稱的服務
        stop <servicename> # 停止指定名稱的服務
        2.restart_processes()函數中。該函數位於init的主線程循環中,用來查看有沒有需要重新啟動的service。具體參考init.c
        3.handle_property_set_fd()函數中。通過向socket名稱為property_service的屬性服務,發送控制的消息可以進入到該函數中。具體可以參考property_service.c
        4.handle_keychord()函數中。該函數和chorded keyboard有關,可參閱相關信息
init.rc中的service
        按照service的class來分的話,可以分為兩大類:class core和class main。其中,class core中包含如下service:
ueventd /sbin/ueventd # 處理內核的uevent消息
console /system/bin/sh # 控制臺服務
adbd /sbin/adbd # adb調試的服務端
servicemanager /system/bin/servicemanager # 管理服務的服務,被管理的服務通常是供應用程序使用的
vold /system/bin/vold # 管理存儲設備
        class main的service包括:
netd /system/bin/netd # 網絡管理器
debuggerd /system/bin/debuggerd # 可以在logcat中輸出調試信息
ril-deamon /system/bin/rild # 打電話的服務
surfaceflinger /system/bin/surfacefliger # 合成framebuffer的服務
zygote /system/bin/app_process # 孵化java應用進程的服務
drm /system/bin/drmserver # DRM服務,frameworks/base/drm
media /system/bin/mediaserver # 多媒體服務
bootanim /system/bin/bootanimation # 開機動畫服務
dbus /system/bin/dbus-daemon # 用於進程間通訊的服務
bluetoothd /system/bin/bluetoothd # 藍牙
installd /system/bin/installd # apk安裝的服務
flash_recovery /system/etc/install-recovery.sh # recover recovery分區
racoon /system/bin/racoon # key management daemon
mtpd /system/bin/mtpd # MTP(Media Transfer Protocol) daemon
keystore /system/bin/keystore # 應用簽名
dumpstate /system/bin/dumpstate # 性能測試工具

發佈留言