本文首先是一些准備資料,主要來源是度娘,在此感謝原作者。在准備資料了解后,及第三節開始算正式步入正題。
一、手機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,然后開始執行啟動操作。也就說是另起了一個線程,然后開始初始化設備。
好吧,時間太晚,明天繼續。
