如何将系统服务添加到Android Framework

时间:2010-07-12 22:17:24

标签: android java-native-interface android-source

我想添加自己在Android“system_server”中运行的框架代码(处理所有系统级服务)。我的服务加载了一个JNI库,该库与我添加到内核的驱动程序进行通信。该服务旨在允许应用程序向其注册侦听器以从驱动程序获取更新。我发现了一篇非常好的博客文章(http://www.androidenea.com/2009/12/adding-system-server-to-android.html),解释了如何添加系统服务,但我无法完全发挥作用。

首先,帖子提到应该使用“适当的”Android.mk文件来编写客户端/测试应用程序,但是没有举例说明。当我尝试构建它时,我遇到构建错误,说它无法找到我添加的服务。有人可以举例说明这可能是什么样的吗?

另外,我想在供应商目录(或froyo中的设备目录)中实现此功能,而不是在Android开源代码中实现。博客文章提到适当的地方是供应商目录,但没有举例说明这应该是什么样子。有人知道吗?

有关在Android中实施您自己的系统服务的任何其他信息都会有所帮助。我的具体工作流程再次是:

Android应用 - >系统服务 - > JNI(本机)库 - >设备驱动程序

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

按照以下步骤在android框架中编写自己的系统服务。

  1. 使用继承存根的API公开自己的服务/经理。
  2. 为您的服务创建一个aidl文件以公开&包括在构建中。
  3. 在System Server中添加您的服务,您的服务将与所有核心服务一起启动。
  4. 在上下文impl文件中注册您的服务上下文。
  5. 通过调用getSystemService(服务的上下文)
  6. 在应用程序中使用您的服务

    PS;如果您的服务遇到致命异常,设备将软重启,因为您的服务在系统服务下运行。

答案 2 :(得分:2)

添加系统服务有多种方式(或6种方式,只是为了明确)。

您尝试的内容(Android应用程序 - >系统服务 - > JNI(本机)库 - >设备驱动程序)就是其中之一。您可能需要check out this article来深入解释有关系统服务实现模式的信息。

enter image description here

答案 3 :(得分:0)

以下是用于编译位于 system / extras / JNITest 的JNItest.c的Android.mk示例。 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)