一:简介
- 添加自定义的系统服务,需要添加以下文件:
- aidl
- manager
- service文件
- 需要修改以下文件:
- /frameworks/base/Android.mk
- Context
- SystemServer
- ContextImpl
二:实例说明
- 在 /framework/base/core/java/android/app/下添加aidl文件:
/frameworks/base/core/java/android/os/IOTTInfoService.aidl
package android.os;
interface IOTTInfoManager {
void setValue(String key, String value);
String getValue(String key);
}
- 在/frameworks/base/core/java/android/app/添加manager文件:
/frameworks/base/core/java/android/app/OTTInfoManager.java
package android.app;
import android.os.IOTTInfoService;
import android.content.Context;
import android.os.RemoteException;
import android.util.Slog;
public class OTTInfoManager {
private Context mContext;
private IOTTInfoService mService;
public OTTInfoManager(Context context, IOTTInfoService service) {
mContext = context;
mService = service;
}
public void setValue(String key, String value) {
if(mService != null) {
mService.setValue(key, value);
}
}
public String getValue(String key) {
// todo
if(mService != null) {
mService.getValue(key);
}
return null;
}
}
- 在/frameworks/base/services/core/java/com/android/server/下添加service文件:
/frameworks/base/services/core/java/com/android/server/OTTInfoService.java
package com.android.server;
import android.os.IOTTInfoManager;
import android.content.Context;
import android.os.Build;
import android.util.Slog;
import java.text.SimpleDateFormat;
import java.util.Date;
public class OTTInfoService extends IOTTInfoService.Stub {
private static final String TAG = OTTInfoService.class.getSimpleName();
private Context mContext;
public OTTInfoService(Context context) {
mContext = context;
Slog.d(TAG, " OTTInfoService create...");
}
@Override
public String getValue(String value) {
// todo
}
@Override
public void setValue(String key, String value) {
// todo
}
}
- 修改/frameworks/base/Android.mk文件,将aidl加到该文件中,这样才可以被编译到,否则编译不过
将core/java/android/os/IOTTInfoService.aidl \加到LOCAL_SRC_FILES后面
- 在/frameworks/base/core/java/android/content/Context.java中添
加service名称定义:
//Context.java
public static final String OTT_INFO_MANAGER = "OTTInfoManager";
- 在/frameworks/base/services/java/com/android/server/SystemServer.java中添加服务
public void initAndLoop() {
xxxxxx.....
try {
ServiceManager.addService(Context.OTT_INFO_MANAGER, new OTTInfoService(context));
} catch (Throwable e) {
Slog.e(TAG, " ServiceManager.addService failed...");
}
}
- 在/frameworks/base/core/java/android/app/ContextImpl.java中注册服务,在静态代码块中添加:
static {
registerService(OTT_INFO_MANAGER, new ServiceFetcher() {
public Object createService(ContextImpl ctx) {
IBinder b = ServiceManager.getService(OTT_INFO_MANAGER);
return new OTTInfoManager(ctx, IOTTInfoService.Stub.asInterface(b));
}
});
}
- 在/frameworks/base目录下执行
mm
命令生成 :framewokr.jar
,framework2.jar
文件 - 在./framewokes/base/service/java目录下执行mm命令生成:
service.jar
文件
10.将 8,9步骤的文件 adb push xxx /system/frameworks/设备的目录下
11.重启设备;
12.将/frameworks/base/core/java/android/app/OTTInfoManager.java文件编译到 jar供第三方应用使用:
- 编译生成OTTInfoManager.jar文件
Android.mk使用方式
在 /frameworks/base/Android.mk文件中增加:
# build OTTInfoManager jar
include $(CLEAR_VARS)
LOCAL_MODULE := OTTInfoManager
LOCAL_MODULE_CLASS := JAVA_LIBRARIES
LOCAL_NO_STANDARD_LIBRARIES := true
LOCAL_JAVA_LIBRARIES := framework core ext
LOCAL_SRC_FILES := core/java/android/app/OTTInfoManager.java
ALL_DEFAULT_INSTALLED_MODULES += $(LOCAL_MODULE)
LOCAL_MODULE_TAGS := optional
include $(BUILD_STATIC_JAVA_LIBRARY)
- 上述相关配置解析
include $(CLEAR_VARS) #引入编译变量
LOCAL_MODULE_TAGS := optional #标识在什么情况下去编译起模块
LOCAL_SRC_FILES := hello.c #源文件(可以指定多个)
LOCAL_MODULE := hello #指示当前编译出来的模块名
LOCAL_MODULE_CLASS := EXECUTABLES #标识了所编译模块最后放置的位置,如果不指定,不会放到系统中,之后放在最后的obj目录下的对应目录中(此处指示放在system/bin下)
include $(BUILD_XXX) #表示编译出来的模块类型,有下面三种:
BUILD_EXECUTABLE:编译成可执行的模块
BUILD_STATIC_LIBRARY:编译成静态库
BUILD_SHARED_LIBRARY:编译成动态库
- 使用方式:
-
在/libs/目录放置DevInfoManager.jar文件
test_ott_devinfomanager.png -
在代码中使用:
-
String ottInfoService = "OTTInfoManager";
OTTInfoManager mrg = (OTTInfoManager) context.getSystemService(ottInfoService);
mrg.setValue("name", "zhangsan");
String name = mrg.getValue("name");
System.out.println(" ott info name : " + name);
网友评论