android init中的service

本文深入探讨了Android init进程如何初始化并管理service,包括service的数据结构、解析方式、启动流程以及启动方式。重点阐述了service的定义、初始化、选项配置以及常见启动命令。同时,详细介绍了init.rc文件中不同类别的service,如核心服务和主要服务,并提供了关键信息的概览。
   android的init進程初始化的時候,除了對系統作一些必要的初始化外,就是启動service了。而service是定義在init腳本中的,故很有必要了解一下,init中對service的處理。

  • 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:service <name> <parthname> [ <argument> ]*。pathname代表启動service時用到的命令。

        開始解析service節的函數为parse_service()。該函數的主要功能是:創建service對象,解析定義service的行,然後設置service的默認的class为default。

  • 解析service的option
        解析service的option位於函數parse_line_service()中,該函數中支持的option如下:

  1. capability # 暫時未實現
  2. class <name> # 設置名稱为name的類別,感覺有點像開機启動service的優先級,默認的class名稱为default
  3. console # 需要在android屏幕上打開控制台
  4. disabled # 設置後,不能自動的通過class名稱启動,必須顯式的通過service名稱启動
  5. ioprio <rt|be|idle> <0-7> # 設置io優先級
  6. group <groupname> [ <groupname> ]* # 設置服務進程的effective group ID(第一個参數)和supplementary group IDs(第二個到最後)
  7. keycodes <keycodes> [ <keycodes> ]* # keycodes相關
  8. oneshot # 服務退出時,不再启動,但可以通過名稱启動
  9. onrestart # 服務重启時,執行的命令,可能是服務的重启的時候,需要作一些額外的工作
  10. critical # 是device-critical service,在4分钟內退出超過4次,那麼設備會重启到recover模式下
  11. setenv <name> <value> # 設置服務的環境變量
  12. socket <name> <type> <perm> [ <user> [ <group> ]  ] # 为服務創建socket,可以創建多個
  13. 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:

  1. ueventd /sbin/ueventd # 處理內核的uevent消息
  2. console /system/bin/sh # 控制台服務
  3. adbd /sbin/adbd # adb調試的服務端
  4. servicemanager /system/bin/servicemanager # 管理服務的服務,被管理的服務通常是供應用程序使用的
  5. vold /system/bin/vold # 管理存儲設備

        class main的service包括:

  1. netd /system/bin/netd # 網络管理器
  2. debuggerd /system/bin/debuggerd # 可以在logcat中輸出調試信息
  3. ril-deamon /system/bin/rild # 打電話的服務
  4. surfaceflinger /system/bin/surfacefliger # 合成framebuffer的服務
  5. zygote /system/bin/app_process # 孵化java應用進程的服務
  6. drm /system/bin/drmserver # DRM服務,frameworks/base/drm
  7. media /system/bin/mediaserver # 多媒體服務
  8. bootanim /system/bin/bootanimation # 開機動畫服務
  9. dbus /system/bin/dbus-daemon # 用於進程間通訊的服務
  10. bluetoothd /system/bin/bluetoothd # 藍牙
  11. installd /system/bin/installd # apk安裝的服務
  12. flash_recovery /system/etc/install-recovery.sh # recover recovery分區
  13. racoon /system/bin/racoon # key management daemon
  14. mtpd /system/bin/mtpd # MTP(Media Transfer Protocol) daemon
  15. keystore /system/bin/keystore # 應用簽名
  16. dumpstate /system/bin/dumpstate # 性能測試工具
【负荷预测】基于VMD-CNN-LSTM的负荷预测研究(Python代码实现)内容概要:本文介绍了基于变分模态分解(VMD)、卷积神经网络(CNN)和长短期记忆网络(LSTM)相结合的VMD-CNN-LSTM模型在负荷预测中的研究与应用,采用Python代码实现。该方法首先利用VMD对原始负荷数据进行分解,降低序列复杂性并提取不同频率的模态分量;随后通过CNN提取各模态的局部特征;最后由LSTM捕捉时间序列的长期依赖关系,实现高精度的负荷预测。该模型有效提升了预测精度,尤其适用于非平稳、非线性的电力负荷数据,具有较强的鲁棒性和泛化能力。; 适合人群:具备一定Python编程基础和深度学习背景,从事电力系统、能源管理或时间序列预测相关研究的科研人员及工程技术人员,尤其适合研究生、高校教师及电力行业从业者。; 使用场景及目标:①应用于日前、日内及实时负荷预测场景,支持智慧电网调度与能源优化管理;②为研究复合型深度学习模型在非线性时间序列预测中的设计与实现提供参考;③可用于学术复现、课题研究或实际项目开发中提升预测性能。; 阅读建议:建议读者结合提供的Python代码,深入理解VMD信号分解机制、CNN特征提取原理及LSTM时序建模过程,通过实验调试参数(如VMD的分解层数K、惩罚因子α等)优化模型性能,并可进一步拓展至风电、光伏等其他能源预测领域。
【轴承故障诊断】基于融合鱼鹰和柯西变异的麻雀优化算法OCSSA-VMD-CNN-BILSTM轴承诊断研究【西储大学数据】(Matlab代码实现)内容概要:本文研究了一种基于融合鱼鹰和柯西变异的麻雀优化算法(OCSSA)优化变分模态分解(VMD)参数,并结合卷积神经网络(CNN)与双向长短期记忆网络(BiLSTM)的轴承故障诊断模型。该方法利用西储大学轴承数据集进行验证,通过OCSSA算法优化VMD的分解层数K和惩罚因子α,有效提升信号去噪与特征提取能力;随后利用CNN提取故障特征的空间信息,BiLSTM捕捉时间序列的长期依赖关系,最终实现高精度的轴承故障识别。整个流程充分结合了智能优化、信号处理与深度学习技术,显著提升了复杂工况下故障诊断的准确性与鲁棒性。; 适合人群:具备一定信号处理、机器学习及MATLAB编程基础的研究生、科研人员及从事工业设备故障诊断的工程技术人员。; 使用场景及目标:①解决传统VMD参数依赖人工经验选择的问题,实现自适应优化;②构建高效准确的轴承故障诊断模型,适用于旋转机械设备的智能运维与状态监测;③为类似机电系统故障诊断提供可借鉴的技术路线与代码实现参考。; 阅读建议:建议结合提供的Matlab代码进行实践操作,重点关注OCSSA算法的设计机制、VMD参数优化过程以及CNN-BiLSTM网络结构的搭建与训练细节,同时可尝试在其他故障数据集上迁移应用以加深理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值