Framework services

系统service

安卓开发的同学都知道,framework中存在各种各样的service来实现管理服务,比如我们熟悉的WindowManagerService/PackageManagerService等,这些service都对app提供了一些接口以便获取系统服务。那么如何在系统中添加一个service并使用呢?常常来讲需要以下几个步骤:

  1. 创建接口
    主要是创建aidl接口定义,假设在framework/base/目录下创建一个mytest目录,书写Makefile如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-java-files-under, java)
LOCAL_MODULE_CLASS := JAVA_LIBRARIES
LOCAL_MODULE := mytest
include $(BUILD_JAVA_LIBRARY)

然后在该目录创建一个java/com/mytest/test, 写一个ITestManager.aidl,内容如下:

package com.mytest.test;

/**
 * {@hide}
 */

interface ITestManager {
    void testMethod();
}

熟悉AIDL的同学都知道,aidl只是定义了接口类,我们还需要创建一个TestService.java去实现这个接口。

  1. 创建Service
    在frameworks/base/services/core/java/com/android/server/文件夹创建一个TestService.java,内容如下:
package com.android.server;

import android.content.Context;
import android.util.Slog;
import com.mytest.test.ITestManager;

public class TestService extends ITestManager.Stub {
    private final Context mContext;

    public TestService(Context context) {
        super();
        mContext = context;
    }
    public void testMethod() {
        Slog.i("service test", "TestService testMethod");
    }
 }
  1. 将接口以及service加入系统
    首先在build/core/pathmap.mk中的FRAMWORKS_BASE_DIRS中加入mytest,加入我们在base目录创建的mytest目录。
    base/目录Anddroid.mk中的LOCAL_SRC_FILES加入mytest/java/com/mytest/test/ITestManager.aidl, packages_to_document中加入com.mytest.test.
    然后在当前系统的device.mk或者base.mk的PRODUCT_PACKAGES中加入mytest。
    代码中有如下更改:
    context中定义
    public static final String TEST_SERVICE= "test";
    SystemServer中添加:
+             TestService test = new TestService(context);      
+             ServiceManager.addService(Context.TEST_SERVICE, test); 
+             Slog.i("add_service_test", "SystemServer add service");

另外,在SystemServiceRegistry中注册service:

+                new CachedServiceFetcher(){  
+            @Override   
+            public TestManager createService(ContextImpl ctx)  
+            {  
+                IBinder b = ServiceManager.getService(Context.TEST_SERVICE);  
+                Log.i("service_test","SystemServiceRegistry registerService method");  
+                return new TestManager(ITestManager.Stub.asInterface(b));  
+            }});  

最后还需要添加selinux权限:
system/sepolicy/service.te中加入
type test_service, system_api_service, system_server_service, service_manager_type;

/external/sepolicy/service_contexts中加入
test u:object_r:test_service:s0

至此,添加一个service的工作就已经完成了,但是编译前需要执行make update-api来更新下api接口。

你可能感兴趣的:(Framework services)