asysbang
标题:
Android 5.x 添加自定义的service
[打印本页]
作者:
admin
时间:
2016-2-25 11:47
标题:
Android 5.x 添加自定义的service
项目需求,要在android原生系统中添加自己的service
主要修改framework/base 下面
《1》 Android.mk 中添加自己的aidl文件
location/java/com/android/internal/location/ILocationProvider.aidl \
media/java/android/media/IAudioService.aidl \
+ media/java/android/media/IQihooService.aidl \
media/java/android/media/IAudioFocusDispatcher.aidl \
media/java/android/media/IAudioRoutesObserver.aidl \
《2》写自己的aidl
media/java/android/media/IQihooService.aidl
package android.media;
/**
* {@hide}
*/
interface IQihooService {
void qihooTest();
}
《3》写自己的manager和service
media/java/android/media/QihooManager.java
package android.media;
import android.content.Context;
import android.os.IBinder;
import android.os.ServiceManager;
import android.util.Log;
public class QihooManager {
private final Context mContext;
private static IQihooService sService;
/**
* @hide
*/
public QihooManager(Context context) {
mContext = context;
}
private static IQihooService getService()
{
if (sService != null) {
return sService;
}
IBinder b = ServiceManager.getService(Context.QIHOO_SERVICE);
sService = IQihooService.Stub.asInterface(b);
return sService;
}
public void goTest() {
Log.e("=====QihooManager", "===================QihooManager=goTest=");
try{
IQihooService service = getService();
service.qihooTest();
}catch (Exception e){
}
}
}
media/java/android/media/QihooService.java
package android.media;
import android.content.Context;
import android.util.Log;
/**
* The implementation of the volume manager service.
* <p>
*
* @hide
*/
public class QihooService extends IQihooService.Stub {
private final Context mContext;
/** @hide */
public QihooService(Context context) {
mContext = context;
}
public void qihooTest() {
Log.v("==========QihooService", "========================QihooService==qihooTest");
}
}
《4》systemserver中添加自己的service
services/java/com/android/server/SystemServer.java
startOtherServices 函数中 添加
try {
Slog.i(TAG, "Qihoo Service");
Log.e("========1111111=","==========00000000000=");
ServiceManager.addService(Context.QIHOO_SERVICE,
new QihooService(context));
Log.e("========1111111111=","==========111111111=");
} catch (Throwable e) {
reportWtf("starting QihooService====", e);
}
《5》定义自己的service名称变量
core/java/android/content/Context.java 中
public static final String QIHOO_SERVICE = "qihoo";
《6》添加对应的获取service的接口
core/java/android/app/ContextImpl.java中
static {} 模块中
registerService(QIHOO_SERVICE, new ServiceFetcher() {
public Object createService(ContextImpl ctx) {
return new QihooManager(ctx);
}});
PS:5.0之后android加了selinux机制,所以会报错
F/SystemServer( 735): BOOT FAILURE starting QihooService====
F/SystemServer( 735): java.lang.SecurityException
F/SystemServer( 735): at android.os.BinderProxy.transactNative(Native Method)
F/SystemServer( 735): at android.os.BinderProxy.transact(Binder.java:504)
F/SystemServer( 735): at android.os.ServiceManagerProxy.addService(ServiceManagerNative.java:150)
F/SystemServer( 735): at android.os.ServiceManager.addService(ServiceManager.java:72)
F/SystemServer( 735): at com.android.server.SystemServer.startOtherServices(SystemServer.java:992)
F/SystemServer( 735): at com.android.server.SystemServer.run(SystemServer.java:330)
F/SystemServer( 735): at com.android.server.SystemServer.main(SystemServer.java:231)
F/SystemServer( 735): at java.lang.reflect.Method.invoke(Native Method)
解决办法:
在 external/sepolicy/service_contexts 文件中添加service的规则
audio u
bject_r:system_server_service:s0
+qihoo u
bject_r:system_server_service:s0
backup u
bject_r:system_server_service:s0
也可以在device/xx/xx/sepolicy/service_contexts的产品中添加
然后可以用应用中测试
QihooManager qManager = (QihooManager)getSystemService(Context.QIHOO_SERVICE);
qManager.goTest();
目前只是添加了java的service,接下来如何添加native的service方法呢
参考frameworks/base//media/java/android/media/AudioTrack.java
或者 ./services/core/java/com/android/server/power/PowerManagerService.java 里面有一些native开头的函数都是cpp实现的
《1》在上面QihooService.java 中添加native方法
private native final void native_test();
《2》添加对应的cpp文件
framework/base/core/jni/android_media_QihooService.cpp
#define LOG_NDEBUG 0
#define LOG_TAG "QihooService"
#include <jni.h>
#include <JNIHelp.h>
#include <android_runtime/AndroidRuntime.h>
#include <utils/Log.h>
using namespace android;
static void android_media_QihooService_native_test(JNIEnv *env,
jobject thiz) {
ALOGV("=================== android_media_QihooService_native_test");
}
// ----------------------------------------------------------------------------
static JNINativeMethod gMethods[] = {
{ "native_test", "()V", (void *)android_media_QihooService_native_test }
};
int register_android_media_QihooService(JNIEnv *env)
{
ALOGV("=================== register_android_media_QihooService");
return AndroidRuntime::registerNativeMethods(env,
"android/media/QihooService", gMethods, NELEM(gMethods));
}
《3》framework/base/core/jni/AndroidRuntime.cpp
中添加注册
extern int register_android_media_ToneGenerator(JNIEnv *env);
+extern int register_android_media_QihooService(JNIEnv *env);
REG_JNI(register_android_media_ToneGenerator),
+ REG_JNI(register_android_media_QihooService),
PS:如果是参考/PowerManagerService.java
那么cpp文件要放在/frameworks/base/services/core/jni/ 目录下
注册就要在 frameworks/base/services/core/jni/onload.cpp 中添加
OK 以上就是在android系统中添加自己的manager service 以及对应的jni实现
欢迎光临 asysbang (http://asysbang.com/)
Powered by Discuz! X2.5