阅读五分钟,每日十点,和您一起终身学习,这里是程序员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