这确实是一个讨论话题,但我认为对于Android NFC开发人员来说仍然相关。因此,在这里提供我的经验报告:
我是否可以期望同样的APDU帧在不同的Android设备和版本中发送时响应相同?
是的,但仅适用于符合ISO/IEC 7816-4要求的APDU命令,并附加了一些限制(例如,并非所有设备都支持扩展长度的APDU,某些设备似乎存在case-1 APDU问题)。
此外,在Broadcom NFC堆栈的最新版本中存在一些已知的错误(请参见下文)。
作为测试,应至少测试哪些Android版本和设备,以便覆盖得比较充分?
到目前为止,我遇到的大部分问题都与具有Broadcom NFC芯片组的三星设备有关。虽然不涉及APDU,但当涉及使用MIFARE Classic时,它们与其他具有Broadcom芯片组的设备表现差异很大。例如,S4会在系统级别上阻塞MIFARE Classic标签,因此不允许读取标签(N)UID。(使用Broadcom芯片组无法从MF Classic读取数据...)
因此,关于测试,我建议每个NFC控制器至少使用一个Nexus设备(即一个具有NXP芯片组和一个具有Broadcom芯片组),以及同样适用于一个或两个其他手机制造商。 (对于三星,具有NXP芯片组的设备在读卡器/写入器模式体验方面与Nexus设备非常相似,因此我认为可以将Nexus S / Galaxy Nexus等与S3看作是等效的。)
关于Android平台,我建议使用您拥有最多用户的平台。(并且还要使用卸载率高的平台。)
Android驱动程序中是否常见存在错误或退化,或者我可以期望这些问题早就已经被根除了?
如我之前所说,Broadcom NFC堆栈存在一些已知问题。特别是涉及MIFARE DESFire时,存在已知问题,即NFC堆栈在将其传递给应用程序后向卡发送任意基于APDU的命令。因此,这些命令可能会干扰卡与该应用程序之间正在进行的通信(例如,强制使用基于APDU的通信模式而不是本地命令模式,更改应用程序/文件选择等)。有关详细信息,请参见此
错误报告和此
stackoverflow问题。
并查看
错误跟踪器,肯定存在更多未解决的问题。
- 您建议支持的Android最早版本是多少,以避免太多麻烦?
关于基于APDU(与DESFire或其他卡片)的通信,API 10(Android 2.3.3)及更高版本可以正常工作。当涉及到NFC API的可用性(除了简单的APDU交换)和应用程序设计时,我会坚持使用Android 4.0.3及更高版本。但请记住,最新平台特别是Android 4.3和Android 4.4引入了许多奇怪的行为/错误/(“功能”?)。
为了了解具有NFC设备的用户当前拥有哪些Android版本,我将分享NFC TagInfo的当前设备安装分布情况(尽管这可能略带偏见,因为NFC TagInfo不适用于普通用户):
- Android 4.1:36%
- Android 4.3:21%
- Android 4.2:19%
- Android 4.4:18%
- Android 4.0.3-4.0.4:4%
- Android 2.3.3-2.3.7:2%
- Android 4.0-4.0.2:0%
- Android 3.2:0%