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

4 回答 4

15

Texas instruments has provided a nice example:

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

Additionally, the CyanogenMod SystemServer.java has also code for dynamically loading system services as defined in the array "config_vendorServices" in config.xml (see core/res/res/values/config.xml), which I believe can be overwritten in the vendor or device directories using the overlays. This is a CyanogenMod-specific addition, added in this commit:

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

于 2011-09-15T16:27:29.487 回答
3

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

您尝试过的(Android App -> System Service -> JNI (native) library -> Device Driver)就是其中之一。您可能想查看这篇文章以获得有关系统服务实现模式的深入解释。

在此处输入图像描述

于 2015-04-25T04:49:16.773 回答
2

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

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

附言; 如果您的服务出现致命异常,设备将软重启,因为您的服务正在系统服务下运行。

于 2013-07-31T06:54:15.513 回答
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)
于 2013-10-17T16:59:05.710 回答