Delphi 12升级后Android 13应用启动Foreground Service崩溃求助
Delphi 12升级后Foreground Service启动崩溃问题分析
问题背景
应用在升级到Delphi 12前运行完全正常,升级后启动Foreground Service时直接崩溃,相关Android关键日志如下:
核心日志信息
// TAndroidHelper.Context.startService(GetIntent('com.embarcadero.services.SARTrackService')); 2024/08/19 08:38:26.162 I nz.sartrack.SARTrackApp 32317 32317 info SARTrack Client: [C] [08:38:26.154] isServiceStarted... 2024/08/19 08:38:26.173 I nz.sartrack.SARTrackApp 32317 32317 info SARTrack Client: [C] [08:38:26.166] isServiceStarted: TRUE 随后出现大量错误日志: 2024/08/19 08:38:26.383 E nz.sartrack.SARTrackApp 32317 32317 ack.SARTrackApp ----- class 'Lcom/embarcadero/services/SARTrackServiceProxyInterface;' cl=0x12c15918 ----- 2024/08/19 08:38:26.383 E nz.sartrack.SARTrackApp 32317 32317 ack.SARTrackApp objectSize=188 (172 from super) 2024/08/19 08:38:26.383 E nz.sartrack.SARTrackApp 32317 32317 ack.SARTrackApp access=0x0000.0001 2024/08/19 08:38:26.383 E nz.sartrack.SARTrackApp 32317 32317 ack.SARTrackApp super='java.lang.Class<java.lang.Object>' (cl=0x0) 2024/08/19 08:38:26.383 E nz.sartrack.SARTrackApp 32317 32317 ack.SARTrackApp interfaces (1): 2024/08/19 08:38:26.383 E nz.sartrack.SARTrackApp 32317 32317 ack.SARTrackApp 0: java.lang.Class<java.lang.reflect.InvocationHandler> (cl=0x0) 2024/08/19 08:38:26.383 E nz.sartrack.SARTrackApp 32317 32317 ack.SARTrackApp vtable (4 entries, 11 in super): 2024/08/19 08:38:26.383 E nz.sartrack.SARTrackApp 32317 32317 ack.SARTrackApp 0: java.lang.Object com.embarcadero.services.SARTrackServiceProxyInterface.CreateProxyClass(java.lang.Class, long) 2024/08/19 08:38:26.383 E nz.sartrack.SARTrackApp 32317 32317 ack.SARTrackApp 1: void com.embarcadero.services.SARTrackServiceProxyInterface.cleanNative(long) 2024/08/19 08:38:26.383 E nz.sartrack.SARTrackApp 32317 32317 ack.SARTrackApp 2: java.lang.Object com.embarcadero.services.SARTrackServiceProxyInterface.dispatchToNative2(java.lang.String, java.lang.String, java.lang.Object[], long) 2024/08/19 08:38:26.383 E nz.sartrack.SARTrackApp 32317 32317 ack.SARTrackApp 3: java.lang.Object com.embarcadero.services.SARTrackServiceProxyInterface.invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[]) 2024/08/19 08:38:26.383 E nz.sartrack.SARTrackApp 32317 32317 ack.SARTrackApp direct methods (1 entries): 2024/08/19 08:38:26.383 E nz.sartrack.SARTrackApp 32317 32317 ack.SARTrackApp 0: void com.embarcadero.services.SARTrackServiceProxyInterface.<init>() 2024/08/19 08:38:26.383 E nz.sartrack.SARTrackApp 32317 32317 ack.SARTrackApp instance fields (1 entries): 2024/08/19 08:38:26.383 E nz.sartrack.SARTrackApp 32317 32317 ack.SARTrackApp 0: long com.embarcadero.services.SARTrackServiceProxyInterface.pointer 2024/08/19 08:38:26.383 E nz.sartrack.SARTrackApp 32317 32317 ack.SARTrackApp Failed to register native method com.embarcadero.services.SARTrackServiceProxyInterface.dispatchToNative(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;J)Ljava/lang/Object; in /data/app/~~Fp6XJtxT5BQ_Ek-WC7J9rw==/nz.sartrack.SARTrackApp-kHH5upNo6s_PgHGit_wdsw==/base.apk 2024/08/19 08:38:26.383 F nz.sartrack.SARTrackApp 32317 32317 ack.SARTrackApp java_vm_ext.cc:591] JNI DETECTED ERROR IN APPLICATION: JNI RegisterNatives called with pending exception java.lang.NoSuchMethodError: no static or non-static method "Lcom/embarcadero/services/SARTrackServiceProxyInterface;.dispatchToNative(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;J)Ljava/lang/Object;" 随后出现大量致命日志: 2024/08/19 08:38:26.383 F nz.sartrack.SARTrackApp 32317 32317 ack.SARTrackApp java_vm_ext.cc:591] at void com.embarcadero.rtl.ProxyService.onCreateNative(java.lang.Object, java.lang.String) (ProxyService.java:-2) 2024/08/19 08:38:26.383 F nz.sartrack.SARTrackApp 32317 32317 ack.SARTrackApp java_vm_ext.cc:591] at void com.embarcadero.rtl.ProxyService.onCreate(java.lang.Object, java.lang.String) (ProxyService.java:51) 2024/08/19 08:38:26.383 F nz.sartrack.SARTrackApp 32317 32317 ack.SARTrackApp java_vm_ext.cc:591] at void com.embarcadero.services.SARTrackService.onCreate() (SARTrackService.java:41) 2024/08/19 08:38:26.383 F nz.sartrack.SARTrackApp 32317 32317 ack.SARTrackApp java_vm_ext.cc:591] at void android.app.ActivityThread.handleCreateService(android.app.ActivityThread$CreateServiceData) (ActivityThread.java:5073) 2024/08/19 08:38:26.383 F nz.sartrack.SARTrackApp 32317 32317 ack.SARTrackApp java_vm_ext.cc:591] at void android.app.ActivityThread.-$$Nest$mhandleCreateService(android.app.ActivityThread, android.app.ActivityThread$CreateServiceData) (ActivityThread.java:-1) 2024/08/19 08:38:26.383 F nz.sartrack.SARTrackApp 32317 32317 ack.SARTrackApp java_vm_ext.cc:591] at void android.app.ActivityThread$H.handleMessage(android.os.Message) (ActivityThread.java:2428)
问题原因分析
从日志的核心错误点可以明确:
- JNI在注册本地方法时失败,系统提示找不到
com.embarcadero.services.SARTrackServiceProxyInterface.dispatchToNative方法 - 但日志中显示该接口实际存在的是
dispatchToNative2(带后缀2)的同名方法
这说明Delphi 12在生成Android服务代理类时,对JNI交互的方法命名做了变更,而旧项目的相关代码未同步适配:
- Delphi 12重构了服务与Native层交互的逻辑,将原
dispatchToNative方法重命名为dispatchToNative2 - 项目升级后,自动生成的Java代理类(如
SARTrackServiceProxyInterface)已更新为新方法名,但JNI注册逻辑仍在尝试绑定旧方法名,导致方法找不到的错误,最终触发应用崩溃 - 也有可能是Delphi 12的RTL(运行时库)中服务代理的实现逻辑发生了变化,旧项目的服务代码未适配这种底层变更
内容的提问来源于stack exchange,提问作者Bart Kindt
相关产品推荐
相关产品推荐

