Delphi 10.3.1 - Сервис Android зависает на System.InitUnits - PullRequest
0 голосов
/ 22 февраля 2019

Я создал простой Android-сервис на 10.2.3 и прикрепил его к своему Android-приложению так же, как в документах.Однако там, где нет libProxyAndroidService.so в {$ BDS} / lib / android / release, я скопировал его из каталога отладки.Следующим занятием, сделанным Embarcadero для меня, было зависание целого приложения при вызове

TLocalServiceConnection.StartService('somename');

. Я установил 10.3.1 с надеждой, что эта ошибка устранена в этом выпуске, но она сделала то же самое.Запустив приложение в режиме отладки, я поместил несколько точек останова в System.Android.ServiceApplication, при переходе по коду снова и снова он зависал в System.InitUnits, строка 23357:

 try
    while I < Count do
    begin
      P := Table^[I].Init;
      Inc(I);
      InitContext.InitCount := I;
      if Assigned(P) and Assigned(Pointer(P^)) then
      begin
{$IF defined(MSWINDOWS)}
        TProc(P)();
{$ELSEIF (defined(POSIX) and defined(CPUX86)) and defined(ASSEMBLER)}
        CallProc(P, InitContext.Module^.GOT);
{$ELSE}
        TProc(P)(); << 23357 crashing 
{$ENDIF}
      end;

enter image description here После выполнения неисправного P поток пользовательского интерфейса зависает, служба не выполняется, но в фоновом режиме Android-приложение все еще выполняет код (новые потоки в журнале сообщений)


Редактировать: япроверил, что находится под P ^ Это часть инициализации модуля FMX. Платформа

1 Ответ

0 голосов
/ 22 февраля 2019

https://quality.embarcadero.com/browse/RSP-17857 Это старая ошибка, никогда не исправляемая Embarcadero. Просто удалите все, что использует модуль FMX.Types, удалите этот модуль из любого использования.Затем установите ClassGroup на TPersistent
Потраченные впустую часы: |

procedure TPlatformAndroid.BindAppGlueEvents;
var
  AndroidAppGlue: TAndroidApplicationGlue;
begin
  AndroidAppGlue := PANativeActivity(System.DelphiActivity)^.instance; // <------- Error occurs here
  AndroidAppGlue.OnApplicationCommandEvent := HandleApplicationCommandEvent;
  AndroidAppGlue.OnContentRectEvent := HandleContentRectChanged;
  AndroidAppGlue.OnInputEvent := HandleAndroidInputEvent;
end;

Связанные проблемы: RSP-12199 и RSP-13381.У FMX, похоже, много проблем, связанных с использованием System.DelphiActivity в сервисе.И не зря.DelphiActivity, вероятно, вообще не должно существовать!Вы не должны удерживать ссылки на объект Activity в первую очередь.А Сервису даже не требуется Активность для запуска!Вместо этого приложения и службы выполняются как контексты (классы Activity и Service оба являются производными от класса Context), поэтому, если вам нужно сохранить ссылку на что-то, поместите одну в контекст, в котором выполняется код(который также делает FMX).Что делает FMX с DelphiActivity так важно, что это нельзя сделать другими (более безопасными) способами?

Вывод: System.DelphiActivity в Сервисах отсутствует, поэтому загрузка модулей FMX создастсбой в initUnits.PDF-ссылка с объяснением ошибки: https://www.docdroid.net/TfUjBwg/bug.pdf

...