最近版本的应用在开发者控制台报告了一些崩溃问题,让我感到很疯狂。
它们表现为java.lang.IllegalStateException,似乎是Service.onCreate在Application.onCreate之前调用导致的。
这种情况只会在0.3%的用户设备上出现,而且仅限于Android 8设备。我自己的设备无法复制该问题。
我将更好地解释发生了什么。 App以如下方式扩展Application:
public class MySpecificApp extends MyBaseApp
{
static
{
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}
public void onCreate()
{
super.onCreate();
... // Specific initializations
}
...
}
public class MyBaseApp extends Application
{
private static MyBaseApp smApplication;
public void onCreate()
{
super.onCreate();
// Fabric (Crashlitics) initialization. It SHOULD NOT BE needed, just to be sure (tried also without this line)
Fabric.with(this, new Crashlytics());
MyBaseApp.smApplication = this; // smApplication is initialized here and NEVER modified
... // Base initializations
}
public static MyBaseApp getApp() {
return MyBaseApp.smApplication;
}
...
}
在 MyService.onCreate 方法中,对 MyBaseApp.smApplication 进行检查,发现 MyBaseClass.onCreate 从未被调用过。
public class MyService extends Service
{
public MyService()
{
}
@Override
public void onCreate()
{
try
{
if( MySpecificApp.getApp() == null )
Crashlytics.log("MyService.onCreate: probably Application.onCreate not yet called"); <=== Here is raised the Exception
// The line over is the line 617
... // Service initializations
}
catch( Exception e )
{
e.printStackTrace();
throw e;
}
}
...
}
实际上,Crashlytics崩溃是因为它尚未初始化,但这是因为应用程序尚未初始化。
Crashlytics不是关键因素。代码采取这种方式是因为我遇到了几个IllegalStateException奇怪的错误,并且我认为缺少应用程序初始化:我正在尝试调查它。
以下是开发者控制台的堆栈日志(崩溃未到达Crashlytics):
java.lang.RuntimeException:
at android.app.ActivityThread.handleCreateService (ActivityThread.java:3554)
at android.app.ActivityThread.-wrap4 (Unknown Source)
at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1786)
at android.os.Handler.dispatchMessage (Handler.java:105)
at android.os.Looper.loop (Looper.java:164)
at android.app.ActivityThread.main (ActivityThread.java:6944)
at java.lang.reflect.Method.invoke (Method.java)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run (Zygote.java:327)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1374)
Caused by: java.lang.IllegalStateException:
at io.fabric.sdk.android.Fabric.singleton (Fabric.java:301)
at io.fabric.sdk.android.Fabric.getKit (Fabric.java:551)
at com.crashlytics.android.Crashlytics.getInstance (Crashlytics.java:191)
at com.crashlytics.android.Crashlytics.checkInitialized (Crashlytics.java:390)
at com.crashlytics.android.Crashlytics.log (Crashlytics.java:221)
at com.xxx.MyService.onCreate (MyService.java:617) <==== Here is the line that is reached only if Application.onCreate is not called
at android.app.ActivityThread.handleCreateService (ActivityThread.java:3544)
at android.app.ActivityThread.-wrap4 (Unknown Source)
at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1786)
at android.os.Handler.dispatchMessage (Handler.java:105)
at android.os.Looper.loop (Looper.java:164)
at android.app.ActivityThread.main (ActivityThread.java:6944)
at java.lang.reflect.Method.invoke (Method.java)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run (Zygote.java:327)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1374)
这里是清单的摘录:
<application
android:name=".MySpecificApp"
android:allowBackup="true"
android:fullBackupContent="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:largeHeap="true">
...
<service
android:name=".MyService"
android:enabled="true"
android:exported="false"
android:stopWithTask="false">
</service>
...
</application>
有人知道这个 bug 是怎么产生的吗?该如何修复它呢?