在SecondStageMain中会先调用PropertyInit做属性初始化,该方法会调用PropertyLoadBootDefaults加载持久化的属性
主要加载位置:
/system/build.prop
/system_ext/default.prop
/system_ext/build.prop
/vendor/default.prop
/vendor/build.prop
/vendor_dlkm/etc/build.prop
/odm_dlkm/etc/build.prop
/odm/default.prop
/odm/build.prop
/product/default.prop
/product/build.prop
这里会读取到persist.sys.usb.config这个属性,注意这里按先后顺需读取是会覆盖的

在SecondStageMain中调用StartPropertyService开启了属性服务后,调用SetUsbController读取/sys/class/udc这个路径下的目录,来设置sys.usb.controller这项属性

LoadBootScripts加载并解析rc文件,rc文件路径有以下几处位置
/system/etc/init/hw/init.rc 这里包括有
/init.environ.rc
/system/etc/init/hw/init.usb.rc
/init.${ro.hardware}.rc
/vendor/etc/init/hw/init.${ro.hardware}.rc
/system/etc/init/hw/init.usb.configfs.rc
/system/etc/init/hw/init.${ro.zygote}.rc
/system/etc/init
/system_ext/etc/init
/vendor/etc/init 存放vendor自定义的rc文件
/odm/etc/init
/product/etc/init

依次触发early-init、init、late-init
am.QueueEventTrigger("early-init")

am.QueueEventTrigger("init")
init阶段:
init.rc中会启动servicemanager、hwservicemanager、vndservicemanager
init.usb.rc中将sys.usb.configfs属性设置为0

am.QueueEventTrigger("late-init")
late-init阶段:
init.rc首先会触发early-fs,启动vold;接着触发post-fs启动vdc
触发zygote-start,执行/system/bin/app_process启动zygote进程,这里的流程比较多,在AndroidRuntime.cpp的start方法中调用java层的方法(ZygoteInit.java/main),启动system_server.
system_server通过startBootstrapServices、startCoreServices、startOtherServices来启动系统服务,usbservice就是在这里启动的

startBootstrapServices

startOtherServices
mSystemServiceManager.startService(ADB_SERVICE_CLASS); // 首先启动adbservice

// 接着根据PackageManager中是否包含 FEATURE_USB_HOST = "android.hardware.usb.host" 这个feature来决定是否启动usbservice。这个feature定义在frameworks/native/data/etc/android.hardware.usb.host.xml,需要copy到/vendor/etc/permission
mSystemServiceManager.startService(USB_SERVICE_CLASS);
mServices.add(service); // system_server持有一个systemservicemanager,所有启动的service会注册到manager中来管理
service.onStart(); // 启动service
mUsbService = new UsbService(getContext());
publishBinderService(Context.USB_SERVICE, mUsbService);
// usbservice 是跑在binder中的,但是UsbService储存在systemservicemanager,只要systemservicemanager不关闭,usbservice就可以正常运行

/frameworks/base/core/java/android/hardware/usb/IUsbManager.aidl
/frameworks/base/core/java/ 下的aidl文件都以apex lib的形式被编译(framework-minus-apex)
触发early-boot
触发boot

UsbService
1、构造函数
mUserManager = context.getSystemService(UserManager.class); // 这里用到的context来自于system_server
mSettingsManager = new UsbSettingsManager(context, this);
mPermissionManager = new UsbPermissionManager(context, this);
mAlsaManager = new UsbAlsaManager(context);


如果包含有FEATURE_USB_HOST则创建UsbHostManager,从调用的方法来看,只有getDeviceList、opendevice、setUsbDeviceConnectionHandler调用了hostmanager的方法
如果包含有/sys/class/android_usb这个路径则创建UsbDeviceManager,setCurrentFunctions、getCurrentFunctions、setScreenUnlockedFunctions、getCurrentUsbSpeed、getGadgetHalVersion等方法调用了devicemanager的方法
如果包含有以上任意一个对象则创建UsbPortManager,getPortStatus、setPortRoles、getUsbHalVersion等方法调用了portmanager的方法


UsbHostManager:我猜测是用来管理接入的设备的,管理方法如下:systemReady会开启一个线程,执行native层的方法usb_host_run,调用usb_host_read_event,其实就是监听/dev、/dev/bus、/dev/bus/usb,这三个路径。如果有事件发生则callback到java层的usbDeviceRemoved、usbDeviceAdded,并将设备添加到mAlsaManager中统一管理


UsbDeviceManager:管理设备作为从属设备时的状态
如果存在IUsbGadget这个服务,那么就使用UsbHandlerHal这个handler,同时注册了几个广播来监听port的变化、charging的变化、host的变化、language的变化。 systemReady时获取到了AdbManagerInternal,并且注册了一个AdbTransport;接着调用finishBoot来初始化usb状态,但是要执行里面的方法需要满足三个条件,BootCompleted、SystemReady和CurrentUsbFunctionsReceived,前两个是由上层调用,最后面一个在有IUsbGadget这个服务时,需要由服务调用getCurrentUsbFunctionsCb来设置;如果用的UsbHandlerLegacy则默认为true。我猜测IUsbGadget这个服务是用来给native层设置usbdevice状态的,并且同步到java层的。
UsbDeviceManager的方法用异步消息的机制就可以保证native和java层保持一致的流程。

setEnabledFunctions(long usbFunctions, boolean forceRestart)
trySetEnabledFunctions(usbFunctions, forceRestart)
setSystemProperty(getPersistProp(true), functions); // 经过一些列的判断之后,通过设置usb的属性来完成功能的设定

