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

本文涉及的产品
阿里云百炼推荐规格 ADB PostgreSQL,4核16GB 100GB 1个月
简介: 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文件中的具体内容来理解它们的细节。

相关实践学习
阿里云百炼xAnalyticDB PostgreSQL构建AIGC应用
通过该实验体验在阿里云百炼中构建企业专属知识库构建及应用全流程。同时体验使用ADB-PG向量检索引擎提供专属安全存储,保障企业数据隐私安全。
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
相关文章
|
29天前
|
人工智能 搜索推荐 物联网
Android系统版本演进与未来展望####
本文深入探讨了Android操作系统从诞生至今的发展历程,详细阐述了其关键版本迭代带来的创新特性、用户体验提升及对全球移动生态系统的影响。通过对Android历史版本的回顾与分析,本文旨在揭示其成功背后的驱动力,并展望未来Android可能的发展趋势与面临的挑战,为读者呈现一个既全面又具深度的技术视角。 ####
|
27天前
|
IDE Java 开发工具
移动应用与系统:探索Android开发之旅
在这篇文章中,我们将深入探讨Android开发的各个方面,从基础知识到高级技术。我们将通过代码示例和案例分析,帮助读者更好地理解和掌握Android开发。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和技巧。让我们一起开启Android开发的旅程吧!
|
15天前
|
监控 Java Android开发
深入探索Android系统的内存管理机制
本文旨在全面解析Android系统的内存管理机制,包括其工作原理、常见问题及其解决方案。通过对Android内存模型的深入分析,本文将帮助开发者更好地理解内存分配、回收以及优化策略,从而提高应用性能和用户体验。
|
16天前
|
存储 安全 Android开发
探索Android系统的最新安全特性
在数字时代,智能手机已成为我们生活中不可或缺的一部分。随着技术的不断进步,手机操作系统的安全性也越来越受到重视。本文将深入探讨Android系统最新的安全特性,包括其设计理念、实施方式以及对用户的影响。通过分析这些安全措施如何保护用户免受恶意软件和网络攻击的威胁,我们希望为读者提供对Android安全性的全面了解。
|
1月前
|
监控 Java Android开发
深入探讨Android系统的内存管理机制
本文将深入分析Android系统的内存管理机制,包括其内存分配、回收策略以及常见的内存泄漏问题。通过对这些方面的详细讨论,读者可以更好地理解Android系统如何高效地管理内存资源,从而提高应用程序的性能和稳定性。
66 16
|
22天前
|
安全 Android开发 iOS开发
深入探讨Android与iOS系统的差异及未来发展趋势
本文旨在深入分析Android和iOS两大移动操作系统的核心技术差异、用户体验以及各自的市场表现,进一步探讨它们在未来技术革新中可能的发展方向。通过对比两者的开放性、安全性、生态系统等方面,本文揭示了两大系统在移动设备市场中的竞争态势和潜在变革。
|
1月前
|
算法 JavaScript Android开发
|
1月前
|
安全 搜索推荐 Android开发
揭秘安卓与iOS系统的差异:技术深度对比
【10月更文挑战第27天】 本文深入探讨了安卓(Android)与iOS两大移动操作系统的技术特点和用户体验差异。通过对比两者的系统架构、应用生态、用户界面、安全性等方面,揭示了为何这两种系统能够在市场中各占一席之地,并为用户提供不同的选择。文章旨在为读者提供一个全面的视角,理解两种系统的优势与局限,从而更好地根据自己的需求做出选择。
96 2
|
1月前
|
安全 搜索推荐 程序员
深入探索Android系统的碎片化问题及其解决方案
在移动操作系统的世界中,Android以其开放性和灵活性赢得了广泛的市场份额。然而,这种开放性也带来了一个众所周知的问题——系统碎片化。本文旨在探讨Android系统碎片化的现状、成因以及可能的解决方案,为开发者和用户提供一种全新的视角来理解这一现象。通过分析不同版本的Android系统分布、硬件多样性以及更新机制的影响,我们提出了一系列针对性的策略,旨在减少碎片化带来的影响,提升用户体验。
|
1月前
|
安全 Android开发 iOS开发
深入探索iOS与Android系统的差异性及优化策略
在当今数字化时代,移动操作系统的竞争尤为激烈,其中iOS和Android作为市场上的两大巨头,各自拥有庞大的用户基础和独特的技术特点。本文旨在通过对比分析iOS与Android的核心差异,探讨各自的优势与局限,并提出针对性的优化策略,以期为用户提供更优质的使用体验和为开发者提供有价值的参考。