Android Jelly Beam NFC架构及源码分析之一

2024-03-27 05:50

本文主要是介绍Android Jelly Beam NFC架构及源码分析之一,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文首先是一些准备资料,主要来源是度娘,在此感谢原作者。在准备资料了解后,及第三节开始算正式步入正题。

一、手机NFC架构

目前手机主要是S2C(SigIn-SigOut-Connection)架构,主要是避免NFC标签(即NFC卡)与NFC装置(即NFC读卡机、存取器)两者在感应时,被其他有心人士从中、从旁对传输资料进行拦窃。如下图:

二、Android NFC架构

具体内容参见 http://blog.csdn.net/mutouyueliang/archive/2011/03/08/6232028.aspx

三、NFC Service的启动和初始化

OK,现在开始进入正题。

NFC Service本质上是一个系统APP,和Phone类似。注意在~/packages/app/Nfc/AndroidManifest.xml中设置了android:persistent="true"。所以在AM(ActivityManager)启动后,AM会启动NFC service.这个时候进入NFC service的启动流程。

根据JAVA类实例化的顺序我们知道,首先系统会创建一个NfcServiceHandler, 这个handler在服务完全启动后承担着主要的作用。之后会详细的写。

后面会执行到onCreate函数,这个时候会先实例化TagService,NfcAdapterService,NfcAdapterExService这三个内部类,而这三个类是分别对~/platform/frameworks/base/core/java/android/nfc下面几个aidl的实现。其中NfcAdpaterService会在NfcService启动后注册到ServiceManager里面去,暴露给其他进程一些基本的方法,如启用和禁用NFC设备。

之后实例化NativeNfcManager,这个时候就会载入JNI,然后在JNI这一层里面创建了一个monitor(其实就是几个semaphores, mutex 以及条件变量,这个monitor在后面用处很大,因为android nfc的操作都是异步操作又是多线程,所以为了确保唯一性和顺序性,以及阻塞线程)和一个nfc_jni_native_data这个native_data会存放NativeNfcManager这个的实例。事实上和JNI交互以及在应用层干实事的就是NativeNfcManager。

然后会创建HandoverManager(主要是处理Handover消息,理论上可以处理wifi和bluetooth,实际上目前主要是用来建立蓝牙连接,Android目前P2p传输文件其实就是通过handover建立蓝牙连接,然后通过蓝牙传输数据),NfcDispatcher以及P2pLinkManager。从名字都可以看出来NfcDispather是负责消息的分发,P2pLinkManager是用来处理P2p链接的。这里主要说下P2pLinkManager,它实现了两个接口,分别是Handler.Callback和P2pEventListener.Callback,所以我们可以看到在类的构造函数中,实例化P2pEventManager和Handler的时候会将自身传进去。当然这个Handler和前面的NfcServiceHandler公用一个MessageQueue和一个Looper,只是不知道两个handleMessage是如何处理的(望知情人士讲解下)。此外这一个步骤和前面一个步骤(实例化NativeNfcManager)是可以交换顺序的。

到了这里后会启动安全管理模块、Access control等,内容很简单,同时也不是重点,就略过了。这之后是将NfcAdpater注册到ServiceManager里面,然后是自身注册Receiver,主要用来处理一些系统事件,如锁屏,App安装等。

实事上到了这里我们的操作大部分都还是在应用层,最多到JNI,然而即使到了JNI我们也只是在内存上给两个变量分配了空间而已,并未操作硬件,甚至于我们还不知道这个手机是否安装的有NFC芯片。NFC设备的初始化和真正的启用其实到最后一句 new EnableDisableTask().execute(TASK_BOOT)才开始执行的。

 这一句首先是创建了一个异步Task,然后开始执行启动操作。也就说是另起了一个线程,然后开始初始化设备。

 

好吧,时间太晚,明天继续。

转载于:https://www.cnblogs.com/jecofang/archive/2013/04/17/3023065.html

这篇关于Android Jelly Beam NFC架构及源码分析之一的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/851123

相关文章

Java汇编源码如何查看环境搭建

《Java汇编源码如何查看环境搭建》:本文主要介绍如何在IntelliJIDEA开发环境中搭建字节码和汇编环境,以便更好地进行代码调优和JVM学习,首先,介绍了如何配置IntelliJIDEA以方... 目录一、简介二、在IDEA开发环境中搭建汇编环境2.1 在IDEA中搭建字节码查看环境2.1.1 搭建步

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实

锐捷和腾达哪个好? 两个品牌路由器对比分析

《锐捷和腾达哪个好?两个品牌路由器对比分析》在选择路由器时,Tenda和锐捷都是备受关注的品牌,各自有独特的产品特点和市场定位,选择哪个品牌的路由器更合适,实际上取决于你的具体需求和使用场景,我们从... 在选购路由器时,锐捷和腾达都是市场上备受关注的品牌,但它们的定位和特点却有所不同。锐捷更偏向企业级和专

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

Spring中Bean有关NullPointerException异常的原因分析

《Spring中Bean有关NullPointerException异常的原因分析》在Spring中使用@Autowired注解注入的bean不能在静态上下文中访问,否则会导致NullPointerE... 目录Spring中Bean有关NullPointerException异常的原因问题描述解决方案总结

python中的与时间相关的模块应用场景分析

《python中的与时间相关的模块应用场景分析》本文介绍了Python中与时间相关的几个重要模块:`time`、`datetime`、`calendar`、`timeit`、`pytz`和`dateu... 目录1. time 模块2. datetime 模块3. calendar 模块4. timeit

python-nmap实现python利用nmap进行扫描分析

《python-nmap实现python利用nmap进行扫描分析》Nmap是一个非常用的网络/端口扫描工具,如果想将nmap集成进你的工具里,可以使用python-nmap这个python库,它提供了... 目录前言python-nmap的基本使用PortScanner扫描PortScannerAsync异

Android WebView的加载超时处理方案

《AndroidWebView的加载超时处理方案》在Android开发中,WebView是一个常用的组件,用于在应用中嵌入网页,然而,当网络状况不佳或页面加载过慢时,用户可能会遇到加载超时的问题,本... 目录引言一、WebView加载超时的原因二、加载超时处理方案1. 使用Handler和Timer进行超

Oracle数据库执行计划的查看与分析技巧

《Oracle数据库执行计划的查看与分析技巧》在Oracle数据库中,执行计划能够帮助我们深入了解SQL语句在数据库内部的执行细节,进而优化查询性能、提升系统效率,执行计划是Oracle数据库优化器为... 目录一、什么是执行计划二、查看执行计划的方法(一)使用 EXPLAIN PLAN 命令(二)通过 S

mybatis的整体架构

mybatis的整体架构分为三层: 1.基础支持层 该层包括:数据源模块、事务管理模块、缓存模块、Binding模块、反射模块、类型转换模块、日志模块、资源加载模块、解析器模块 2.核心处理层 该层包括:配置解析、参数映射、SQL解析、SQL执行、结果集映射、插件 3.接口层 该层包括:SqlSession 基础支持层 该层保护mybatis的基础模块,它们为核心处理层提供了良好的支撑。