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

相关文章

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

Linux中的HTTPS协议原理分析

《Linux中的HTTPS协议原理分析》文章解释了HTTPS的必要性:HTTP明文传输易被篡改和劫持,HTTPS通过非对称加密协商对称密钥、CA证书认证和混合加密机制,有效防范中间人攻击,保障通信安全... 目录一、什么是加密和解密?二、为什么需要加密?三、常见的加密方式3.1 对称加密3.2非对称加密四、

MySQL中读写分离方案对比分析与选型建议

《MySQL中读写分离方案对比分析与选型建议》MySQL读写分离是提升数据库可用性和性能的常见手段,本文将围绕现实生产环境中常见的几种读写分离模式进行系统对比,希望对大家有所帮助... 目录一、问题背景介绍二、多种解决方案对比2.1 原生mysql主从复制2.2 Proxy层中间件:ProxySQL2.3

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl

python panda库从基础到高级操作分析

《pythonpanda库从基础到高级操作分析》本文介绍了Pandas库的核心功能,包括处理结构化数据的Series和DataFrame数据结构,数据读取、清洗、分组聚合、合并、时间序列分析及大数据... 目录1. Pandas 概述2. 基本操作:数据读取与查看3. 索引操作:精准定位数据4. Group

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

MySQL 内存使用率常用分析语句

《MySQL内存使用率常用分析语句》用户整理了MySQL内存占用过高的分析方法,涵盖操作系统层确认及数据库层bufferpool、内存模块差值、线程状态、performance_schema性能数据... 目录一、 OS层二、 DB层1. 全局情况2. 内存占js用详情最近连续遇到mysql内存占用过高导致

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499