记录一下Android usb相关的知识学习
在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相关的知识学习的更多相关文章
- Android 6.0 权限知识学习笔记
最近在项目上因为6.0运行时权限吃了亏,发现之前对运行时权限的理解不足,决定回炉重造,重新学习一下Android Permission. 进入正题: Android权限 在Android系统中,权限分 ...
- android自定义控件(理论知识学习 +自定义属性的讲解)
View树和UI界面架构图 UI界面架构图: android视图最外层是一个window对象. phoneWindow来实现. phoneWindow将一个decorView作为整个布局的根vie ...
- Android View相关知识问答
Android View相关核心知识问答 Activity Window View之间的三角关系 你真的了解View的坐标吗? 在渲染前获取 View 的宽高 5种手势工具类 浅析Android的窗口
- Android Studio相关的坑
html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...
- MySQL索引知识学习笔记
目录 一.索引的概念 二.索引分类 三.索引用法 四 .索引架构简介 五.索引适用的情况 六.索引不适用的情况 继我的上篇博客:Oracle索引知识学习笔记,再记录一篇MySQL的索引知识学习笔记,本 ...
- Android开发技术周报183学习记录
Android开发技术周报183学习记录 教程 Android性能优化来龙去脉总结 记录 一.性能问题常见 内存泄漏.频繁GC.耗电问题.OOM问题. 二.导致性能问题的原因 1.人为在ui线程中做了 ...
- Android开发技术周报182学习记录
Android开发技术周报182学习记录 教程 App安全二三事 记录 为什么要安全 App的移动安全主要包括下面几种: 密钥破解,导致本地加密数据被盗取. 通信密钥破解,导致接口数据被盗取. 伪造接 ...
- Android开发技术周报176学习记录
Android开发技术周报176学习记录 教程 当 OkHttp 遇上 Http 2.0 http://fucknmb.com/2018/04/16/%E5%BD%93OkHttp%E9%81%87% ...
- Android USB gadget configfs学习笔记总结
1.一个config_item 是通过显式用户空间mkdir操作创建的,通过rmdir销毁.属性(文件)在mkdir之后出现,可以通过read和write读取或修改属性文件.与sysfs一样,read ...
- linux&android PPP 相关知识
Linux&Android PPP相关FAQ 目录 Linux&Android PPP相关FAQ.. 1 一. 文档说明... 3 二. 常见调试技 ...
随机推荐
- js es6 标签模板还原字符串
前言 模板字符串的功能,它可以紧跟在一个函数名后面,该函数将被调用来处理这个模板字符串.这被称为"标签模板"功能(tagged template). 举个栗子: function ...
- MMDeploy部署实战系列【第四章】:onnx,tensorrt模型推理
MMDeploy部署实战系列[第四章]:onnx,tensorrt模型推理 这个系列是一个随笔,是我走过的一些路,有些地方可能不太完善.如果有那个地方没看懂,评论区问就可以,我给补充. 目录: 0️⃣ ...
- 《Effective C#》系列之(六)——提高多线程的性能
一.综述 <Effective C#>中提高多线程性能的方法主要有以下几点: 避免锁竞争:锁的使用会导致线程阻塞,从而影响程序的性能.为了避免锁竞争,可以采用无锁编程技术,如CAS(Com ...
- 《Effective C#》系列之(一)——异常处理与资源管理
请注意,<Effective C#>中的异常处理与资源管理部分实际上是第四章的内容.以下是关于该章节的详细解释. 第四章:异常处理与资源管理 一. 了解异常处理机制 异常处理机制使程序员能 ...
- 力扣191(java)-位1的个数(简单)
题目: 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量). 提示: 请注意,在某些语言(如 Java)中,没有无符号整数类型. ...
- Apsara Stack 技术百科 | 联结良性生态,筑千行百业的数字基石
简介:作为现今IT领域最重要的课题:基础设施云化,离不开与伙伴的携手合作,如何让云上解决方案能充分释放价值的同时形成一个相互依存的自循环生态系统,混合云君来跟你聊聊! 生态系统这个词在维基百科上 ...
- 阿里云PolarDB开源数据库社区与 Tapdata 联合共建开放数据技术生态
简介:近日,阿里云PolarDB开源数据库社区宣布将与 Tapdata 联合共建开放数据技术生态. 近日,阿里云PolarDB开源数据库社区宣布将与 Tapdata 联合共建开放数据技术生态.在此之 ...
- 参与 Apache 顶级开源项目的 N 种方式,Apache Dubbo Samples SIG 成立!
简介: 一说到参与开源项目贡献,一般大家的反应都是代码级别的贡献,总觉得我的代码被社区合并了,我才算一个贡献者,这是一个常见的错误认知.其实,在一个开源社区中有非常多的角色是 non-code con ...
- 🎊这个 OpenTiny 开源项目的 CLI 可太牛了,两行命令创建一个美观大气的 Vue Admin 后台管理系统,有手就会,连我的设计师朋友都学会啦啦
大家好,我是 Kagol,OpenTiny 开源社区运营,TinyVue 跨端.跨框架组件库核心贡献者,专注于前端组件库建设和开源社区运营. 近期尝试了下 OpenTiny 的 CLI 工具,不得不说 ...
- WPF 解决 Skia 因为找不到字体而绘制不出中文字符
在 WPF 使用 Skia 做渲染工具,如果绘制的中文都是方块,也许是字体的问题.字体的问题是 Skia 没有找到字体,本文告诉大家如何修复 在 Skia 使用特定字体,可以使用 SkiaSharp ...