Delphi 10.3.1 - Android服务挂起在System.InitUnits上

问题描述 投票:1回答:1

我在10.2.3上创建了简单的Android服务并将其固定到我的Android应用程序中,与文档中的相同。但是,在{$ BDS} / lib / android / release中没有libProxyAndroidService.so,我从debug dir复制了它。 Embarcadero为我制作的下一个刺在呼叫时悬挂整个应用程序

TLocalServiceConnection.StartService('somename');

我已经安装了10.3.1,希望在这个版本中消除了这个bug,但它做了同样的事情。在调试模式下运行应用程序,我在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线程挂断,Service永远不会执行,但在后台Android App仍在执行代码(消息日志中的新线程)


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

android delphi service freeze
1个回答
2
投票

https://quality.embarcadero.com/browse/RSP-17857这是旧的bug,从未通过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对象的引用。而服务甚至不需要运行Activity!相反,应用程序和服务作为上下文运行(ActivityService类都来自Context类),因此如果您需要保留对某些内容的引用,请将一个引用到代码运行的上下文中(FMX也可以) 。 FMX使用DelphiActivity做什么是非常重要的,以至于无法以其他(更安全)的方式完成?

结论:服务中的System.DelphiActivity为零,因此加载FMX单元会在initUnits中造成崩溃。带有错误解释的PDF链接:https://www.docdroid.net/TfUjBwg/bug.pdf

© www.soinside.com 2019 - 2024. All rights reserved.