Android USB系统初始化init.usb.rc

简介: Android USB系统初始化init.usb.rc

前面学习完了 init.usb.configfs.rc文件 ,它是一种用于配置和控制Android USB系统的初始化脚本文件,它使用了一种基于configfs(配置文件系统)的方法来设置USB配置和模式 , 那我们继续学习另外一个同样重要的USB系统初始化脚本文件init.usb.rc。

系列文章

Android系统 init.rc 第一次开机创建文件节点实现和原理分析

Android系统 init.rc开机执行shell脚本

Android系统 init.rc sys/class系统节点写不进解决方案和原理分析

Android系统 init.rc文件详解

Android系统 自定义动态修改init.custom.rc

Android USB系统初始化init.usb.configfs.rc

Android USB系统初始化init.usb.rc

Android USB系统初始化是指在Android系统启动时,根据USB设备的类型和功能,设置相应的USB配置和模式,以实现USB设备的识别和连接。Android USB系统初始化涉及到两个重要的初始化脚本文件:init.usb.configfs.rc和init.usb.rc。

1. init.usb.rc文件详解

init.usb.rc文件是另一种用于配置和控制Android USB系统的初始化脚本文件,它使用了一种基于sysfs(系统文件系统)的方法来设置USB配置和模式。

sysfs是一种特殊的虚拟文件系统,它允许用户通过读取和修改文件来访问内核对象的属性,如USB设备的ID、功能、状态等。sysfs通常挂载在/sys目录下,它提供了一个名为class/android_usb/android0的子目录,用于管理USB设备的属性和行为。

2|rk3568_r:/sys/class/android_usb/android0 # ls -ll
total 0
drwxr-xr-x 3 root root    0 2023-08-24 19:19:58.813334168 +0800 f_audio_source
drwxr-xr-x 3 root root    0 2023-08-24 19:19:58.823334169 +0800 f_midi
drwxr-xr-x 2 root root    0 2023-08-24 19:19:58.803334167 +0800 power
-r--r--r-- 1 root root 4096 2023-08-24 19:19:58.812992001 +0800 state
lrwxrwxrwx 1 root root    0 2023-08-24 19:19:58.803334167 +0800 subsystem -> ../../../../class/android_usb
-rw-r--r-- 1 root root 4096 2023-08-24 19:19:58.807655959 +0800 uevent
rk3568_r:/sys/class/android_usb/android0 # cat state
DISCONNECTED #没接usb 调试
rk3568_r:/sys/class/android_usb/android0 # cat state
CONFIGURED #接了usb 调试

init.usb.rc文件主要包含以下几个部分:

  • 启动操作:启动操作是一种用于在文件系统准备好后执行的操作,它使用on post-fs-data语句来定义触发条件,如on post-fs-data表示在文件系统准备好后触发。
on post-fs-data
    chown system system /sys/class/android_usb/android0/f_mass_storage/lun/file
    chmod 0660 /sys/class/android_usb/android0/f_mass_storage/lun/file
    chown system system /sys/class/android_usb/android0/f_rndis/ethaddr
    chmod 0660 /sys/class/android_usb/android0/f_rndis/ethaddr
    mkdir /data/misc/adb 02750 system shell
    mkdir /data/adb 0700 root root encryption=Require
  • 服务定义:服务定义是一种用于定义服务的操作,它使用service语句来指定服务名称、路径、参数、类别、套接字、状态、标签等,如service adbd /system/bin/adbd --root_seclabel=u:r:su:s0表示定义一个名为adbd的服务,它的路径是/system/bin/adbd,参数是–root_seclabel=u:r:su:s0,类别是core,套接字是adbd,状态是disabled,标签是u:r:adbd:s0。
# 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
  • 初始化操作:初始化操作是一种用于在系统初始化时执行的操作,它使用on init语句来定义触发条件,如on init表示在系统初始化时触发。
