usbd服务的代码结构Android.bpusbd.cppusbd.rc1.Android.bp表明usbd服务要用到gadget hal 。usbd是USB设备的守护进程负责处理USB设备的连接、断开、挂载和USB通信等。2.usbd.rc启动usbd服务注意这里没有disabled关键字说明usbd服务直接由class late_start生效启动。2.1服务类别与启动方式2.1.1服务类别在 rc 文件中class 关键字用于定义服务的启动顺序。根据服务类别服务会被系统在适当的时机自动启动。1class core最早启动class core 服务通常在系统启动的第一阶段被启动on boot阶段。包含系统最基本的服务如 ueventd、logd、adbd 等这些服务是系统运行所必需的。class core的服务如下序号 service名称 所属文件 命令bin文件位置1 watchdogd init.manta.rc /sbin/watchdogd2 watchdogd init.recovery.manta.rc /sbin/watchdogd3 setup_fs init.smdk5250.rc /system/bin/setup_fs4 ueventd init.rc /sbin/ueventd5 logd init.rc /system/bin/logd6 healthd init.rc /sbin/healthd7 console init.rc /system/bin/sh8 adbd init.rc /sbin/adbd9 servicemanager init.rc /system/bin/servicemanager10 vold init.rc /system/bin/vold只要core服务全部启动手机此时是可以运行的但是却看不到东西原因是framework没有启动。此时启动的都是CC的进程。2class main在 class core 服务启动之后且/data分区准备就绪时启动。class main 服务通常在系统启动的第二阶段被启动。包含更多的系统服务如 surfaceflinger、media、drm 、zygote等。这些服务提供了更多的系统功能但并不是系统启动所必需的。main服务大部分是建立在java层或者与java层息息相关的系统服务。3class late_startusbd使用late_start表示 usbd 服务属于 late_start 类这意味着它将在系统启动的后期被启动。服务类别总结服务类别 主要启动时机 核心特点与目的 典型服务举例core 在 on boot 阶段由 class_start core 命令启动。 最早启动。提供系统运行最基础、最核心的功能。这些服务一旦启动通常就不会再被停止。 servicemanager (Binder管家)surfaceflinger (图形合成)logd (日志系统)main 在 core 服务启动之后且 /data 分区准备就绪未加密或无密码时启动。 基础服务。构建Android运行环境的基础包括Java世界的入口——zygote进程。 zygote (应用进程孵化器)media (多媒体服务)installd (包管理服务)late_start 在 main 服务之后且 /data 分区被成功解密并挂载后启动。 “晚启动”服务。目的是保证那些依赖用户数据/data分区的服务在数据可用时再启动避免因资源未就绪而运行出错。 sdcard (外部存储服务)usbd (USB守护进程)部分厂商自定义的服务通过使用 class 关键字init.rc 文件可以定义服务的启动顺序确保系统在启动过程中按照正确的顺序启动各种服务。这样可以避免服务之间的依赖关系导致的问题。参考一个案例https://www.cnblogs.com/weiqifa/p/9686431.html在开机的时候判断硬件版本号去启动服务但是每次烧录完版本固件后服务启动失败需要再复位重启一次服务才启动成功。service ledservice /system/bin/ledserviceclass mainconsoledisabledonrestarton property:ro.boot.wzb210_audio_hw_rev3start ledservice需要将class main改为class core才行。学习排查问题的思路。猜测的原因on property:ro.boot.wzb210_audio_hw_rev3在第一阶段执行但是service ledservice 在class main的时候才会处理所以无法启动服务。2.1.2服务启动方式如果一组服务在定义时使用了disabled关键字则不会自动启动。比如adbd# adbd is controlled via property triggers in init.platform.usb.rcservice adbd /system/bin/adbd --root_seclabelu:r:su:s0class coresocket adbd seqpacket 660 system systemdisabledupdatableseclabel u:r:adbd:s0这里有disabled关键字那么class core默认不会生效。因为adb需要手动打开adb后才允许启动默认状态不能启动adbd所以服务声明的地方加了disabled。通过start adbd启动服务on property:sys.usb.configadb property:sys.usb.configfs1start adbdAI写代码start adbd通常只在传统USB方案中使用也就是通过rc文件触发USB属性的时候使用。对于后来使用gadget hal的方案usbd服务里使用ctrl.start关键字启动服务。1命令行启动服务setprop ctl.start adbd2代码中启动服务property_set(ctl.start, adbd);如usbd.cpp里std::string function GetProperty(persist.sys.usb.config, );if (function adb) {LOG(INFO) persistent prop is adb;SetProperty(ctl.start, adbd);}AI写代码在Android系统中ctl.start 是一个特殊的属性用于启动 init.rc 文件中定义的服务。这条命令会设置系统属性 ctl.start 为 adbdinit 进程会监听这个属性并启动对应的服务。但在非AID_ROOT、AID_SYSTEM 用户的进程中调用ctl.start ctl.stop可能会碰到权限问题需要注意。2.2 oneshot当服务标记为 oneshot 时这意味着服务在启动后如果它退出了系统不会自动重启该服务。这通常用于那些只需要执行一次的服务例如初始化设置或配置任务它们在完成工作后应该停止。usbd服务启动日志片段行 5424: [02-11 01:31:06.166] [2][1189: init]init: starting service usbd...行 5488: [02-11 01:31:06.254] [1][1189: init]init: Service usbd (pid 782) exited with status 0 oneshot service took 0.084000 seconds in background行 5489: [02-11 01:31:06.254] [1][1189: init]init: Sending signal 9 to service usbd (pid 782) process group...2.3 user root表示该服务将以root用户权限运行。2.4 group root usb system表示该服务属于root、usb和system组。3.usbd服务启动时机usbd服务启动有两次时机第一次是系统刚开始时被class last_start启动。第二次是如果启用了gadget hal的系统当设置任何属性的时候init.qcom.usb.rc都会触发start usbd4.usbd编译方式使用mninja usbd快编。