返回

应用程序启动服务崩溃的背后:Android系统源码剖析

Android

在应用程序的开发与运行过程中,难免会遇到各种各样的问题。其中,服务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在启动服务时抛出异常的原因,并给出了解决方案。希望本文能够帮助开发人员更好地理解和解决此类问题。