系统service
安卓开发的同学都知道,framework中存在各种各样的service来实现管理服务,比如我们熟悉的WindowManagerService/PackageManagerService等,这些service都对app提供了一些接口以便获取系统服务。那么如何在系统中添加一个service并使用呢?常常来讲需要以下几个步骤:
- 创建接口
主要是创建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去实现这个接口。
- 创建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");
}
}
- 将接口以及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<TestManager>(){
+ @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接口。