记录一下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 二. 常见调试技 ...
随机推荐
- HarmonyOS语言基础类库开发指南上线啦!
语言基础类库提供哪些功能?多线程并发如何实现?TaskPool(任务池)和Worker在实现和使用场景上有何不同? 针对开发者关注的并发等语言基础类库的相关能力,我们在新推出的语言基础类库开发指南 ...
- JDK 19新特性 & JDK 多版本安装切换配置
新的JDK 19包含如下7个新的特性: 转自:JDK19中比较重要的新特性-电子发烧友网 JEP 405: Record Patterns(Record模式) JEP 422: Linux/RISC- ...
- Excel 字符串拆分
用 Excel 处理数据时,有时需要对字符串进行拆分.对于比较简单的拆分,使用 Excel 函数可以顺利完成,但碰到一些特殊需求,或者拆分的规则比较复杂时,则很难用 Excel 实现了.这里列出一些拆 ...
- nginx重新整理——————nginx 的网络模型[九]
前言 简单介绍一下nginx的网络模型. 正文 网络拓扑图: 数据流: 网络传输大概是这样传输的. nginx 事件循环: 事件处理过程: 上面两张图什么意思呢? 其实就是说,nginx 是通过事件驱 ...
- Pytorch-卷积神经网络CNN之ResNet的Pytorch代码实现
先说一个小知识,助于理解代码中各个层之间维度是怎么变换的. 卷积函数:一般只用来改变输入数据的维度,例如3维到16维. Conv2d() Conv2d(in_channels:int,out_chan ...
- .Net与AI的强强联合:AntSK知识库项目中Rerank模型的技术突破与实战应用
随着人工智能技术的飞速发展,.Net技术与AI的结合已经成为了一个新的技术热点.今天,我要和大家分享一个令人兴奋的开源项目--AntSK,这是一个基于.net平台构建的开源离线AI知识库项目.在这个项 ...
- HarmonyOS NEXT应用开发之MpChart图表实现案例
介绍 MpChart是一个包含各种类型图表的图表库,主要用于业务数据汇总,例如销售数据走势图,股价走势图等场景中使用,方便开发者快速实现图表UI.本示例主要介绍如何使用三方库MpChart实现柱状图U ...
- 网不好怎么办?TLS握手带宽直降80%,BabaSSL是怎么做到的?| 龙蜥技术
简介:为了保障数据的安全性,客户端会先和服务器进行 TLS 握手,有什么办法可以减少 TLS 握手的带宽消耗呢? 编者按:BabaSSL 是一款开源的密码库产品,在 GitHub 和龙蜥社区开源,并 ...
- KubeVela 上手(1)|让云端应用交付更加丝滑
简介: KubeVela 是阿里云和微软共同发起的 OAM(Open Application Model)标准的技术实现,旨在打造统一.标准.跨环境的云端应用交付,省时省力,轻松简单 作者|KubeV ...
- 360 政企安全集团基于 Flink 的 PB 级数据即席查询实践
简介: Threat Hunting 平台的架构与设计,及以降低 IO 为目标的优化与探索.为什么以及如何使用块索引. 本文整理自 360 政企安全集团的大数据工程师苏军以及刘佳在 Flink For ...