Как добавить системный сервис в 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 дополнение, добавленное в этот коммит:
Существует несколько способов (или, если быть точным, 6) добавления системного сервиса.
То, что вы пробовали (Android App -> System Service -> JNI (native) library -> Device Driver), является одним из них. Возможно, вы захотите проверить эту статью для подробного объяснения шаблонов реализации системного сервиса.
Выполните следующие шаги для написания вашей собственной системной службы в Android Framework.
- Напишите свой собственный сервис / менеджер с открытыми API, унаследовав заглушку.
- Создайте файл aidl для вашего сервиса, который будет доступен и включен в сборку.
- Добавьте ваш сервис в System Server, ваш сервис запустится вместе со всеми основными сервисами.
- Зарегистрируйте свой сервисный контекст в контекстном файле.
- Используйте свой сервис в приложении, вызывая 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)