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

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

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

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

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

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


person ashughes    schedule 12.07.2010    source источник


Ответы (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/88fff90131f54d45dc496

person Pekka Nikander    schedule 15.09.2011
comment
Спасибо за публикацию. Я не знал, что TI опубликовала эту документацию. У меня действительно не было возможности пройти через это, но я приму ваш ответ на данный момент, так как он, кажется, дает полезную информацию. - person ashughes; 20.12.2011
comment
На случай, если кто-то еще окажется здесь, функция vendorServices была удалена из CyanogenMod несколько лет назад с обновлением до ICS. - person bmaupin; 04.09.2014

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

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

введите здесь описание изображения

person pierrotlefou    schedule 25.04.2015

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

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

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

person Desu    schedule 31.07.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)
person PlinioSilveira    schedule 17.10.2013