on init
    setprop sys.usb.configfs 0
  • 属性触发器:属性触发器是一种用于响应属性变化的机制,它使用on property:…语句来定义触发条件,如on property:sys.usb.config=adb表示当sys.usb.config属性的值变为adb时触发。
# adb only USB configuration
# This is the fallback configuration if the
# USB manager fails to set a standard configuration
on property:sys.usb.config=adb && property:sys.usb.configfs=0
    write /sys/class/android_usb/android0/enable 0
    write /sys/class/android_usb/android0/idVendor 18d1
    write /sys/class/android_usb/android0/idProduct 4EE7
    write /sys/class/android_usb/android0/functions ${sys.usb.config}
    write /sys/class/android_usb/android0/enable 1
    start adbd
    setprop sys.usb.state ${sys.usb.config}
  • 写入操作:写入操作是一种用于修改文件内容的操作,它使用write语句来指定文件路径和写入内容,如write /sys/class/android_usb/android0/enable 1表示将1写入/sys/class/android_usb/android0/enable文件中。
# USB accessory configuration
on property:sys.usb.config=accessory && property:sys.usb.configfs=0
........
    write /sys/class/android_usb/android0/enable 1
........
  • 启动操作:启动操作是一种用于启动服务的操作,它使用start语句来指定服务名称,如start adbd表示启动adbd服务。
on property:sys.usb.config=adb && property:sys.usb.configfs=0
........
    start adbd
........
  • 停止操作:停止操作是一种用于停止服务的操作,它使用stop语句来指定服务名称,如stop adbd表示停止adbd服务。
on property:sys.usb.config=none && property:sys.usb.configfs=0
........
    stop adbd
........
  • 设置属性操作:设置属性操作是一种用于设置属性值的操作,它使用setprop语句来指定属性名称和属性值,如setprop sys.usb.state ${sys.usb.config}表示将sys.usb.state属性的值设置为sys.usb.config属性的值。
on property:sys.usb.config=none && property:sys.usb.configfs=0
........
    setprop sys.usb.state ${sys.usb.config}
........

init.usb.rc文件的主要作用是根据不同的USB配置,设置相应的USB设备ID、功能、状态等,并启动或停止相应的服务。这个文件中的每个属性触发器都对应了一种USB配置,如adb、mtp、ptp、accessory等,当sys.usb.config属性的值变化时,就会执行相应的操作,如写入、启动、停止、设置属性等。这些操作都是通过sysfs文件系统来实现的,它们会影响到USB设备的识别和连接。

2. init.usb.rc文件概述

init.usb.rc文件的结构大致如下:

on post-fs-data
    # 在文件系统准备好后执行的操作
    ...
service adbd /system/bin/adbd --root_seclabel=u:r:su:s0
    # 定义adbd服务
    ...
on init
    # 在系统初始化时执行的操作
    ...
# Used to disable USB when switching states
on property:sys.usb.config=none && property:sys.usb.configfs=0
    # 无USB配置时的操作
    ...
# adb only USB configuration
# This is the fallback configuration if the
# USB manager fails to set a standard configuration
on property:sys.usb.config=adb && property:sys.usb.configfs=0
    # adb USB配置时的操作
    ...
# USB accessory configuration
on property:sys.usb.config=accessory && property:sys.usb.configfs=0
    # accessory USB配置时的操作
    ...
# USB accessory configuration, with adb
on property:sys.usb.config=accessory,adb && property:sys.usb.configfs=0
    # accessory,adb USB配置时的操作
    ...
# audio accessory configuration
on property:sys.usb.config=audio_source && property:sys.usb.configfs=0
    # audio_source USB配置时的操作
    ...
# audio accessory configuration, with adb
on property:sys.usb.config=audio_source,adb && property:sys.usb.configfs=0
    # audio_source,adb USB配置时的操作
    ...
