Как добавить системный сервис в Android Framework

Я хочу добавить свой собственный код рамки, который запускается в Android "system_server" (обрабатывает все службы уровня системы). Моя служба загружает библиотеку JNI, которая говорит с драйвером, который я добавил в ядро. Служба предназначена для того, чтобы приложение могло регистрировать слушателя с ним, чтобы получать обновления от драйвера. Я нашел довольно хорошее сообщение в блоге (http://www.androidenea.com/2009/12/adding-system-server-to-android.html), в котором объясняется, как добавить системный сервис, но я не могу заставить его полностью работать.

Прежде всего, в сообщении упоминается, что для написания клиентского/тестового приложения должен использоваться "соответствующий" файл Android.mk, но не приводится пример этого. Когда я пытаюсь его построить, у меня возникают ошибки сборки, говорящие, что он не может найти службу, которую я добавил. Может ли кто-нибудь дать пример того, как это может выглядеть?

Кроме того, я хотел бы реализовать это в каталоге поставщика (или в каталоге устройства в froyo), а не в открытом исходном коде Android. В сообщении в блоге упоминается, что подходящим местом для этого является каталог поставщика, но не дает примера того, как это должно выглядеть. Кто-нибудь знает?

Любая дополнительная информация о внедрении вашей собственной системной службы в Android будет полезна. Снова мой рабочий процесс:

Приложение Android → Системное обслуживание → Библиотека JNI (родная) → Драйвер устройства

Ответы

Ответ 1

Техасские инструменты предоставили хороший пример:

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

Кроме того, CyanogenMod SystemServer.java также имеет код для динамической загрузки системных служб, как определено в массиве "config_vendorServices" в файле config.xml(см. core/res/res/values ​​/config.xml), который, я считаю, может быть перезаписываются в каталогах поставщиков или устройств, используя оверлеи. Это добавление в CyanogenMod, добавленное в этот фиксатор:

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

Ответ 2

Следуйте приведенным ниже инструкциям для написания собственного системного сервиса в инфраструктуре Android.

  • Создайте свой собственный сервис/менеджер с помощью API, на который наследуется заглушка.
  • Создайте файл helpl для вашей службы, чтобы открыть и включить в сборку.
  • Добавьте службу в Системный сервер, вы начнете работу со всеми основными службами.
  • Зарегистрируйте свой контекст службы в файле context impl.
  • Используйте свою службу в приложении, вызвав getSystemService (Контекст вашей службы)

PS; если ваша служба получает какое-то фатальное исключение, устройство будет мягкой перезагрузкой, так как ваша служба работает под системным сервисом.

Ответ 3

Существует несколько способов (или 6 способов, только чтобы быть явным) добавления системной службы.

То, что вы попробовали (Android App → System Service → JNI (родная) библиотека → Драйвер устройства), является одним из них. Вы можете захотеть проверить эту статью для подробного объяснения шаблонов реализации системных служб.

enter image description here

Ответ 4

Вот пример Android.mk, используемый для компиляции JNItest.c, который находится в системе /extras/JNITest. 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)