asysbang

 找回密码
 立即注册
查看: 8116|回复: 0
打印 上一主题 下一主题

Android 5.x 添加自定义的service

[复制链接]

513

主题

2

好友

6404

积分

管理员

Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80

最佳新人 活跃会员 热心会员 推广达人 宣传达人 灌水之王 突出贡献 优秀版主 荣誉管理 论坛元老

跳转到指定楼层
楼主
发表于 2016-2-25 11:47:04 |只看该作者 |正序浏览
项目需求,要在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                                     ubject_r:system_server_service:s0
+qihoo                                     ubject_r:system_server_service:s0
backup                                    ubject_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实现





回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

Archiver|手机版|aSys-帮 ( 京ICP备13033689号 )

GMT+8, 2024-10-5 16:20 , Processed in 0.073177 second(s), 26 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部