Delphi 10.3.1 - Android 服务挂在 System.InitUnits

Posted

技术标签:

【中文标题】Delphi 10.3.1 - Android 服务挂在 System.InitUnits【英文标题】:Delphi 10.3.1 - Android Service hangs on System.InitUnits 【发布时间】:2019-07-16 10:58:18 【问题描述】:

我在 10.2.3 上创建了简单的 android 服务,并将其固定到我的 Android 应用程序中,就像它在文档中一样。但是,在 $BDS/lib/android/release 中没有 libProxyAndroidService.so 的地方,我从调试目录中复制了它。 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;

执行故障 P 后,UI 线程挂起,Service 从未执行,但在后台 Android App 仍在执行代码(消息日志中的新线程)


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

【问题讨论】:

【参考方案1】:

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 对象的引用。而且服务甚至不需要活动来运行!应用程序和服务类似地作为上下文运行(ActivityService 类都派生自 Context 类),因此如果您需要保存对某物的引用,请将其保存到运行代码的上下文(FMX 也是如此)。 FMX 对 DelphiActivity 做了什么如此重要以至于无法以其他(更安全)的方式完成?

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

【讨论】:

以上是关于Delphi 10.3.1 - Android 服务挂在 System.InitUnits的主要内容,如果未能解决你的问题,请参考以下文章

Delphi 10.3.2试用报告

Delphi 10.3.2试用报告

删除记录时出现 NO_SQL_DATA 错误,firedac,delphi 10.3.1

jQuery再见!Bootstrap 5将移除对其依赖;阿里巴巴将建浙江云计算数据中心;Delphi 10.3.1发布

Android网络安全配置network-security-config区分正式服和测试服

Delphi 的 TNetHTTPClient 后代支持 http2