在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. 家庭实验室系列文章-如何迁移树莓派系统到更大的 SD 卡?

    前言 其实这个专题很久很久之前就想写了,但是一直因为各种原因拖着没动笔. 因为没有资格,也没有钱在一线城市买房 (); 但是在要结婚之前,婚房又是刚需. 我和太太最终一起在一线城市周边的某二线城市买了 ...

  2. 外屏和宽屏浪费了?HarmonyOS折叠屏设计规范教你用起来

    原文:https://mp.weixin.qq.com/s/7_mdRom7sCA3Z65ih6W3xw,点击链接查看更多技术内容. 这几年折叠屏手机很火,我们针对使用HarmonyOS的折叠屏手机提 ...

  3. Linux之bond和team

    一.bond 和 team 区别 bond只能是双网卡绑定,team不需要手动加载相应内核模块和有更强的拓展性,最高可以绑定8块网卡. 二.模式 bond模式 (1)mode=0(balance-rr ...

  4. UML 哲学之道——启航篇[一]

    前言 简单去介绍一下uml的哲学之道也是自我整理之道. 正文 什么是uml,全程是统一建模语言(unified modeling language),简单的说就是用图形来表示文档. 是描述构造和文档化 ...

  5. centos 虚拟机修改mac和ip地址

    前言 因为网上过于零散,故而整理.在此我用的是vm虚拟机. 正文 在我们安装好vm虚拟机后,我们会获得两个虚拟网卡. 那么我们获得两个虚拟网卡后,这两个网卡到底是什么呢?那么我们打开vm的虚拟网络编辑 ...

  6. 常用注解使用总结系列: @Order 注解

    @Order 注解 @Order注解主要用来控制配置类的加载顺序示例代码: package com.runlion.tms.admin.constant; public class AService ...

  7. 5款开源、美观、强大的WPF UI组件库

    前言 经常看到有小伙伴在DotNetGuide技术社区交流群里提问:WPF有什么好用或者好看的UI组件库?,今天大姚给大家分享5款开源.美观.强大.简单易用的WPF UI组件库. WPF介绍 WPF ...

  8. 阿里 & 蚂蚁自研 IDE 研发框架 OpenSumi 正式开源

    ​简介:经历近 3 年时间,在阿里集团及蚂蚁集团共建小组的努力下,OpenSumi 作为国内首个强定制性.高性能,兼容 VS Code 插件体系的 IDE 研发框架,今天正式对外开源. ​ 作者 | ...

  9. 2019-9-19-dotnet-找不到-PostAsJsonAsync-方法

    title author date CreateTime categories dotnet 找不到 PostAsJsonAsync 方法 lindexi 2019-09-19 14:53:58 +0 ...

  10. 11个Python循环技巧

    本文分享自华为云社区<Python中的循环技巧指南>,作者:柠檬味拥抱. 当我们处理数据时,有时候需要创建多个列表以存储不同类型或不同条件下的数据.在Python中,我们可以利用循环来快速 ...