Google App Crash 规避方案

fc57ace0861036f216db16b3082dfa91.gif

和你一起终身学习,这里是程序员Android

经典好文推荐,通过阅读本文,您将收获以下知识点:

一、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 原因:

当绑定服务已经解除绑定,再次解除绑定,会出现此异常。

93932495ca426b91d0f27472cb26e32b.jpeg

当绑定服务已经解除绑定,再次解除绑定,会出现此异常

3.解决方案:

由于没有GMS源码,我们不能从根源上处理问题,只能尝试修改Framework代码规避此问题。
解决此问题需要修改一下两个类:

frameworks/base/core/java/android/app/ContextImpl.java
frameworks/base/core/java/android/content/ContextWrapper.java
  • 1.修改1:ContextWrapper.java

ContextWrapperunbindService 方法中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();
          }
      }
   
    ... ...
    
}

d9590b42478b2df420719545969cec1e.jpeg

在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.修改思路:
    ContextImplunbindService 方法中try-catch抓住代码中抛出的异常IllegalArgumentException

7f87feffc30783b5f5bdbb45adc8683e.jpeg

在ContextImpl的unbindService 方法中try-catch IllegalArgumentException

二、gms.ui BadTokenException Crash

1.Crash Log如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员Android

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值