天天看點

添加一個系統服務sytem service

方法一:

1.在應用中

com.xxx.spi.spllistener.java/com.xxx.spi.spimanager.java兩個類

spimanager spimanager = (spimanager) getsystemservice("spiservice");

spilistener = new myspilistener();

spimanager.requestspiupdates(spilistener);

2.

需在android.app.contextimpl.java中添加

private static spimanager sspimanager;

else if (spi_service.equals(name)) {

            return getspimanager();

        }

private spimanager getspimanager() {

        synchronized (ssync) {

            if (sspimanager == null) {

                ibinder b = servicemanager.getservice(spi_service);

                ispimanager service = ispimanager.stub.asinterface(b);

                sspimanager = new spimanager(service);

            }

        return sspimanager;

    }

在android.content.context.java中添加常量

public static final string spi_service = "spiservice";

3.com.xxx.spi.spimanager.java

中有ispilisterner.aidl的實作類listenertransport

private class listenertransport extends ispilistener.stub

listenertransport中有應用中注冊進來的回調監聽器spilistener

listenertransport傳給frameworks/base/services/java/com/android/server/spimanagerrservice.java服

務器類,也就是aidl的回調注冊,一定是實作ispilistener.stub的listenertransport類

spimanagerservice.java是通過jni調c++檔案,其中需要把自己作為c++的回調對象,

在cpp檔案中取得spimanagerservice類對象

static { class_init_native(); }初始化回調的方法,這樣在cpp檔案中就随時可以調class_init_native本地

方法中初始化過的函數。

4.frameworks/base/android.mk檔案中編譯ispilistener.aidl,ispimanager.aidl兩個檔案成相應的java檔案

frameworks/base/services/jni/android.mk檔案中編譯同目錄下的

com_android_server_spimanagerservice.cpp檔案,注意cpp檔案的命名與其對應的spimanagerservice.java

檔案的包路徑之間的關系。

同目錄下的onload.cpp檔案中添加

int register_android_server_spimanagerservice(jnienv* env);

register_android_server_spimanagerservice(env);

5.

frameworks/base/services/java/com/android/server/systemserver.java中添加服務,并調服務的

systemready方法

try {

                slog.i(tag, "---spi manager---");

                spiservice = new spimanagerservice(context);

                servicemanager.addservice("spiservice", spiservice);

            } catch (throwable e) {

                slog.e(tag, "---failure starting spiservice manager---", e);

if (spiservicef != null) spiservicef.systemready();

6.

frameworks/base/core/jni/androidruntime.cpp中添加

extern int register_android_server_spimanagerservice(jnienv* env);

不确定是不是必須的

方法二:

在systemserver.java中添加自己有make檔案建立的包

system.loadlibrary("android_servers");

        system.loadlibrary("serialserver");