在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. CentOS-6.5快速搭建HTTP服务器和仅供授权用户登陆的FTP服务器

    CentOS-6.5快速搭建HTTP服务器和仅供授权用户登陆的FTP服务器 (2014-01-09 21:29:31) 转载▼ 标签: linux centos 服务器 http vsftp 分类:& ...

  2. 重新点亮linux 基本软件————防火墙[一]

    前言 简单介绍一下linux的防火墙. 正文 防火墙分类: 软件防火墙和硬件防火墙 包过:过滤防火墙和应用层防火墙 iptables 的表和链 规则表: filter nat mangle raw f ...

  3. 使用WebApi+Vue3从0到1搭建《权限管理系统》:二、搭建JWT系统鉴权

    视频地址:[WebApi+Vue3从0到1搭建<权限管理系统>系列视频:搭建JWT系统鉴权-哔哩哔哩] https://b23.tv/R6cOcDO qq群:801913255 一.在ap ...

  4. 如何实现数据库数据到Abp vnext实体对象的同步?以及代码生成工具

    在采用了EF Core的Code First方式下,如果你在数据库中直接添加了新表或存储过程,你需要在项目代码中手动反向工程这些数据库的更改,以保持Code First的代码与数据库同步.这种情况可以 ...

  5. 【数学】向量点乘、叉乘的理论、应用及代码实现(C++)

    前言 我总结了一下向量点乘,叉乘的概念,以及他们的应用及相关C++代码的实现.blog 这类问题也是技术面试经常碰到的,一次研究透了会有收获. 1 向量 向量具有大小和方向. 共线向量:两个平行的向量 ...

  6. 01_Vue技术-Hello案例分析

    初始vue:       1.想让vue工作,就必须创建一个Vue实例,且要传入一个配置对象:       2.root容器里的代码依然符合html规范,只不过混入了一些特殊的vue语法:       ...

  7. 基于开源PolarDB-X打造中正智能身份认证业务数据基座

    简介: 在10月25日由阿里云开发者社区.PolarDB开源社区.infoQ联合举办的「开源人说」第三期--<数据库PolarDB专场>沙龙上,中正智能科技有限公司平台软件部研发总监韩毅带 ...

  8. 用手机写代码:基于 Serverless 的在线编程能力探索

    ​简介:Serverless 架构的按量付费模式,可以在保证在线编程功能性能的前提下,进一步降低成本.本文将会以阿里云函数计算为例,通过 Serverless 架构实现一个 Python 语言的在线编 ...

  9. dotnet 修复在 Linux 上使用 SkiaSharp 提示找不到 libSkiaSharp 库

    本文告诉大家如何简单修复在 Linux 上使用 SkiaSharp 提示找不到 libSkiaSharp 库 我的应用在 Windows 上跑的好好的,放在 Linux 上一运行就炸掉了,异常内容如下 ...

  10. Ubuntu VNC 远程桌面及常见问题

    一.Ubuntu 远程桌面开启 在ubuntu 设置中打开远程桌面 **注意:如果没有共享桌面选项也不要谎,只需要安装 vino 即可 sudo apt update sudo apt install ...