Как добавить системный сервис в Android Framework - PullRequest
15 голосов
/ 13 июля 2010

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

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

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

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

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

Ответы [ 4 ]

15 голосов
/ 15 сентября 2011

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

2 голосов
/ 25 апреля 2015

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

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

enter image description here

2 голосов
/ 31 июля 2013

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

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

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

0 голосов
/ 17 октября 2013

Вот пример 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)
...