在上篇转载的博客已经简单介绍了MTP,

下我们我们先看下框架:


一、MTP Android框架


这节是从http://www.fengfly.com/plus/view-214376-1.html转载过来的


Android中MTP的框架如图2-01所示:Android的MTP框架和流程详解_www.fengfly.com

说明

      在Kernel层,USB驱动负责数据交换,而MTP驱动负责和上层进行通信,同时也和USB驱动进行通信。

(01)USB驱动负责数据交换,是指Android设备和PC通过USB数据线连接之后,实际的数据交换是经过USB数据线发送给USB驱动的。

(02)对于"MTP请求"而言,MTP驱动会从USB驱动中解析出的MTP请求数据,然后传递给上层。而对于上层传来的"MTP反馈",MTP驱动也会将反馈内容打包好之后,通过传递给USB驱动。

      在JNI层,MtpServer会不断地监听Kernel的消息"MTP请求",并对相应的消息进行相关处理。同时,MTP的Event事件也是通过MtpServer发送给MTP驱动的。 MtpStorage对应一个"存储单元";例如,SD卡就对应一个MtpStorage。 MtpPacketMtpEventPacket负责对MTP消息进行打包。android_mtp_MtpServer是一个JNI类,它是"JNI层的MtpServer 和 Java层的MtpServer"沟通的桥梁。android_mtp_MtpDatabase也是一个JNI类,JNI层通过它实现了对MtpDatabase(Framework层)的操作。

      在Framework层,MtpServer相当于一个服务器,它通过和底层进行通信从而提供了MTP的相关服务。MtpDatabase充当着数据库的功能,但它本身并没有数据库对数据进行保存,本质上是通过MediaProvider数据库获取所需要的数据。MtpStorage对应一个"存储单元",它和"JNI层的MtpStorage"相对应。

      在Application层,MtpReceiver负责接收广播,接收到广播后会启动/关闭MtpService;例如,MtpReceiver收到"Android设备 和 PC连上"的消息时,会启动MtpService。 MtpService的作用是提供管理MTP的服务,它会启动MtpServer,以及将本地存储内容和MTP的内容同步。 MediaProvider在MTP中的角色,是本地存储内容查找和本地内容同步;例如,本地新增一个文件时,MediaProvider会通知MtpServer从而进行MTP数据同步


二、启动流程


MTP服务启动的触发事件是"PC和Android设备建立MTP连接"。当她们建立MTP连接时,USB驱动将产生USB连接消息,并最终通知UsbManagerUsbManager发出广播,并且广播被MtpReceiver收到;MtpReceiver收到广播后会启动MtpService,同时通知MediaProviderMediaProvider会与MtpService绑定,若Android设备中的文件结构有变化(如"新键文件"),MediaProvider则会通知MtpServiceMtpService启动后会创建MtpDatabase;之后,还会创建MtpServerMtpServer会和MtpDatabase关联。然后,MtpService会遍历本地的存储设备,并建立相应的MtpStorage,并将该MtpStorage添加到MtpDatabaseMtpServer中。最后,MtpService会启动MtpServer


 前面说过MtpService启动后会先后创建MtpDatabase对象和MtpServer对象(Java层),然后启动MtpServer(Java层)。

在创建MtpDatabase对象时,会通过native_setup()调用JNI本地方法。目的是进行初始化,为后面的MtpServer调用做准备。

在创建MtpServer对象(Java层)时,会通过native_setup()调用JNI本地方法。在本地方法中,打开MTP驱动创建的文件节点"/dev/mtp_usb",并会获取MyMtpDatabase对象,然后创建"MtpServer对象(JNI层)"。

在启动MtpServer线程时,会对应的执行MtpServer(JNI层)的run()方法。MtpServer(JNI层)的run()中会不断的从"/dev/mtp_usb"中读取数据,并进行相应的处理。



下面我们再看下代码路径:

packages/providers/MediaProvider/src/com/android/providers/media/MtpReceiver.java  packages/providers/MediaProvider/src/com/android/providers/media/MtpService.java  packages/providers/MediaProvider/src/com/android/providers/media/MediaProvider.java  frameworks/base/media/java/android/mtp/MtpServer.java  frameworks/base/media/java/android/mtp/MtpDatabase.java  frameworks/base/media/java/android/mtp/MtpStorage.java  frameworks/base/media/jni/android_mtp_MtpServer.cpp  frameworks/base/media/jni/android_mtp_MtpDatabase.cpp  frameworks/av/media/mtp/MtpServer.h  frameworks/av/media/mtp/MtpServer.cpp  frameworks/av/media/mtp/MtpDatabase.h 


更多相关文章

  1. Android总Activity的启动模式分为四种
  2. Android内核驱动——电源管理
  3. android 启动默认的邮件客户端,多附件的问题
  4. Android(安卓)应用初始化及窗体事件的分发
  5. Android的Java层系统服务
  6. Android(安卓)启动过程详解
  7. android framework 启动流程
  8. 利用Android(安卓)Studio、MAT对Android进行内存泄漏检测
  9. Android之Goldfish

随机推荐

  1. Android语音识别编程初步
  2. Android 开机动画分析
  3. Android studio添加httpclient的jar包
  4. Android架构分析之使用自定义硬件抽象层(
  5. Android中使用animation的方法
  6. Android详细教程(基础篇):三十三、Android获
  7. Android常用适配器分析(如何制作简易Laun
  8. xamarin之 安装工具介绍
  9. [Android]修改Android Studio项目的运行
  10. 分析ARM ANDROID市场及技术结合点