Android提供瞭用戶級輕量的LOG機制,它的實現貫穿瞭Java,JNI,本地c/c++實現以及LINUX內核驅動等Android的各個層次,而且足夠簡單清晰,是一個相當不錯的解讀案例。本系列文章針對LOG機制的內部實現機理進行解讀,本文是系列的第一篇,解讀LOG機制的實現架構。
LOG的運行環境
下圖是Android官方網站上給出的Android的Debug環境。
Android的LOG機制當然也在這個環境中運行。我們重點關註Emulator和Device上運行的部分,App VMs產生LOG信息,並與ADB Device Daemon交互輸出這些信息,而ADB Device Daemon又通過相應的協議通過USB(Device)或本地連接(Emulator),與PC上運行的ADB Host Daemon交互,通過PC上的調試工具呈現給用戶。JDWP Debugger、DDMS、ADB Host Daemon以及ADB Device Daemon之間的交互與其使用的協議,不在本文討論范圍之內。本文討論的內容運行在Emulator/Device上,產生LOG信息,並通過程序LogCat輸出。
LOG的實現架構
Android中LOG的實現架構如下圖所示,這基本上也是Android的某個模塊實現各個層次的經典架構。
Android應用程序通過Framework提供的機制操作;Java領域需要本地c/c++提供服務的地方,通過JNI實現;JNI調用底層庫;庫函數通過操作映射的設備文件操作設備,LINUX kernel中的Driver完成相應的操作。另外,拋開Java和JNI,LINUX上用戶域的c/c++程序,也可以通過操作設備文件來完成。
Android的LOG也是這樣實現的,並將在本系列文章中分別講述。應用程序通過android.util.Log裡的各種靜態方法,輸出LOG信息[系列之二中具體講述];Log通過JNI接口調用c/c++的實現,而本地實現的寫LOG,也基本就是寫信息到設備文件[系列之三中具體講述];設備文件是Android為瞭LOG機制而寫的LINUX的一個輕量級的驅動logger[系列之四中具體講述];LOG信息的顯示可以是Emulator/Device上運行的LogCat程序[系列之五中具體講述];另外,Android的本地實現庫也可利用現有機制,在c/c++的空間 直接輸出LOG[系列之六中具體講述]。