11.23 通過一個最小的服務,學習Android系統服務框架

通過一個最小的服務,學習Android系統服務框架

簡介

串口服務,提供系統串口的配置、讀取、管理、打開操作。

服務端

SerialService代碼位於下面的路徑,只有64行。一個數組類型成員變量存儲系統串口名稱,一個構造方法,兩個功能方法和一個native方法。

Frameworks/base/services/core/java/com/android/server/SerialService.java

1. 構造方法

通過一個最小的服務,學習Android系統服務框架

通過一個最小的服務,學習Android系統服務框架

構造方法,從系統的config.xml配置文件讀取系統配置的串口名稱,有些系統是沒有配置的,比如我看的這個系統。

2. 功能方法

通過一個最小的服務,學習Android系統服務框架

此方法供調用,返回系統支持的串口。

首先進行權限檢查,然後逐個檢查構造方法從系統配置文件取得的串口在當前運行的系統上是不是存在,最後返回存在的串口。返回結果是一個字符串數組。

通過一個最小的服務,學習Android系統服務框架

此方法供調用,返回串口文件描述符。

首先進行權限檢查,然後檢查傳入的串口是否在系統配置的串口之中,如果存在就調用native方法打開串口文件,否則,拋出參數異常。

3. native方法

通過一個最小的服務,學習Android系統服務框架

native方法是Java調用C/C++函數的一種定義形式,這個過程用到JNI技術。

以上是串口服務的Java代碼,編譯之後生成到system/framework/service.jar。system_service進程在啟動serialservice的時候,會去這個jar包裡面加載serialservice.class。

4. JNI部分

Framework/base/services/core/jni/com_android_server_SerialService.cpp

通過一個最小的服務,學習Android系統服務框架

SerialService調用native_open()的時候,會調用到這個方法裡面(中間有個映射關係)。很簡單,主要就是調用open()方法打開文件,然後返回文件句柄。

這裡就是JNI的代碼。系統服務的JNI代碼編譯生成/system/lib/libandroid_servers.so。system_server進程在啟動的時候會加載這個動態鏈接庫。

總結一下:服務端的Java代碼和JNI的C++代碼都是運行在系統服務進程system_server裡面。system_server進程啟動的時候會先加載JNI生成的動態鏈接庫libandroid_servers.so,然後從服務的Java代碼生成的services.jar中加載對應服務的class文件,完成服務的啟動。

通過一個最小的服務,學習Android系統服務框架

這段代碼是SystemServer裡面的,是system_server進程啟動SerialService的地方。實例化SerialService後,會調用ServiceManager.addService()方法,添加串口服務到服務管理裡面去,對應名字"serial"。其它進程可以通過ServiceManager.getService("serial"),取得服務實例,進行方法調用。

客戶端

Android SDK裡面有提供API SerialManager,顧名思義串口管理類,供開發者使用。

Frameworks/base/core/java/android/hardware/SerialManager.java

通過一個最小的服務,學習Android系統服務框架

構造方法。構造方法其實我們不用關心,因為Android SDK另外提供一個API進行系統服務實例化,所有的系統服務都可以用這個接口去實例化:

SerialManager serialManager = (SerialManager)content.getSystemService(Context.SERIAL_SERVICE);

現在就可以通過serialManager去調用串口服務提供的方法了,比如取得系統的串口:

String[] serialPorts = serialManager.getSerialPorts();

SerialManager編譯生成到/system/framework/framework.jar,Java世界的第一號進程zygote在啟動的時候會通過配置文件preloaded-classes加載這個jar包裡面的類。

所有的APP進程都是有zygote進程克隆而來,所以這些應用進程裡面都存在串口管理類,開發者的程序就可以調用這些類。

總結

客戶端和服務端是通過binder IPC機制進行通訊,在瞭解或不瞭解binder原理的情況下,只需要記住,XXXManager類必定對應一個XXXService類,這樣在查看Android系統源碼的時候,就不會遇到障礙。(如果遇到障礙了,歡迎評論交流)


分享到:


相關文章: