如何将系统服务添加到Android框架

15
我想添加自己的框架代码,运行在Android的"system_server"(负责所有系统级服务)中。我的服务会加载一个JNI库,用于与我添加到内核中的驱动程序通信。该服务旨在允许应用程序向其注册侦听器以从驱动程序获取更新。我找到了一篇非常好的博客文章(http://www.androidenea.com/2009/12/adding-system-server-to-android.html),解释了如何添加系统服务,但我无法完全使其工作。
首先,文章提到应该使用“适当的”Android.mk文件来编写客户端/测试应用程序,但没有给出示例。当我尝试构建它时,我得到了构建错误,表明找不到我添加的服务。有人可以给出这可能是什么样子的例子吗?
此外,我想在供应商目录(或froyo中的设备目录)中实现这个功能,而不是在Android开源代码中。这篇博客文章提到这个的正确位置是供应商目录,但没有给出这应该是什么样子的例子。有人知道吗?
关于在Android中实现自己的系统服务的任何其他信息都将有所帮助。再次强调,我的具体工作流程是:
Android应用程序->系统服务->JNI(本地)库->设备驱动程序
4个回答

15

德州仪器提供了一个很好的例子:

http://processors.wiki.ti.com/index.php/Android-Adding_SystemService

此外,CyanogenMod SystemServer.java也有代码可以根据在config.xml中定义的“config_vendorServices”数组来动态加载系统服务(请参见core / res / res / values / config.xml),我相信可以使用覆盖在供应商或设备目录中。这是CyanogenMod特有的添加,添加在此提交中:

https://github.com/CyanogenMod/android_frameworks_base/commit/88fff90131f54d45dc496c45127ac1d16ad257df


谢谢您的发布。我不知道TI已经发布了这个文档。我还没有仔细研究过,但是由于它似乎提供了一些有用的信息,我现在会接受您的答案。 - ashughes
2
如果有其他人到这里来,那么请注意,vendorServices功能在几年前升级到ICS时已经从CyanogenMod中删除了。 - bmaupin

3

有多种方法(或者说有6种方法,为了明确)可以添加系统服务。

你尝试的方法(Android应用程序 -> 系统服务 -> JNI(本地)库 -> 设备驱动程序)是其中之一。你可能想查看这篇文章,了解有关系统服务实现模式的深入解释。

enter image description here


2
请按照以下步骤编写你自己的Android框架系统服务:
  1. 通过继承存根来编写你自己的服务/管理器,并公开API。
  2. 为你的服务创建一个aidl文件以进行公开并包含在构建中。
  3. 将你的服务添加到系统服务器中,你的服务将随所有核心服务一起启动。
  4. 在上下文impl文件中注册你的服务上下文。
  5. 通过调用getSystemService(Context of your service)在应用程序中使用你的服务。
注意:如果你的服务发生严重异常,设备将软重启,因为你的服务正在系统服务下运行。

0
这是一个Android.mk的示例,用于编译位于system/extras/JNITest目录下的JNItest.c文件。Android.mk文件也位于system/extras/JNITest目录中。
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_SRC_FILES:= JNITest1.c

LOCAL_MODULE:= JNITest

#LOCAL_FORCE_STATIC_EXECUTABLE := true

#LOCAL_STATIC_LIBRARIES := libc
LOCAL_SHARED_LIBRARIES := libc

#LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
LOCAL_MODULE_TAGS := eng

include $(BUILD_EXECUTABLE)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接