在android framework中添加自定義系統服務

  • 添加系統服務需要添加aidl,service,manager文件,需要修改SystemServer,Context,ContextImpl
  • 下面舉例進行說明,主要添加一個服務,用於獲取系統時間和版本號


1.在frameworks/base/core/java/android/app/下添加aidl文件

frameworks/base/core/java/android/app/ISystemStatusManager.aidl
package android.app;

interface ISystemStatusManager
{
    String[] getSystemStatus();
}


2.修改frameworks/base/Android.mk文件,將aidl加到該文件中,這樣纔可以被編譯到,否則編譯不過

將core/java/android/app/ISystemStatusManager.aidl \加到LOCAL_SRC_FILES後面


3.在frameworks/base/services/core/java/com/android/server/下添加service文件

frameworks/base/services/core/java/com/android/server/SystemStatusManagerService.java
package com.android.server;

import android.app.ISystemStatusManager;
import android.content.Context;
import android.os.Build;
import android.util.Slog;

import java.text.SimpleDateFormat;
import java.util.Date;

public class SystemStatusManagerService extends ISystemStatusManager.Stub {
    private Context mContext;

    public SystemStatusManagerService(Context context) {
        mContext = context;

        Slog.d("SystemStatus", "Date:" + getDateTime() + "\nVersion:" + getVersion());
    }

    @Override
    public String[] getSystemStatus() {
        String[] infos = new String[2];

        infos[0] = "Date:" + getDateTime();
        infos[1] = "Version:" + getVersion();

        return infos;
    }

    private String getDateTime() {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-DD-mm HH:mm:s");
        Date date = new Date(System.currentTimeMillis());

        return format.format(date);
    }

    private String getVersion() {
        return Build.DISPLAY;
    }
}


4.在frameworks/base/core/java/android/app/下添加manager

frameworks/base/core/java/android/app/SystemStatusManager.java
package android.app;

import android.content.Context;
import android.os.RemoteException;
import android.util.Slog;

public class SystemStatusManager {
    Context mContext;
    ISystemStatusManager mService;

    public SystemStatusManager(Context context, ISystemStatusManager service) {
        mContext = context;
        mService = service;
    }

    public String[] getSystemStatus() {
        if (mService != null) {
            try {
                return mService.getSystemStatus();
            } catch (RemoteException e) {
                Slog.e("SystemStatus", "RemoteException " + e);
                return null;
            }
        }

        return null;
    }
}

5.在frameworks/base/core/java/android/content/Context.java中添加service名稱定義

public static final String SYSTEM_STATUS_SERVICE = "system_status_service";


6.在frameworks/base/services/java/com/android/server/SystemServer.java中添加服務

  • 在startOtherServices()方法中添加如下代碼
try {
    ServiceManager.addService(Context.SYSTEM_STATUS_SERVICE, new SystemStatusManagerService(context));
} catch (Throwable e) {
    Slog.e(TAG, "Failure starting System Status Service ", e);
}


7.在frameworks/base/core/java/android/app/ContextImpl.java中註冊服務

  • 在static {}中添加如下代碼
registerService(SYSTEM_STATUS_SERVICE, new ServiceFetcher() {
    public Object createService(ContextImpl ctx) {
        IBinder b = ServiceManager.getService(SYSTEM_STATUS_SERVICE);
        return new SystemStatusManager(ctx, ISystemStatusManager.Stub.asInterface(b));
    }
});


8.編譯framework.jar和services.jar,push到手機,重啓手機

  • 重啓手機後就會輸出如下log:
D/SystemStatus(  910): Date:2017-01-00 00:00:13
D/SystemStatus(  910): Version:xxx


9.如果系統app需要使用該service,可以通過如下方式調用

SystemStatusManager mManager = (SystemStatusManager) getSystemService(Context.SYSTEM_STATUS_SERVICE);
try {
    String[] infos = mManager.getSystemStatus();
    Log.i("SystemStatus", "SystemStatus Date:" + infos[0] + "\nVersion:" + infos[1]);
} catch (Exception e) {
    e.printStackTrace();
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章