2010-07-12 140 views
15

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

首先,后提到“适当” Android.mk文件应该被用来编写客户端/测试应用程序,但没有给出这样的一个例子。当我尝试构建它时,出现构建错误,说它无法找到我添加的服务。有人能举一个这样的例子吗?

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

上实现在Android中你自己的系统服务将是有益的任何其他信息。同样我的具体工作流程是:

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

回答

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

+0

感谢您发表该内容。我不知道TI已经发布了这个文档。我没有真的有机会通过它,但我现在会接受你的答案,因为这似乎提供了一些很好的信息。 – ashughes 2011-12-19 23:20:04

+2

如果有其他人在这里结束,几年前CyanogenMod中的vendorServices功能在升级到ICS时被删除。 – bmaupin 2014-09-04 17:43:38

2

按照下面的步骤在Android框架编写自己的系统服务。

  1. 编写自己的服务/管理器,通过继承该存根暴露的API。
  2. 为您的服务创建一个aidl文件以公开包含在构建中的&。
  3. 在System Server中添加您的服务,您的服务将随所有核心服务一起启动。
  4. 在上下文impl文件中注册您的服务上下文。
  5. 致电getSystemService(您服务的上下文)

PS使用您的服务应用;如果你的服务得到一些致命的异常,设备将软重启,因为你的服务正在系统服务下运行。

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) 
2

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

你试过了什么(Android应用程序 - >系统服务 - > JNI(本机)库 - >设备驱动程序)就是其中之一。您可能需要check out this article以获得关于系统服务实施模式的深入解释。

enter image description here