# USB and audio accessory configuration
on property:sys.usb.config=accessory,audio_source && property:sys.usb.configfs=0
    # accessory,audio_source USB配置时的操作
    ...
# USB and audio accessory configuration, with adb
on property:sys.usb.config=accessory,audio_source,adb && property:sys.usb.configfs=0
    # accessory,audio_source,adb USB配置时的操作
    ...
# Used to set USB configuration at boot and to switch the configuration
# when changing the default configuration
on boot && property:persist.sys.usb.config=*
    # 在系统启动或默认USB配置变化时执行的操作
    ...
#
# USB type C
#
# USB mode changes
on property:sys.usb.typec.mode=dfp
    # 当USB模式变为主机模式时执行的操作
    ...
on property:sys.usb.typec.mode=ufp
    # 当USB模式变为从机模式时执行的操作
    ...
# USB data role changes
on property:sys.usb.typec.data_role=device
    # 当USB数据角色变为从机角色时执行的操作
    ...
on property:sys.usb.typec.data_role=host
    # 当USB数据角色变为主机角色时执行的操作
    ...
# USB power role changes
on property:sys.usb.typec.power_role=source
    # 当USB电源角色变为供电角色时执行的操作
    ...
on property:sys.usb.typec.power_role=sink
    # 当USB电源角色变为接收角色时执行的操作
    ...
on userspace-reboot-requested
  setprop sys.usb.config ""
  setprop sys.usb.state ""

这个文件中的每个属性触发器都是根据不同的USB配置或模式或角色来定义的,当相应的属性值变化时,就会执行相应的操作,如写入、启动、停止、设置属性等。这些操作都是通过sysfs文件系统来实现的,它们会影响到USB设备的识别和连接。

3. init.usb.rc详细语法和命令

下面将以adb USB配置为例,详细学习下init.usb.rc文件中的语法和命令。

3.1 adb USB配置时的操作

当sys.usb.config属性的值变为adb时,会执行以下操作:

on property:sys.usb.config=adb && property:sys.usb.configfs=0
    write /sys/class/android_usb/android0/enable 0
    write /sys/class/android_usb/android0/idVendor 18d1
    write /sys/class/android_usb/android0/idProduct 4EE7
    write /sys/class/android_usb/android0/functions ${sys.usb.config}
    write /sys/class/android_usb/android0/enable 1
    start adbd
    setprop sys.usb.state ${sys.usb.config}

这里有七条命令,分别是:

  • write /sys/class/android_usb/android0/enable 0:这条命令是将0写入/sys/class/android_usb/android0/enable文件中。这个文件是用于控制USB设备是否启用的,0表示禁用,1表示启用。这里先禁用USB设备,是为了避免在设置其他属性时造成不一致或冲突。
    – write /sys/class/android_usb/android0/idVendor 18d1:这条命令是将18d1写入/sys/class/android_usb/android0/idVendor文件中。这个文件是用于设置USB设备的供应商ID的,18d1是Google的供应商ID,表示这个USB设备是由Google提供的。
  • write /sys/class/android_usb/android0/idProduct 4EE7:这条命令是将4EE7写入/sys/class/android_usb/android0/idProduct文件中。这个文件是用于设置USB设备的产品ID的,4EE7是adb功能的产品ID,表示这个USB设备只有adb功能。
  • write /sys/class/android_usb/android0/functions ${sys.usb.config}:这条命令是将sys.usb.config属性的值写入/sys/class/android_usb/android0/functions文件中。这个文件是用于设置USB设备的功能列表的,${sys.usb.config}表示当前的USB配置,如adb、mtp、ptp等。
  • write /sys/class/android_usb/android0/enable 1:这条命令是将1写入/sys/class/android_usb/android0/enable文件中。这个文件是用于控制USB设备是否启用的,0表示禁用,1表示启用。这里再次启用USB设备,是为了使之前设置的属性生效。
  • start adbd:这条命令是启动adbd服务。adbd服务是负责实现adb功能的服务,它会创建一个名为ffs.adb的文件,并将其挂载到/data/adb目录下。这个文件是用于与PC端的adb客户端通信的接口,它会被sysfs文件系统识别为一个USB功能。
  • setprop sys.usb.state ${sys.usb.config}:这条命令是将sys.usb.config属性的值设置为sys.usb.state属性的值。这个命令是用于更新USB状态的,sys.usb.state属性表示当前的USB状态,它应该与sys.usb.config属性保持一致。

