Delphi 10.3.1-Android服务挂在System.InitUnits

时间:2019-02-22 10:54:35

标签: android delphi service freeze

我在10.2.3上创建了简单的Android服务,并将其固定在我的Android应用中,与文档中的名称相同。但是,在{$ BDS} / lib / android / release中没有libProxyAndroidService.so的地方,我已经从debug dir复制了它。恩巴卡德罗给我的下一个刺是在打电话时挂了整个应用程序

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后,UI线程挂起,服务从不执行,但是在后台Android App仍在执行代码(消息日志中有新线程)


编辑: 我已经检查了P ^下的内容 这是单元FMX.Platform的初始化部分

1 个答案:

答案 0 :(得分:2)

https://quality.embarcadero.com/browse/RSP-17857 这是旧错误,Embarcadero从未修复过 只需删除所有使用FMX.Types单元的东西,然后将其从evey用途中删除。 然后将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对象的引用。服务甚至不需要活动即可运行!应用程序和服务都以上下文方式运行(ActivityService类均从Context类派生),因此,如果您需要保留对某事物的引用,则对Context保留一个引用该代码正在其中运行(FMX也在其中运行)。 FMX对DelphiActivity进行的操作是如此重要,以至于无法通过其他(更安全的)方式来完成?

结论:Services中的System.DelphiActivity中没有nil,因此加载FMX单元将在initUnits中造成崩溃。 带有错误说明的PDF链接:https://www.docdroid.net/TfUjBwg/bug.pdf