阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android
本篇文章主要介绍开发中我们没有源码的GMS Crash崩溃后的解决方案,通过阅读本篇文章,您将收获以下内容:
一、gms.ui Service not registered Crash
二、gms.ui BadTokenException Crash
三、setupwizard ConcurrentModificationException Crash
四、setupwizard ActivityNotFoundException Crash
五、setupwizard On-body ActivityNotFoundException
六、Google play Service NullPointerException Crash
七、恢复出厂设置或者第一次开机,先闪壁纸再显示开机向导
GMS(GoogleMobile Service)包是出口国外手机中 Google限制必须要预制的,如果不预置无法过Google CTS 认证,会导致手机无法正常使用,并且Google会对手机厂商进行罚款。
只要是代码写出来的东西,都会有报错的概率存在,Google大牛写的代码也不理我,那么,当我们遇到Google apk Crash 时候我们改如何处理呢?由于没有Google源码,我们不能从根本上解决 Google apk Crash的问题,只能在Android原生的代码上规避 一下Google代码低概率复现问题。
一、gms.ui Service not registered Crash
1.Crash Log如下:
--------- beginning of crash
01-01 00:00:16.892 2210 2473 E AndroidRuntime: FATAL EXCEPTION: IPreferenceServiceThread
01-01 00:00:16.892 2210 2473 E AndroidRuntime: Process: com.google.android.gms.ui, PID: 2210
01-01 00:00:16.892 2210 2473 E AndroidRuntime: java.lang.IllegalArgumentException: Service not registered: wfg@202e22a
01-01 00:00:16.892 2210 2473 E AndroidRuntime: at android.app.LoadedApk.forgetServiceDispatcher(LoadedApk.java:1329)
01-01 00:00:16.892 2210 2473 E AndroidRuntime: at android.app.ContextImpl.unbindService(ContextImpl.java:1495)
01-01 00:00:16.892 2210 2473 E AndroidRuntime: at android.content.ContextWrapper.unbindService(ContextWrapper.java:648)
01-01 00:00:16.892 2210 2473 E AndroidRuntime: at android.content.ContextWrapper.unbindService(ContextWrapper.java:648)
01-01 00:00:16.892 2210 2473 E AndroidRuntime: at android.content.ContextWrapper.unbindService(ContextWrapper.java:648)
01-01 00:00:16.892 2210 2473 E AndroidRuntime: at android.content.ContextWrapper.unbindService(ContextWrapper.java:648)
01-01 00:00:16.892 2210 2473 E AndroidRuntime: at msl.a(:com.google.android.gms@11951440:39)
01-01 00:00:16.892 2210 2473 E AndroidRuntime: at wfh.run(:com.google.android.gms@11951440:5)
--------- beginning of system
2.Crash 原因:
当绑定服务已经解除绑定,再次解除绑定,会出现此异常。

当绑定服务已经解除绑定,再次解除绑定,会出现此异常
3.解决方案:
由于没有GMS源码,我们不能从根源上处理问题,只能尝试修改Framework代码规避此问题。
解决此问题需要修改一下两个类:
frameworks/base/core/java/android/app/ContextImpl.java
frameworks/base/core/java/android/content/ContextWrapper.java
1.修改1:
ContextWrapper.java
在ContextWrapper的unbindService 方法中try-catch住代码中抛出的异常IllegalArgumentException,抓住异常,不让异常抛出。
修改方法如下:
public class ContextWrapper extends Context {
... ...
@Override
public void unbindService(ServiceConnection conn) {
try {
mBase.unbindService(conn);
} catch (IllegalArgumentException e) {
//com.google.android.gms.ui Service not registered Crash
android.util.Log.e("wjwj","---ContextWrapper GMS Crash---");
e.printStackTrace();
}
}
... ...
}

在ContextWrapper的 unbindService 方法中try-catch IllegalArgumentException
2.修改2:
ContextImpl.java
修改方法如下:
class ReceiverRestrictedContext extends ContextWrapper {
... ...
@Override
public void unbindService(ServiceConnection conn) {
if (conn == null) {
throw new IllegalArgumentException("connection is null");
}
if (mPackageInfo != null) {
IServiceConnection sd = mPackageInfo.forgetServiceDispatcher(
getOuterContext(), conn);
try {
ActivityManager.getService().unbindService(sd);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
} catch (IllegalArgumentException e) {
//com.google.android.gms.ui Service not registered Crash
android.util.Log.e("wjwj","---ContextImpl GMS Crash---");
e.printStackTrace();
}
} else {
throw new RuntimeException("Not supported in system context");
}
}
... ...
}
3.修改思路:
在ContextImpl的unbindService方法中try-catch抓住代码中抛出的异常IllegalArgumentException。

在ContextImpl的unbindService 方法中try-catch IllegalArgumentException
二、gms.ui BadTokenException Crash
1.Crash Log如下:
12-31 21:01:26.711 3776 3776 E AndroidRuntime: FATAL EXCEPTION: main
12-31 21:01:26.711 3776 3776 E AndroidRuntime: Process: com.google.android.gms.ui, PID: 3776
12-

最低0.47元/天 解锁文章
1109

被折叠的 条评论
为什么被折叠?