这七条命令的执行结果是,USB设备会被识别为一个只有adb功能的USB设备,PC端的adb客户端可以通过ffs.adb文件与adbd服务进行通信。

4. Android USB系统初始化流程

Android USB系统初始化流程是指在Android系统启动时,根据不同的条件和需求,选择合适的USB配置和模式,并执行相应的初始化脚本文件来实现USB设备的识别和连接。

Android USB系统初始化流程大致如下:

  • 系统启动时,会执行init.rc文件,该文件会调用init.xxx.rc文件,其中xxx表示不同的硬件平台,如rk3568 可能是rk30board。
  • init.recovery.rk30board.rc等文件会根据不同的硬件平台,设置一些基本的属性和参数,如sys.usb.controller、persist.sys.usb.config等。
  • init.usb.rc文件会根据不同的硬件平台,选择使用configfs或sysfs方法来配置USB设备,并设置相应的属性值,如sys.usb.configfs、sys.usb.config等。
  • init.rc文件会调用init.usb.rc文件和init.usb.configfs.rc或init.usb.rc文件,其中init.usb.rc文件是针对不同的硬件平台定制的USB初始化脚本文件,init.usb.configfs.rc或init.usb.rc文件是通用的USB初始化脚本文件。
# init.rc的引用
import /init.environ.rc
import /system/etc/init/hw/init.usb.rc
import /init.${ro.hardware}.rc
import /vendor/etc/init/hw/init.${ro.hardware}.rc
import /vendor/etc/init/hw/init.custom.rc
import /system/etc/init/hw/init.usb.configfs.rc
import /system/etc/init/hw/init.${ro.zygote}.rc
  • init.usb.rc文件会根据不同的硬件平台和需求,设置一些特定的属性和参数,如ro.sys.usb.storage.type、ro.sys.usb.mtp.whitelist等,并根据这些属性和参数来选择合适的USB配置,并设置相应的属性值,如persist.sys.usb.config、sys.usb.config等。
  • init.usb.configfs.rc或init.usb.rc文件会根据当前选择的USB配置和模式,执行相应的操作,如创建和删除USB功能和配置文件、启动和停止服务、修改USB设备ID和状态等,并更新相应的属性值,如sys.usb.state、sys.usb.typec.state等。
  • 最终,USB设备会被识别和连接,用户可以通过USB设备进行数据传输、网络共享、调试工具、音视频输出、MIDI控制、配件扩展等功能。

以上就是Android USB系统初始化流程的概述,可以参考init.rc、init.xxx.rc、init.usb.rc、init.usb.configfs.rc文件中的具体内容来理解它们的细节。

