本文首先是一些準備資料,主要來源是度娘,在此感謝原作者。在準備資料瞭解後,及第三節開始算正式步入正題。
一、手機NFC架構
目前手機主要是S2C(SigIn-SigOut-Connection)架構,主要是避免NFC標籤(即NFC卡)與NFC裝置(即NFC讀卡機、存取器)兩者在感應時,被其他有心人士從中、從旁對傳輸資料進行攔竊。如:
二、Android NFC架構
三、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,然後開始執行啟動操作。也就說是另起了一個線程,然後開始初始化裝置。