当前位置: 首页 > news >正文

usbd服务

usbd服务的代码结构

Android.bp

usbd.cpp

usbd.rc

1.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 关键字用于定义服务的启动顺序。根据服务类别,服务会被系统在适当的时机自动启动。

(1)class core

最早启动,class core 服务通常在系统启动的第一阶段被启动,on boot阶段。

包含系统最基本的服务,如 ueventd、logd、adbd 等,这些服务是系统运行所必需的。class core的服务如下

序号 service名称 所属文件 命令bin文件位置
1 watchdogd init.manta.rc /sbin/watchdogd
2 watchdogd init.recovery.manta.rc /sbin/watchdogd
3 setup_fs init.smdk5250.rc /system/bin/setup_fs
4 ueventd init.rc /sbin/ueventd
5 logd init.rc /system/bin/logd
6 healthd init.rc /sbin/healthd
7 console init.rc /system/bin/sh
8 adbd init.rc /sbin/adbd
9 servicemanager init.rc /system/bin/servicemanager
10 vold init.rc /system/bin/vold
只要core服务全部启动,手机此时是可以运行的,但是却看不到东西,原因是framework没有启动。此时启动的都是C,C++的进程。

(2)class main

在 class core 服务启动之后,且/data分区准备就绪时启动。

class main 服务通常在系统启动的第二阶段被启动。

包含更多的系统服务,如 surfaceflinger、media、drm 、zygote等。这些服务提供了更多的系统功能,但并不是系统启动所必需的。main服务大部分是建立在java层或者与java层息息相关的系统服务。

(3)class late_start

usbd使用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/ledservice

class main

console

disabled

onrestart

on property:ro.boot.wzb210_audio_hw_rev=3

start ledservice

需要将class main改为class core才行。学习排查问题的思路。

猜测的原因:

on property:ro.boot.wzb210_audio_hw_rev=3在第一阶段执行,但是service ledservice 在class main的时候才会处理,所以无法启动服务。

2.1.2服务启动方式

如果一组服务在定义时使用了disabled关键字,则不会自动启动。

比如adbd

# adbd is controlled via property triggers in init.<platform>.usb.rc

service adbd /system/bin/adbd --root_seclabel=u:r:su:s0

class core

socket adbd seqpacket 660 system system

disabled

updatable

seclabel u:r:adbd:s0

这里有disabled关键字,那么class core默认不会生效。

因为adb需要手动打开adb后才允许启动,默认状态不能启动adbd,所以服务声明的地方加了disabled。

通过start adbd启动服务

on property:sys.usb.config=adb && property:sys.usb.configfs=1
start adbd
AI写代码
start adbd通常只在传统USB方案中使用,也就是通过rc文件触发USB属性的时候使用。

对于后来使用gadget hal的方案,usbd服务里使用ctrl.start关键字启动服务。

(1)命令行启动服务

setprop ctl.start adbd

(2)代码中启动服务

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 为 adbd,init 进程会监听这个属性,并启动对应的服务。

但在非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 usbd

4.usbd编译方式

使用mninja usbd快编。

http://www.jsqmd.com/news/770968/

相关文章:

  • 独立开发者如何通过 Taotoken 管理多个项目的 API 密钥与用量
  • 2026年贵阳室内装修全链条深度指南:从设计落地到品质交付的避坑方案 - 优质企业观察收录
  • 开源协作平台newrev:一体化架构、事件驱动与CI/CD深度集成解析
  • Sketch设计稿如何自动生成可测量的HTML页面?
  • 如何用GetQzonehistory轻松备份你的QQ空间记忆?
  • 终极指南:10分钟掌握BepInEx游戏插件框架的完整配置与实战应用
  • 2026年性价比之选:钢衬塑储罐、钢衬四氟储罐优质生产厂家口碑推荐 - 深度智识库
  • 别再乱接Y电容了!开关电源EMI整改中,这4种经典接法到底怎么选?
  • 初创公司如何借助 Taotoken 以最小成本验证多个 AI 产品创意
  • 2026年5月同城交友/婚恋/相亲/交友/婚恋交友/找对象平台权威分析:安全、高效、成功率高的平台这样选 - 2026年企业推荐榜
  • 2026年遵义交通标志牌、标志杆与反光膜采购指南:本地源头厂家直达方案 - 企业名录优选推荐
  • 3分钟上手AMD Ryzen调试神器:SMUDebugTool完整使用指南
  • 2026年遵义交通标志牌、施工警示牌与标志杆供应商深度横评指南 - 企业名录优选推荐
  • 注意力的本质的庖丁解牛
  • 破局AI信息黑箱:搜极星三大核心功能深度解构与竞品降维打击
  • GetQzonehistory:一站式自动化QQ空间历史数据备份解决方案
  • 2026现阶段武汉低压配电柜厂家综合实力盘点与选择指南,认准武汉全通自动化设备有限公司 - 2026年企业推荐榜
  • 助力国产化升级,全面提升道路监控效率
  • 对比直接使用原厂 API 体验 Taotoken 在路由优化上的差异
  • 为AI编程助手注入源代码语义:agentsrc-py实战解析
  • 使用Node.js和Taotoken快速构建一个智能客服原型系统
  • 3步永久保存你的数字青春:GetQzonehistory让QQ空间记忆永不褪色
  • 深度解析HoRNDIS:基于RNDIS协议的macOS Android USB网络共享架构实现
  • 明日方舟2000+高清游戏素材库:创作者的数字艺术宝库
  • 从标红重灾区到无痕原创:虎贲等考 AI 降重降 AIGC,让论文一次通过双重检测
  • GoldHEN作弊管理器深度解析:破解PS4游戏修改的技术架构与实战应用
  • Go 切片深度解析:彻底搞懂 `copy()` 函数的用法与原理
  • 985硕士CV求职碰壁?别只刷LeetCode了,试试用FastAPI+PyTorch做个能跑的项目放GitHub
  • 使用Taotoken后API调用延迟与成功率的主观体验变化
  • 通过审计日志追溯API Key使用情况加强团队内部安全管理