使用IUsbGadget时,可以通过AdbManagerInternalImpl来打开和关闭adb service,
其他时候adb的打开和关闭可以通过AdbSettingsObserver来监听setting中的设定。

UsbPortManager:它其实调用的是android.hardware.usb@1.0::IUsb,设定、读取的是usb端口支持的功能(host device source sink)

记录一下Android usb相关的知识学习的更多相关文章

  1. Android 6.0 权限知识学习笔记

    最近在项目上因为6.0运行时权限吃了亏,发现之前对运行时权限的理解不足,决定回炉重造,重新学习一下Android Permission. 进入正题: Android权限 在Android系统中,权限分 ...

  2. android自定义控件(理论知识学习 +自定义属性的讲解)

    View树和UI界面架构图   UI界面架构图: android视图最外层是一个window对象. phoneWindow来实现. phoneWindow将一个decorView作为整个布局的根vie ...

  3. Android View相关知识问答

    Android View相关核心知识问答 Activity Window View之间的三角关系 你真的了解View的坐标吗? 在渲染前获取 View 的宽高 5种手势工具类 浅析Android的窗口

  4. Android Studio相关的坑

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  5. MySQL索引知识学习笔记

    目录 一.索引的概念 二.索引分类 三.索引用法 四 .索引架构简介 五.索引适用的情况 六.索引不适用的情况 继我的上篇博客:Oracle索引知识学习笔记,再记录一篇MySQL的索引知识学习笔记,本 ...

  6. Android开发技术周报183学习记录

    Android开发技术周报183学习记录 教程 Android性能优化来龙去脉总结 记录 一.性能问题常见 内存泄漏.频繁GC.耗电问题.OOM问题. 二.导致性能问题的原因 1.人为在ui线程中做了 ...

  7. Android开发技术周报182学习记录

    Android开发技术周报182学习记录 教程 App安全二三事 记录 为什么要安全 App的移动安全主要包括下面几种: 密钥破解,导致本地加密数据被盗取. 通信密钥破解,导致接口数据被盗取. 伪造接 ...

  8. Android开发技术周报176学习记录

    Android开发技术周报176学习记录 教程 当 OkHttp 遇上 Http 2.0 http://fucknmb.com/2018/04/16/%E5%BD%93OkHttp%E9%81%87% ...

  9. Android USB gadget configfs学习笔记总结

    1.一个config_item 是通过显式用户空间mkdir操作创建的,通过rmdir销毁.属性(文件)在mkdir之后出现,可以通过read和write读取或修改属性文件.与sysfs一样,read ...

  10. linux&android PPP 相关知识

    Linux&Android PPP相关FAQ   目录 Linux&Android PPP相关FAQ.. 1 一.         文档说明... 3 二.         常见调试技 ...

随机推荐

  1. ArkUI开发趣味体验,快来抽取限量HarmonyOS专属头像!

    本次ArkUI开发趣味体验活动,将手把手教大家如何在IDE里实操一个ArkUI程序,通过补充缺失代码,成功运行程序开启抽奖功能,抽取个人专属头像,做HarmonyOS第一批数字藏品家! 同时本期提供的 ...

  2. CentOS7环境saltstack安装配置

    一.安装epel yum源 yum -y install epel-release yum clean all yum makecache 二.安装 saltstack-master 并配置 1.安装 ...

  3. SpringCloud整体架构概览

    什么是SpringCloud #目标 协调任何服务,简化分布式系统开发. #简介 构建分布式系统不应该是复杂的,SpringCloud对常见的分布式系统模式提供了简单易用的编程模型,帮助开发者构建弹性 ...

  4. Hadoop之Hive架构与设计

    Hadoop之Hive架构与设计 Hadoop是一个能够对大量数据进行分布式处理的软件框架.具有可靠.高效.可伸缩的特点. HDFS:全称为Hadoop分布式文件系统(Hadoop Distribut ...

  5. 抓包整理外篇——————https 抓包 [ 五]

    前言 简单介绍一下https 抓包. 正文 可能有人一开始的时候发现抓包都抓不到,原因也很简单,那是因为https 需要解密. 那么为什么https 不解密呢? 那是因为证书信任问题. 下面先介绍,上 ...

  6. 重新整理.net core 计1400篇[五] (.net core 添加mvc 中间件 )

    前言 前面提过.net core web实际上是一个服务和若干个中间件组成. 现在我们有一个服务了,那么可想而知我们要完成mvc这种功能,我们需要的就是一个中间件. 好的,接下来,我们只要添加中间件即 ...

  7. mmcls 多标签模型部署在torch serve

    GitHub仓库:gy-7/mmcls_multi_label_torchserve (github.com) 各个文件说明: cls_requests_demo:分类模型请求api服务的demo d ...

  8. 跨域是什么?Vue项目中你是如何解决跨域的呢?

    一.跨域是什么 跨域本质是浏览器基于同源策略的一种安全手段 同源策略(Sameoriginpolicy),是一种约定,它是浏览器最核心也最基本的安全功能 所谓同源(即指在同一个域)具有以下三个相同点 ...

  9. 【笔记】go语言--切片的操作

    go语言--切片的操作 接上篇切片的概念开始 //Slice添加元素 arr := [...]int{0,1,2,3,4,5,6,7} s1 := arr[2:6] s2 := s1[3:5]//[5 ...

  10. Koordinator 0.6:企业级容器调度系统解决方案,引入 CPU 精细编排、资源预留与全新的重调度框架

    简介: 经过社区多位成员的贡献,Koordinator 0.6 版本正式发布.相较于上一个版本 0.5,新版本进一步完善了 CPU 精细化编排能力,更好的兼容原生用法:支持了资源预留的能力(Reser ...