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

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

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

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

ЛЮБАЯ дополнительная информация о реализации вашей собственной системной службы в Android будет полезна. Опять мой конкретный рабочий процесс:

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

4 ответа

Решение

Texas Instruments предоставил хороший пример:

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

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

То, что вы пробовали (Android App -> System Service -> JNI (native) library -> Device Driver), является одним из них. Возможно, вы захотите проверить эту статью для подробного объяснения шаблонов реализации системного сервиса.

Выполните следующие шаги для написания вашей собственной системной службы в Android Framework.

  1. Напишите свой собственный сервис / менеджер с открытыми API, унаследовав заглушку.
  2. Создайте файл aidl для вашего сервиса, который будет доступен и включен в сборку.
  3. Добавьте ваш сервис в System Server, ваш сервис запустится вместе со всеми основными сервисами.
  4. Зарегистрируйте свой сервисный контекст в контекстном файле.
  5. Используйте свой сервис в приложении, вызывая getSystemService(Контекст вашего сервиса)

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

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