Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Создание системных сервисов для платформы Android Игорь Марков, Аурига, CEE-SECR 2017

CEE-SECR
October 20, 2017

Создание системных сервисов для платформы Android Игорь Марков, Аурига, CEE-SECR 2017

В докладе рассказывается, как создавать системные сервисы на платформе Android для управления новым аппаратным обеспечением и другим функционалом. Эти сервисы выполняются в системном контексте и имеют доступ к управлению аппаратным обеспечением через HAL (Hardware Abstraction Layer). О создании модулей HAL также будет рассказано в данном докладе.

Доклад рассчитан на разработчиков Java/C/C++, желающих внести дополнительный функционал в платформу AOSP.

CEE-SECR

October 20, 2017
Tweet

More Decks by CEE-SECR

Other Decks in Technology

Transcript

  1. October 2017, St. Petersburg Software Engineering Conference Russia October 2017,

    St. Petersburg Software Engineering Conference Russia Создание системных сервисов для платформы Android Игорь Марков
  2. Проект: собственный телефон • Стартап • Управление светодиодами • Состояние

    боковых контактов • Специализированное устройство тактильного отклика
  3. Системные сервисы Android • Управляют аппаратным обеспечением • Управляют ОС

  4. Работают в процессе System Server • Отдельный процесс Linux •

    Больше привелегий BluetoothService BatteryService PackageManagerService WindowManagerService ………
  5. Общая схема Приложение Класс управления Сервис (Java) Сервис (С++) HAL

    Драйвер Linux Ядро Платформа Android Приложения Процесс приложения Процесс System Server
  6. Сервис работы с светодиодами Приложение LedLightsManager LedLightsService LedLightsService JNI HAL

    (ledlights) драйвер (spidev) Ядро Платформа Android Приложения Процесс приложения Процесс System Server
  7. Приложение Приложение LedLightsManager LedLightsService LedLightsService JNI HAL (ledlights) драйвер (spidev)

    Ядро Платформа Android Приложения Процесс приложения Процесс System Server
  8. Приложение LedLightsManager manager = getSystemService(Context.LEDLIGHTS_SERVICE); manager.setLights(new byte[] {100, 0, 0,

    0, 100, 100, 0, 0, 0, 100});
  9. Управление сервисом Приложение LedLightsManager LedLightsService LedLightsService JNI HAL (ledlights) драйвер

    (spidev) Ядро Платформа Android Приложения Процесс приложения Процесс System Server
  10. Класс управления сервисом public class LedLightsManager { public static LedLightsManager

    getInstance() { … serviceInstance = ILedLightsService.Stub.asInterface( ServiceManager.getService(Context.LEDLIGHTS_SERVICE)); … } public void setLights(byte[] leds) { try { serviceInstance.setLights(leds); } catch (RemoteException e) {} } }
  11. Binder, AIDL package android.hardware; /** @hide */ interface ILedLightsService {

    oneway void setLights(in byte[] leds); } Процесс Процесс Binder
  12. Системный сервис Приложение LedLightsManager LedLightsService LedLightsService JNI HAL (ledlights) драйвер

    (spidev) Ядро Платформа Android Приложения Процесс приложения Процесс System Server
  13. Системный сервис • Часть на Java для логики и интерфейса

    к приложению • Часть на C/C++ для доступа к модулю HAL LedLightsService.java com_android_server_LedLightsService.cpp JNI
  14. Код сервиса (Java) public class LedLightsService extends ILedLightsService.Stub { public

    void setLights(byte[] leds) { if (leds.length == 10) nativeSetLeds(leds); } private native int nativeSetLeds(byte[] leds); }
  15. Инициализация HAL из сервиса static jint initHAL(JNIEnv *env, object clazz)

    { hw_module *module; int res = hw_get_module(LEDLIGHTS_HARDWARE_MODULE_ID, (const hw_module_t**)&module); if (res == 0) res = module->methods->open(module, LEDLIGHTS_HARDWARE_MODULE_ID, (hw_device_t**)&device); return res; }
  16. Отправка данных в HAL static jint nativeSetLeds(JNIEnv *env, jobject jobj,

    jbyteArray jarr) { int res = -1; jbyte *buf = env->GetByteArrayElements(jarr, NULL); if (buf) { res = device->write((char *)buf); env->ReleaseByteArrayElements(jarr, buf, JNI_ABORT); } return res; }
  17. Hardware Abstraction Layer Приложение LedLightsManager LedLightsService LedLightsService JNI HAL (ledlights)

    драйвер (spidev) Ядро Платформа Android Приложения Процесс приложения Процесс System Server
  18. Модуль HAL • Является «драйвером» • В отличие от Linux,

    выполняется в userspace • Общий интерфейс для одного типа устройств
  19. HAL, функция записи static int liblights_write(char *buffer) { char cmd[LIGHTS_NUM

    + 1]; cmd[0] = 0xF0; memcpy(cmd + 1, buffer, LIGHTS_NUM); return ioctl(spi_fd, SPI_IOC_MESSAGE(1), &cmd); }
  20. Аппаратное обеспечение микроконтроллер основная плата SPI F0 64 00 64

    64 00 64
  21. Сборка и прошивка $ . build/evnsetup $ lunch $ make

    -j40 update-api $ make -j40 $ adb reboot bootloader $ fastboot flash system \ out/target/product/YP/system.img $ fastboot reboot
  22. Можно в домашних условиях!

  23. Сервис работы с контактами Приложение TriggerManager TriggerService TriggerService JNI HAL

    (trigger) драйвер (GPIO) Ядро Платформа Android Приложения Процесс приложения Процесс System Server
  24. Приложение Приложение TriggerManager TriggerService TriggerService JNI HAL (trigger) драйвер (GPIO)

    Ядро Платформа Android Приложения Процесс приложения Процесс System Server
  25. Приложение TriggerManager manager = getSystemService(Context.TRIGGER_SERVICE); int state = manager.getState(); 0

    1
  26. Управление сервисом Приложение TriggerManager TriggerService TriggerService JNI HAL (trigger) драйвер

    (GPIO) Ядро Платформа Android Приложения Процесс приложения Процесс System Server
  27. Класс управления сервисом public class TriggerManager { public static TriggerManager

    getInstance() { … serviceInstance = ITriggerService.Stub.asInterface( ServiceManager.getService(Context.TRIGGER_SERVICE)); … } public int getState() { try { return serviceInstance.getState(); } catch (RemoteException e) {return 0;} } }
  28. Интрефейс AIDL package android.hardware; /** @hide */ interface ITriggerService {

    int getState(); } Процесс Процесс Binder
  29. Системный сервис Приложение TriggerManager TriggerService TriggerService JNI HAL (trigger) драйвер

    (GPIO) Ядро Платформа Android Приложения Процесс приложения Процесс System Server
  30. Код сервиса (Java) public class TriggerService extends ITriggerService.Stub { public

    int getState() { return nativeGetState(); } private native int nativeGetState(); }
  31. Инициализация HAL из сервиса static jint initHAL(JNIEnv *env, object clazz)

    { hw_module *module; int res = hw_get_module(TRIGGER_HARDWARE_MODULE_ID, (const hw_module_t**)&module); if (res == 0) res = module->methods->open(module, TRIGGER_HARDWARE_MODULE_ID, (hw_device_t**)&device); return res; }
  32. Отправка данных в HAL static jint nativeGetState(JNIEnv *env, jobject jobj)

    { return device->readState(); }
  33. Hardware Abstraction Layer Приложение TriggerManager TriggerService TriggerService JNI HAL (trigger)

    драйвер (GPIO) Ядро Платформа Android Приложения Процесс приложения Процесс System Server
  34. HAL, функция чтения static int trigger_readState() { char buf[8]; lseek(gpio_fd,

    0, SEEK_SET); if (read(gpio_fd, &buf, sizeof(buf)) > 0 return strcmp(buf, "1") == 0; else return -1; }
  35. Добавить системный сервис — это легко!

  36. Если возникли любые вопросы при реализации системного сервиса, пишите Игорь

    Марков [email protected] Эта презентация: http://bit.ly/2yzjhqt