返回
应用程序启动服务崩溃的背后:Android系统源码剖析
Android
2023-12-10 01:20:31
在应用程序的开发与运行过程中,难免会遇到各种各样的问题。其中,服务crash是比较常见的一种问题。它会导致应用程序无法正常运行,甚至可能导致系统崩溃。
为了更好地理解和解决服务crash的问题,我们需要深入分析Android系统源码。通过源码分析,我们可以了解到服务是如何启动的,以及在启动过程中可能遇到的各种问题。
在本文中,我们将通过分析一段设备开机过程中的日志,来了解GMS在启动服务时抛出异常的原因。
首先,我们来看一下这段日志:
05-13 10:55:38.585 1144-1455/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.google.android.gms, PID: 1144
android.app.RemoteServiceException: Bad notification for startForeground: java.lang.RuntimeException: Unable to start service Intent { cmp=com.google.android.gms/.auth.frp.FRPRecoveryService }: not found
at android.app.ActivityManagerProxy.getService(ActivityManagerProxy.java:2298)
at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1301)
at android.app.ContextImpl.startService(ContextImpl.java:1289)
at android.content.ContextWrapper.startService(ContextWrapper.java:647)
at android.content.ContextWrapper.startService(ContextWrapper.java:647)
at com.google.android.gms.auth.frp.FRPRecoveryService.startTrackingBackgroundActivity(FRPRecoveryService.java:171)
at com.google.android.gms.auth.frp.FRPRecoveryService.onBootCompleted(FRPRecoveryService.java:158)
at android.app.ActivityThread.handleReceiver(ActivityThread.java:3215)
at android.app.ActivityThread.dispatchReceiver(ActivityThread.java:3174)
at android.app.ActivityThread.dispatchReceiverWithCutForInstalledApps(ActivityThread.java:3143)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:969)
从日志中,我们可以看到GMS在启动服务com.google.android.gms.auth.frp.FRPRecoveryService
时抛出了异常。异常的原因是“not found”。这表明系统找不到这个服务。
那么,为什么系统找不到这个服务呢?
通过进一步分析源码,我们发现这个问题与后台uid的app有关。在Android系统中,每个app都有一个uid。当app在后台运行时,它的uid会变成后台uid。
后台uid的app与前台uid的app有一些不同。例如,后台uid的app不能启动服务。
在本文的案例中,GMS的FRPRecoveryService是一个后台uid的app。因此,它无法启动服务。
为了解决这个问题,我们可以将FRPRecoveryService的uid改为前台uid。这样,它就可以启动服务了。
现在,我们已经了解了GMS在启动服务时抛出异常的原因,并给出了解决方案。希望本文能够帮助开发人员更好地理解和解决此类问题。