如何在Android框架中添加系统服务

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/3232718/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-20 09:14:57  来源:igfitidea点击:

How to add a system service to the Android Framework

androidjava-native-interfaceandroid-source

提问by ashughes

I want to add my own framework code that runs in the Android "system_server" (handles all the system level services). My service loads a JNI library that talks to a driver I have added to the kernel. The service is designed to allow an app to register a listener with it to get updates from the driver. I found a pretty good blog post (http://www.androidenea.com/2009/12/adding-system-server-to-android.html) that explains how to add a system service, but I cannot get it completely working.

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

First of all, the post mentions that an "appropriate" Android.mk file should be used to write the client/test application, but does not give an example of this. When I try to build it, I get build errors saying it can't find the service I have added. Could someone give an example of what this might look like?

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

Also, I'd like to implement this in the vendor directory (or device directory in froyo) rather than in the Android open source code. The blog post mentions that the proper place for this is the vendor directory, but does not give an example of what this should look like. Anyone know?

另外,我想在供应商目录(或 froyo 中的设备目录)而不是在 Android 开源代码中实现这一点。博客文章提到,这个位置的正确位置是供应商目录,但没有给出它应该是什么样子的例子。有人知道吗?

ANY additional information on implementing your own system service in Android would be helpful. Again my specific workflow is:

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

Android App -> System Service -> JNI (native) library -> Device Driver

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

采纳答案by Pekka Nikander

Texas instruments has provided a nice example:

Texas Instruments 提供了一个很好的例子:

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

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:

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

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

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

回答by Desu

Follow the below steps for writing your own System Service in android framework.

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

  1. Write your Own Service/Manager with API's exposed by inheriting the stub.
  2. Create an aidl file for your service to expose & include in build.
  3. Add your service in System Server, you service will start along with all core services.
  4. Register your service context in context impl file.
  5. Use your service in application by calling getSystemService(Context of your service)
  1. 编写您自己的服务/管理器,并通过继承存根公开 API。
  2. 为您的服务创建一个 aidl 文件以在构建中公开和包含。
  3. 在 System Server 中添加您的服务,您的服务将与所有核心服务一起启动。
  4. 在上下文 impl 文件中注册您的服务上下文。
  5. 通过调用 getSystemService(您的服务的上下文)在应用程序中使用您的服务

PS; if your service get some fatal exception, device will soft reboot, as your service is running under system service.

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

回答by pierrotlefou

There are multiply way (or 6 ways, just to be explicit) of adding a system service.

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

What you tried (Android App -> System Service -> JNI (native) library -> Device Driver) is one of them. You might want check out this articlefor an in-depth explanation regarding system service implementation patterns.

您尝试过的(Android 应用程序 -> 系统服务 -> JNI(本机)库 -> 设备驱动程序)就是其中之一。您可能需要查看这篇文章,以获得有关系统服务实现模式的深入解释。

enter image description here

在此处输入图片说明

回答by PlinioSilveira

Here is an example of an Android.mk used to compile a JNItest.c located at system/extras/JNITest. The Android.mk is also inside system/extras/JNITestdirectory.

这是用于编译位于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)