原创 android usb流程(转载加整理)

2012-10-31 13:41 2351 12 18 分类: MCU/ 嵌入式

原帖地址:http://www.hzlitai.com.cn/article/ARM11/SYSTEM/Android_USB_develop_lx.html 

 
这是关于USB Mass Storage的架构图。
2011年03月02日 - 木板钉钉 - 死亡日志

 

上图关系为:
    StorageManager为Client,MountService是Server,通过AIDL进行进程间通信。
    MountService是一个Android Service,由systemserver启动。
    Volume Daemon(Vold)是一个Native Service,有Init.c读取init.rc后启动。
    MountService和Vold之间通过Socket通信。
    NativeDaemonConnector帮助MountService取得Vold的socket,建立通信。
    Vold通过NetLink读取Kernel的uevent.
    NetLinkManager帮助Vold建立与kernel间的通信
注:对于上图,我准备分以下几个方面阐述:
1. 《AIDL之Jave Framework层实现》
2. 《AIDL之 Native Framework层实现》
3. 《AIDL之Kernel层实现:Binder机制》
4. 《Vold 通信详解》
5. 《Vold Framework层分析》
IPC IPC是一系列面向多线程间数据交换的技术集合。这里所说的多线程间的数据交换,包括进程内线程间的数据交换和进程间的线程数据交换。如果进程运行在不同的PC上,需要网络建立连接完成进程间通信。(这种情况极其复杂)。IPC技术的方法被分为:消息发送同步内存共享远程过程调用(RPC)这几方面功能。(WIKI)个人理解
    IPC:进程间通信,就是在不同进程之间传播或交换信息。进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是共享内存区。但是,系统空间却是“公共场所”,所以内核显然可以提供这样的条件。除此以外,那就是双方都可以访问的外设了。在这个意义上,两个进程当然也可以通过磁盘上的普通文件交换信息,或者通过“注册表”或其它数据库中的某些表项和记录交换信息。广义上这也是进程间通信的手段,但是一般都不把这算作“进程间通信”。(百度百科
 两种解释,WIKI侧重定义;百度百科侧重应用。进程的实体是线程,进程间的通信说到根本就是线程间的通信。这包括以下几个应用场合
l  同一计算机,进程内的多线程通信。(同步、互斥、锁等技术和概念)这点我们一般不做IPC,仅仅按多线程技术处理。
l  同一计算机,进程间的通信。
l  不同计算机,进程间的通信。
 
  RPC:远程过程调用。在计算机科学领域,RPC被认为是IPC的一种。RPC可以在PC内或者通过网络在PC间进行function call。程序员可以将一些核心的API集中到一个程序中,通过RPC,其他需要该核心API的程序可以直接调用,提高代码的共享程度。(WIKI
RPC是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。RPC采用客户机/服务器模式。 请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保 持睡眠状态直到调用信息的到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用过程接收答复信息,获得进程结果,然后调用执行继续进行。(百度百科
Android中的Service大概有如下三种(据我所知):
    Android Application Service在Android AP开发中常常用到的一种概念。从最直白的视角来看,就是剥离了界面的Activity,它们在很多Android的概念方面比较接近,都是封装有一个完整的功能逻辑实现,只不过Service不抛头露脸,只是默默无声的做坚实的后盾。概括说,这一组件是利用Framework中的AIDL,采用拿来主义实现RPC其更详尽的原理请参看《深入Android 【三】-组件入门》
    Native Service在Native Framework这一层中提供支持的一种服务。系统启动阶段解析Init.rc过程中启动Native Service(包括各种用户空间的Daemon),即在Init第一阶段启动。
    Android Service在Java Framework这一层为系统提供支持的一种服务,又称Java Service。由SystemServer启动。即在Init第二阶段启动。
本节中关注是Native service和Android Service。下面介绍他们的启动过程
在system/core/init中init.c读取init.rc等系列配置文件:
2011年03月02日 - 木板钉钉 - 死亡日志

  

启动Native Service:
2011年03月02日 - 木板钉钉 - 死亡日志

 

启动Zygote,Zygote启动sytemserver建立Android service:
 2011年03月02日 - 木板钉钉 - 死亡日志

 

SystemServer启动Android Service:
2011年03月02日 - 木板钉钉 - 死亡日志

 

Android

 

 

所谓Android 中Service架构指的是Android Service、Native Service是如何联系起来,以及如何与底层进行通信。
android中,各种××××Manager为AP提供支持,管理系统的运行。××××Manager充当一个Client,××××ManagerService充当Server为××××Manager提供支持。简单,经典的C/S架构。这里的各种××××ManagerService 就是指Android Service,都在Java Framework空间,且都在systemserver进程中。Native Service通过socket或者直接JNI,Android Service提供支持。Native Service在Native Framework(C/C++空间)中。以上有所元素全部在android用户空间中。
至于Native Service与Kernel的通信主要有Function call、poll、select、NetLink等几种
 
采用Service架构方式是比较标准的做法,即图上蓝色线的部份;红色线的部份为非Service架构式的做法。Service在Android框架里的角色是「存取底层硬件」,往上层的话,可以和应用程序沟通。因此,采用标准的Service做法,好处是在数据存取(data communication)的处理较为系统化。这方面,Android提供了标准的处理架构。图上的「core libraries」即是Service程序代码的实现,也就是,Android应用程序透过JNI(Dalvik)来到Service这一层,再透过Service加载*.so文件;而非标准做法则是让应用程序直接透过JNI来加载*.so文件。
红色的过程,因为不使用Service架构,因此「框架整合」的工作量比较小,甚致大部份的实现都不需要改动框架本身。这样的做法,就有点像是「跳过framework」的方式;相对的,此时应用程序开发者需要考虑的设计议题就比较多。
未来的Android发展趋势,应会以第二种做法为主,即Manager API直接与Native Service沟通,以达到更好的效能表现。
Android AIDL通常每个应用程序都在它自己的进程内运行,但有时需要在进程间传递对象,你可以通过应用程序UI的方式写个运行在一个不同的进程中的service。在Android平台中,一个进程通常不能访问其他进程中的内存区域。所以,他们需要把对象拆分成操作系统能理解的简单形式,以便伪装成对象跨越边界访问。编写这种伪装代码相当的枯燥乏味,好在我们提供了AIDL工具可以来做这件事。
AIDL(Android接口描述语言)是一个IDL语言,它可以生成一段代码,使在一个Android设备上运行的两个进程使用内部通信进程进行交互。如果你需要在一个进程中(例如:在一个Activity中)访问另一个进程中(例如:一个Service)某个对象的方法,你就可以使用AIDL来生成这样的代码来伪装传递各种参数。
AIDL IPC的机制是基于接口的,和COM或Corba类似,但它是轻量级的。它使用代理类在客户端和实现层间传递值。
AIDLAndroid USB Mass Storage  
2011年03月02日 - 木板钉钉 - 死亡日志

 

打个比方,你到自动取款机上去取款;你就是客户,取款机就是你的代理;你不会在乎钱具体放在那里,你只想看到足够或更多的钱从出口出来(这就是com的透明性)。你同银行之间的操作完全是取款机代理实现。你的取款请求通过取款机,传到另一头,银行的服务器,他也没有必要知道你在哪儿取钱,他所关心的是你的身份,和你取款多少。当他确认你的权限,就进行相应的操作,返回操作结果给取款机,取款机根据服务器返回结果,从保险柜里取出相应数量的钱给你。你取出卡后,操作完成。取款机不是直接同服务器连接的,他们之间还有一个“存根”,取款机与存根通信,服务器与存根通信。从某种意义上说存根就是服务器的代理。(
AIDLFramework层的架构,如下图:
2011年03月02日 - 木板钉钉 - 死亡日志

 

换而言之,Android就是在传统的C/S架构中加入了一层,实现IPC。图中表明,AIDL类似COM的Proxy/Stub架构。不过是现在android自己的序列化类Pacel。
PARTNER CONTENT

文章评论6条评论)

登录后参与讨论

zwxu2010_764023650 2015-5-21 14:44

蓝牙4.0的应用会越来越广泛。

用户1634838 2013-10-31 13:55

欢迎洽谈、合作~~

用户1653723 2013-8-9 15:35

大家一起学习啊~~

用户1658524 2013-5-14 14:38

祝贺立宇泰视频指纹车载驾培终端产品,一次性通过“国家电子计算机外部设备质量监督检验中心”权威部门的检测,测试项目包括:性能检验、环境适应性检验、可靠性检验、电磁兼容性检验、安全检验。 http://www.hzlitai.com.cn/news/1855.html

用户1658524 2013-5-8 15:36

祝贺立宇泰视频指纹车载驾培终端产品,一次性通过“国家电子计算机外部设备质量监督检验中心”权威部门的检测,测试项目包括:性能检验、环境适应性检验、可靠性检验、电磁兼容性检验、安全检验。 http://www.hzlitai.com.cn/news/1855.html

用户1658524 2013-3-29 11:40

适合驾培、驾考、物流管理系统的车载一体机终端设备形成系列化 立宇泰推出的车载一代(型号)、车载二代(型号)目前已经大批量使用在各大城市的驾培终端升级中,在实际使用场合考验下,工作稳定、可靠,受到用户的好评。车载一代:ARM9处理器+WINCE5.0操作系统,480x272像素4.3寸液晶屏,电阻式触摸屏,支持GPS定位,2G/3G拨号,RFID(TypeA/B)卡的读写,指纹采集(上层实现算法),支持1路串口摄像头,内置2~4GTF存储卡,支持音频播放。车载二代:ARM Cotex-A8处理器+Android2.3操作系统,800x480像素7寸液晶屏,电容式触摸屏,支持GPS定位,2G/3G拨号,RFID(TypeA/B)卡读写,接触式IC卡读写,指纹采集模块(已经实现算法),支持2路模拟摄像头(支持拍照、录像),内置8GTF存储卡,提供外置TF卡接口(最大),支持录音、放音,具备陀螺仪和加速度传感器。 通过与软件方案商、集成商的合作,实现了全新的驾培管理软、硬件体系,促进各大城市的驾培管理变得更加成熟、规范、公平、公正。 http://www.hzlitai.com.cn/product/Tablet-PC/1840.html

用户1658524 2012-11-12 10:23

分享了
相关推荐阅读
用户1634838 2013-11-14 15:05
S3C2440A处理器中文数据手册下载
  较为完整的S3C2440A处理器中文手册压缩包,请点击下载:   s3c2440中文数据手册.rar...
用户1634838 2013-09-06 10:48
常见视频文件的编码方式和封装格式
本文转自:http://www.hzlitai.com.cn/article/ARM11/CPhelp/1802.html   常见的AVI、RMVB、MKV、ASF、WMV、MP4、3G...
用户1634838 2012-09-26 11:12
Android开发环境搭建(v1.2)
本文转自:http://www.hzlitai.com.cn/article/ARM11/example/android.html  第一章 windows 下搭建过程 一.安装 JDK(...
用户1634838 2012-09-18 13:45
Android HAL 开发 (5)
上一章介绍了直接调用Service来操作硬件的方法,如果我们再优化一下结构,通过一个Manager来调用这个Service的方法,可能会更好。这样Service就可以跑在后台,由于这时候servi...
用户1634838 2012-09-14 11:46
Android HAL 开发 (4)
在上一篇文章中,我们看到了如果在java程序中调用C/C++撰写的函数。而且Android的service已经实现了,下面就要看看应用程序如何调用这个service了,这里用两种方法,我们先介绍简...
EE直播间
更多
我要评论
6
12
关闭 站长推荐上一条 /3 下一条