android service 添加
来源:互联网 发布:阿里云服务器部署 编辑:程序博客网 时间:2024/05/23 16:16
第二步:android用户空间调用drvier。在android架构中,这个大任当然是hal层当仁不让的。在hal层就要按照hw_module_t的架构去写。代码如下:
static int open_my_driver_device (const struct hw_module_t * module, char const * name, struct hw_device_t ** device){struct mydriver_context_t * dev = (struct mydriver_context_t *)malloc(sizeof(struct mydriver_context_t));memset(dev, 0, sizeof(struct mydriver_context_t));int fd = open("/dev/my_driver", O_RDONLY);if (fd < 0) {LOGE("failed to open my driver device!");return -1;}dev->fd = fd;dev->device.common.tag = HARDWARE_DEVICE_TAG;dev->device.common.version = 0;dev->device.common.module = (struct hw_module *)module;dev->device.common.close = (int (*)(struct hw_device_t*))close_my_driver_device;dev->device.get_acc_state = (int (*)(struct mydriver_device_t *, int *))get_ my_driver _state;*device = (struct hw_device_t *)dev;return 0;}static struct hw_module_methods_t my_driver_module_methods = {.open = open_my_driver_device,};const struct hw_module_t HAL_MODULE_INFO_SYM = {.tag = HARDWARE_MODULE_TAG,.version_major = 1,.version_minor = 0,.id = MY_DRIVER_HARDWARE_MODULE_ID,.name = "edsam my driver Module",.author = "edsam.",.methods = &my_driver_module_methods,};
第三步:可以直接去写JNI了。当然如果不是第二步也能合在这里一起写,但是这样代码架构就没那么完整。 JNI怎么写就去查一下相关文档。JNI代码放置/frameworks/base/services/jni/下:
static jint init_native(JNIEnv * env, jobject clazz) { int err; hw_module_t * module; struct my_driver_device_t * device; device = NULL; err = hw_get_module(MY_DRIVER_HARDWARE_MODULE_ID (hw_module_t const **)&module); if (err == 0) { hw_device_t * hw_device; err = module->methods->open(module, NULL, &hw_device); if (err != 0) { LOGE("module open fail!"); return 0; } else { device = (struct my_driver_device_t *)hw_device; } } return (jint)device; } static jint get_my_driver_status_native (JNIEnv * env, jobject clazz, int ptr) { struct my_driver_device_t * device = (struct my_driver_device_t *)ptr; int state = 0; if (device) { device->get_my_driver_status(device, &state); } return state; } static JNINativeMethod method_table[] = { {"init_native", "()I", (void *)init_native }, {"finalize_native", "(I)V", (void *)finalize_native }, {"get_earphones_status_native", "(I)I", (void *)get_my_driver_status_native }, }; int register_android_server_MyDriverService(JNIEnv * env) { return jniRegisterNativeMethods(env, "com/android/server/MyDriverService", method_table, NELEM(method_table) ); }
第四步:注册service。在/frameworks/base/services/jni/目录下有个onload.cpp的文件添加register_android_server_MyDriverService (env);调用。
第五步:java层添加service代码。在/frameworks/base/services/java/com/android/server/目录下添加。
package com.android.server; import android.os.RemoteException; import com.android.internal.os.IMyDriverService; public class MyDriverService extends IMyDriverService.Stub { private static final String TAG = "MyDriverService"; private static final boolean DEBUG = false; @Override public int getMyDriverState() throws RemoteException { return get_my_driver_status_native (mNativePointer); } public MyDriverService() { mNativePointer = init_native(); } protected void finalize() throws Throwable { finalize_native(mNativePointer); super.finalize(); } private static native int init_native(); private static native void finalize_native(int ptr); private static native int getMyDriverState_native(int ptr); private int mNativePointer; }
第六步:增加AIDL定义。文件放置/frameworks/base/core/java/com/android/internal/os/下,增加IMydriverService.aldl内容如下:
package com.android.internal.os; interface IMyDriverService { int getMyDriverState (); }
上面的aidl文件编译添加到/frameworks/base/Android.mk中定义的LOCAL_SRC_FILES中。
第七步:在systemserver里注册。frameworks/base/services/java/com/android/server/SystemServer.java中的run方法里增加:
mydriverService = newMyDriverService();
ServiceManager.addService(Context.MY_DRIVER_SERVICE, mydriverService);
第八步:产生Manager对象。在/frameworks/base/core/java/android/app/下添加有个MyDriverManager.java,
package android.app; import android.content.Context; import android.os.RemoteException; import android.os.ServiceManager; import android.util.Slog; import com.android.internal.os.IMyDriverService; public class MyDriverManager { private static final String TAG = "MyDriverManager"; private static final boolean DEBUG = false; private IMyDriverService mService = null; public MyDriverManager() { } private synchronized IMyDriverService getService() { if (mService == null) { mService = IMyDriverService.Stub.asInterface( ServiceManager.getService(Context.MY_DRIVER_SERVICE)); if (mService == null) { Slog.w(TAG, "warning : no MyDriverService "); } } return mService; } public int getMyDriverStatus() { try { final IMyDriverService svc = getService(); if (svc != null) { return svc. getMyDriverState(); } else { Slog.e(TAG, "error : IMyDriverService not exist!"); throw new RuntimeException("IMyDriverService not exist!"); } } catch (RemoteException e) { Slog.e(TAG, "error : getEarPhonesStatus remote error!"); throw new RuntimeException(e); } } } }
在/frameworks/base/core/java/android/content/Context中定义MY_DRIVER_SERVICE字符串,在/frameworks/base/core/java/android/app/ContextImpl.java中:
registerService(MY_DRIVER_SERVICE, new ServiceFetcher() { public Object getService(ContextImpl ctx) { return new MY_DRIVER_Manager(); } });
第九步:在编译的时候执行make update-api。就会把新的api加入到api/current.txt文件中去。
最后一步:当然是在需要的地方调用了。
MY_DRIVER_Manager mydriverService = (MY_DRIVER_Manager)getSystemService(Context. MY_DRIVER_Manager); if (mydriverService!= null) { mydriverService. getMyDriverStatus (); } }
通过以上步骤,完整编译一下系统,应该service能正常工作起来了。加一个service还是挺麻烦的,上层的互联关系比较多。
没有高深的理论介绍,只有简单的实践步骤,比较详细的介绍了一个service的来龙去脉,有兴趣就自己动手实践一下,相信会有收获的。Service在开发中用得非常广泛,号称四大组件之一,真的是名不虚传!征服它,驾驭它,为我所用,为做出好的android产品服务!
- android service 添加
- Android添加系统service
- Android添加一个系统service
- android service中添加对话框
- Android Service 的添加流程
- Android添加一个Native Service
- Android添加一个Native Service
- 添加Android Native Service方法
- 添加android service并通过getSystemService调用
- Android--Service中添加 浮动 View
- android 5.1 如何添加一个系统service
- Android Framework添加开机启动Service
- Android系统添加一个自己的service
- Android framwork service添加(manager 远程调service,service jni调native code)
- Android framwork service添加(manager 远程调service,service jni调native code)
- Android系统开发之七:添加Android Native Service方法
- android系统添加service与android层次分析
- android备忘录系列(一)之通过Service添加背景音乐
- Hibernate 开发流程笔记(上)
- TOJ 3294. Building Block 并查集
- Sphinx
- Flask sqlite3.OperationalError: unable to open database file解决方法
- 该工程中的宏被禁止,请参阅联机帮助或主应用程序的文档来决定如何激活宏
- android service 添加
- Uva 375 - Inscribed Circles and Isosceles Triangles
- 面向对象下计算器的编码实现
- 转kidwei 最简单但是却最有用的vtk三维重建代码
- byte[]和InputStream的相互转换
- vc下和gcc的结构体紧凑对齐格式存储【#pragma pack(push,1)、__attribute__ ((packed, aligned(1)))】
- 解开VC++调用.Net DLL的神秘面纱
- visio二次开发---判断文档是否已变化(变化了就加个星号*)
- Java的窗口实例设置小图标