Jump to content

[Android Service] Приложение зависает при выполнении unbindService


Benten

Recommended Posts

Добрый день, уважаемые разработчики.

Решил адаптировать подключение к удаленному сервису Андроид на базе стандартного примера Firemonkey из Samples:

C:\Users\Public\Documents\Embarcadero\Studio\21.0\Samples\Object Pascal\Multi-Device Samples\Device Sensors and Services\RemoteServiceDemo

Мое приложение находится в папке FGXRemoteApp. Подключение к сервису проходит на ура, обмен с сервисом тоже работает, а вот при отключении от сервиса, приложение зависает.

При этом, аналогичное FMX приложение из папки FMXRemoteApp работает корректно. Удаленный сервис RemoteService запускается через приложение AppRemoteHost

RemoteServiceDemo.7z

Link to comment
Share on other sites

Если импортировать сервис непосредственно в приложение FGX, как показано на скриншоте, сервис вообще не работает

Подскажите, пожалуйста, что надо сделать, чтобы сервис работал прямо из fgx приложения?

img-2022-07-09-23-17-32.png

Link to comment
Share on other sites

  • Administrators

Пока из того, что вижу по коду. Андроид сервисы реализованы в Делфи не очень хорошо. В их реализации используется прямая зависимость на FMX классы, что мы не можем просто поправить. По этой причине мы поставляем пропатченные готовые файлы:

  • System.Android.Service.dcu
  • System.Android.Service.o

По сути мы взяли исходный файл System.Android.Service.pas внесли изменения, чтобы этот файл работал корректно с FGX Native. Этот пропатченный файл автоматически добавляется в папку сборки FGX Native проекта (Android/$(Config)), только если в проект явно добавлен Андроид сервис через "Project" -> "FGX Android services".  

Если вы самостоятельно добавляете к проекту jar файл и через Deployment so-библиотеку сервиса, то приложение будет падать в те, моменты, когда для работы сервиса требуется TAndroidHelper.Activity

Если же вы добавляете сервис через "Project" -> "FGX Android services", то все должно быть хорошо. На самый крайний случай, вы можете скопировать упомянутые файлы выше прямо в корень проекта. Это гарантирует, что линковщик возьмет именно пропатченные версии этих файлов. Если у вас идет зависание проекта при отключении сервиса, то первое что нужно посмотреть:

  • Стек трейс, если есть.
  • Андроид лог.

Предположение

Из того, что вижу. В модуле FGX.RemoteService вы используете класс TAndroidHelper, который и является камнем преткновения в RTL, так как он зависит от FMX. Вы правильно добавили "Android.Api.RTLBridgeCompatibility", в нем переопределен этот класс хелпера. Однако, в FGX.RemoteService вы добавили еще Androidapi.Helpers, который в итоге переопределяет "Android.Api.RTLBridgeCompatibility". Поэтому для корректной работы "Android.Api.RTLBridgeCompatibility" должен быть последний среди всех подключений модуля, включая секцию реализации.

Чуть позже, как смогу собрать сервис, смогу и посмотреть ваш проект уже в живую.

Link to comment
Share on other sites

  • Administrators

У вас используется метод конвертации AndroidApi.Helpers.StringToJString, а его в "Android.Api.RTLBridgeCompatibility" нету.

Я добавил необходимые методы в Android.Api.RTLBridgeCompatibility.pas

Добавьте этот файл к вашему проекту приложения и уберите "Androidapi.Helpers" из секции uses.

Link to comment
Share on other sites

  • Administrators

Добрый вечер @Benten,

Сегодня наконец-то удалось собрать сервис и все проверить. Спойлер, у меня все заработало. Однако:

  1. В прикрепленном демо-проекте неверно указано название класса в связи к сервису. Должно быть так:
    procedure TFormMain.ButtonBindTap(Sender: TObject);
    begin
      FServiceConnection.BindService('ru.galion.fgxremoteexternal', 'com.embarcadero.services.RemoteService');
    end;
  2. Сервис обязательно нужно добавить через мастер Андроид сервисов FGX Native.

Я прикрепил новый проект, проверяйте. Проверил на разных версиях Андроида, все работает как надо и без ошибок.

RemoteServiceDemo.zip

Link to comment
Share on other sites

  • Administrators

Добрый день,

1. Проблема сборки сервиса

Чтобы собрался сервис, скорее всего нужна новая версия Java JDK. Я использую 18 версию, возможно в этом дело. После установки новой Java JDK обязательно перезапустить IDE и убедитесь, что среда ее подцепила. Это можно понять из вывода в окне Messages. Обратите внимание на команду сборки jar, а именно на версию JDK.

image.png

Если версия не корректная, надо обновить:

  1. Переменные окружения $(JAVA_HOME) и $(PATH)
  2. Обязательно обновить пути к джаве в IDE Android SDK Profile:
    image.png

Если это не помогает, то нужно удалить шаблоны java файлов сервиса. которые лежат в корне проекта сервиса и заново выполнить полную сборку.

Если это не помогает, то нужно проверить используемую версию Android SDK. У меня используется 31 версия.

2. Краш на Unbind

  • Какую версию Андроид вы используете?
  • Я вижу, что вы используете эмулятор. Воспроизводится ли проблема на живом устройстве. И если да, то на какой версии Андроида?
Link to comment
Share on other sites

1 час назад, Yaroslav Brovin сказал:

2. Краш на Unbind

  • Какую версию Андроид вы используете?
  • Я вижу, что вы используете эмулятор. Воспроизводится ли проблема на живом устройстве. И если да, то на какой версии Андроида?

Пробую на разных версиях Андроид и разных устройствах:

  1. Смарт-терминал MSPOS - Андроид 6
  2. Xiomi Redmi 4A - Андроид 6
  3. Эмулятор - Андроид 7
  4. Планшет HUAWEI Андроид 8
  5. Xiomi Mi9T Pro - Android 10

Эмулятор в видео показан только для наглядности, ошибка везде одинаковая.

Проблему с версиями SDK, NDK, JDK я исключаю потому что проект FMX  работает корректно

Или я не прав?

Link to comment
Share on other sites

1 час назад, Yaroslav Brovin сказал:

Если это не помогает, то нужно удалить шаблоны java файлов сервиса. которые лежат в корне проекта сервиса и заново выполнить полную сборку.

Это помогло, спасибо 

Link to comment
Share on other sites

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...