android init中的service
来源:互联网 发布:js获取display属性值 编辑:程序博客网 时间:2024/06/08 01:17
android的init進程初始化的時候,除了對系統作一些必要的初始化外,就是启動service了。而service是定義在init腳本中的,故很有必要了解一下,init中對service的處理。
class_stop <serviceclass> # 停止所有指定class的服務,後續沒法通過class_start启動
class_reset <serviceclass> # 停止服務,後續可以通過class_start启動
restart <servicename> # 重启指定名稱的服務,先stop,再start
start <servicename> # 启動指定名稱的服務
stop <servicename> # 停止指定名稱的服務
- struct service
該數據結構保存了和service相關的信息。service下可以定義option,這些option被保存在這個結構體中;除此之外還保存了service的運行時管理信息,具體如下:
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節的函數为parse_service()。該函數的主要功能是:創建service對象,解析定義service的行,然後設置service的默認的class为default。
- 解析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的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
- 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 # 性能測試工具
- android init中的service
- android init中的service
- android init中的service
- android init中的service
- android init.rc中的service
- Android: 如何调试init.rc中的service
- Android如何配置init.rc中的开机启动进程(service)
- init.rc中的service 问题
- android init.rc 的 service
- android中的init.rc
- 启动init.rc文件中的service
- servlet中的service()和init()的区别
- Android init开启的service简介
- 深入理解Android 中的init
- Android 中的Service
- Android 中的service
- Android中的Service学习
- Android中的Service使用
- Windows游戏编程大师技巧(2nd)第一个程序编译错误解决办法
- C++中子类如何调用不同父类中的同名函数?
- Android API Level
- H.264中的CABAC编码原理
- php-nessus-api
- android init中的service
- nagios 监控内存-增加新插件方法
- cocos2d-x 菜鸟学习笔记十一(触摸控制精灵)
- PMON failed to acquire latch, see PMON dump
- Daily-C-Study(2):C语言enum关键字
- 汉诺塔
- 解决Android拍照保存在系统相册不显示的问题
- 索引读取一条数据逻辑读为什么不为3
- CDMA手机原理之大白话