相关实践学习
使用CLup和iSCSI共享盘快速体验PolarDB for PostgtreSQL
在Clup云管控平台中快速体验创建与管理在iSCSI共享盘上的PolarDB for PostgtreSQL。
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
相关文章
|
18天前
|
Android开发
Android 如何将定制的Launcher成为系统中唯一的Launcher
Android 如何将定制的Launcher成为系统中唯一的Launcher
28 2
|
4天前
|
运维 监控 Android开发
构建高效自动化运维系统的策略与实践构建高效Android应用:Kotlin协程的实践指南
【5月更文挑战第29天】随着信息技术的迅猛发展,企业IT基础设施变得日益复杂,传统的手动运维模式已难以满足高效率、高稳定性的要求。本文将深入探讨如何通过自动化工具和策略来构建一个高效的自动化运维系统。文中不仅分析了自动化运维的必要性,还详细介绍了实现过程中的关键步骤,包括监控、配置管理、故障响应等,并结合实际案例分析其效果,以期为读者提供一套行之有效的自动化运维解决方案。
|
4天前
|
人工智能 vr&ar Android开发
安卓与iOS系统的发展趋势及影响分析
在移动互联网时代,安卓和iOS作为两大主流移动操作系统,在不断发展变化中展现出不同的特点和发展趋势。本文从技术性角度出发,分析了安卓和iOS系统的发展趋势,并探讨了它们对移动设备市场和用户体验的影响,帮助读者更好地理解当前移动操作系统的发展方向和未来可能的变化。
8 0
|
6天前
|
存储 人工智能 安全
移动应用与系统:探索开发与操作系统的融合安卓应用开发:打造高效用户界面的关键技术
【5月更文挑战第27天】 随着移动互联网的飞速发展,移动应用和操作系统已经成为了我们日常生活中不可或缺的一部分。本文将深入探讨移动应用开发的关键要素,以及移动操作系统的核心功能。我们将分析移动应用开发的挑战和机遇,并讨论移动操作系统如何适应不断变化的技术环境。通过深入研究这些主题,我们希望为读者提供对移动应用和系统领域的全面理解。
|
6天前
|
存储 缓存 算法
深入理解操作系统内存管理:分页系统的优势与挑战构建高效Android应用:探究Kotlin协程的优势与实践
【5月更文挑战第27天】 在现代计算机系统中,内存管理是操作系统的核心功能之一。分页系统作为一种内存管理技术,通过将物理内存划分为固定大小的单元——页面,为每个运行的程序提供独立的虚拟地址空间。这种机制不仅提高了内存的使用效率,还为多任务环境提供了必要的隔离性。然而,分页系统的实现也带来了一系列的挑战,包括页面置换算法的选择、内存抖动问题以及TLB(Translation Lookaside Buffer)的管理等。本文旨在探讨分页系统的原理、优势及其面临的挑战,并通过分析现有解决方案,提出可能的改进措施。
|
8天前
|
Android开发
【通讯录教程】苹果安卓鸿蒙系统通用,如何大批量导入手机号码到手机的通讯录,下面教你方法,只需1分钟搞定几万个号码的导入手机电话本
该文介绍了一种快速批量导入手机通讯录的方法,适用于处理大量手机号的需求,如微商管理、客户资料整理等。在QQ同步助手开始收费后,提供了免费的替代方案。步骤包括:下载批量导入软件(链接提供腾讯云盘和百度网盘地址),清空通讯录(非必需),制作符合格式的通讯录文件,并按操作系统(苹果、安卓或鸿蒙)进行导入。整个过程只需1分钟,简便快捷。
|
17天前
|
Android开发
Android获取当前系统日期和时间的三种方法
Android获取当前系统日期和时间的三种方法
31 4
|
17天前
|
Android开发
Android监听USB设备插拔
Android监听USB设备插拔
38 7
|
18天前
|
存储 缓存 Android开发
Android系统分区与升级
Android系统分区与升级
38 4
|
18天前
|
安全 搜索推荐 物联网
构建未来:基于Android的智能物联网家居系统
【5月更文挑战第15天】 在快速发展的数字化时代,智能物联网(IoT)技术与移动操作系统的结合正在塑造未来家居的生活方式。特别是Android平台,以其开放性、灵活性和广泛的用户基础,成为智能家居创新的理想选择。本文将探讨如何利用Android系统构建一个高效、安全且易于扩展的智能家居控制系统,涵盖系统设计、关键技术实现以及可能面临的挑战。通过分析具体案例,我们旨在为开发者和企业提供一套可行的解决方案蓝图,以促进智能家居领域的进一步发展。