GMS ANR解决方案 1. 开机向导时 DUO 概率ANR 2. 开机向导时 Calendar 概率 ANR 3. 开机向导时,ANR 弹框不show的解决方案 4. 开机向导时 Google Music 概率 ANR 5.开机向导时 Google Play Store 概率 ANR 2. Google play Store 下载apk 概率性闪退 1.多次刷机 开机向导过程中com.google.android.gms.ui Crash 解决方案 2.恢复出厂设置,com.google.android.gms.ui crash 解决方案 3.恢复出厂,开机向导 com.google.android.setupwizard报错解决方案 4.恢复出厂设置或者第一次开机,先闪壁纸再显示开机向导 5. 多次刷机com.google.android.setupwizard报错 6. 开机向导点击 On-body com.google.android.setupwizard报错
极力推荐Android 开发大总结文章:欢迎收藏
程序员Android 力荐 ,Android 开发者需要的必备技能
GMS(GoogleMobile Service)
包是出口国外手机中 Google 必须要预制,过 CTS 认证必须的。
极力推荐文章:欢迎收藏
Android 干货分享
阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android
本篇文章主要介绍 Android
开发中的部分GMS 包 相关APK ANR,闪退问题解决方案知识点,通过阅读本篇文章,您将收获以下内容:
- 开机向导时 Google DUO 概率ANR
- 开机向导时 Google Calendar 概率 ANR
- 开机向导时 ANR 弹框不show的解决方案
- 开机向导时 Google Music 概率 ANR
- 开机向导时 Google Play Store 概率 ANR
- Google play Store 下载apk 概率性闪退
主要原因是 android.intent.action.LOCALE_CHANGED 广播接收超时导致的ANR。
ANR Log 如下:
ANR 规避方案如下:
在BroadcastQueue
类的 processNextBroadcast
方法中,当第一次开机时候,跳过此Action。路径如下:/alps/frameworks/base/services/core/java/com/android/server/am/BroadcastQueue.java
// import android.provider.Settings;
//when frist boot , ingore Google Duo anr when receive broadcast : android.intent.action.LOCALE_CHANGED
if (info.activityInfo.name.contains ("com.google.android.apps.tachyon") &&
r.intent.getAction().equals("android.intent.action.LOCALE_CHANGED")){
int deviceProvisioned = Settings.Global.getInt(mService.mContext.getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 0);
if (deviceProvisioned == 0) {
Slog.e(TAG,"switch users or first boot google duo ANR ignore");
skip = true;
}
}
历史修改记录
2. 开机向导时 Calendar 概率 ANR
ANR Log 如下:
ANR 规避方案如下:
主要原因是 android.intent.action.LOCALE_CHANGED 广播接收超时导致的ANR。
请参考修改一
历史修改记录
3. 开机向导时,ANR 弹框不show的解决方案
刷机或者恢复出厂设置是,开机向导过程中不应该显示ANR。
修改文件路径如下:frameworks/base/services/core/java/com/android/server/am/AppErrors.java
修改AppErrors 类中 handleShowAnrUi方法,控制在开机向导时ANR弹窗。
解决方案
// If we've created a crash dialog, show it without the lock held
if (d != null) {
int deviceProvisioned = Settings.Global.getInt(mContext.getContentResolver(), Settings.Global.DEVICE_PROVISIONED,0);
if(proc.userId == 0){
if(deviceProvisioned == 0 && !proc.processName.equals("com.google.android.setupwizard")){
mService.killAppAtUsersRequest(proc, null);
}else{
d.show();
}
} else {
d.show();
}
}
4. 开机向导时 Google Music 概率 ANR
开机向导时候 接收android.intent.action.LOCALE_CHANGED 广播超时导致的ANR。
ANR Log 如下:
ANR 规避方案如下:
请参考修改一
5.开机向导时 Google Play Store 概率 ANR
开机向导时候 接收android.intent.action.LOCALE_CHANGED 广播超时导致的ANR。
ANR Log 如下:
ANR 规避方案如下:
请参考修改一
2. Google play Store 下载apk 概率性闪退
低内存情况下,使用play Store 下载多个apk,playstore 概率性ANR。
闪退 Log 信息
解决闪退问题方法
在ActivityManagerService 中的applyOomAdjLocked 方法中修改adj值,防止apk 低内存情况下被杀掉。
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
// add by wangjie for google play store was killed in sometime
if(app.curAdj>3){
if( app.processName.equals("com.android.vending") ||app.processName.equals("com.google.android.gms")){
app.curAdj = 3;
}
}
// add by wangjie for google play store was killed in sometime
至此,本篇已结束,如有不对的地方,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!
本篇文章主要介绍 Android
开发中的部分知识点,通过阅读本篇文章,您将收获以下内容:
- 多次刷机 开机向导过程中com.google.android.gms.ui Crash 解决方案
- 恢复出厂设置,com.google.android.gms.ui Crash 解决方案
- 恢复出厂,开机向导 com.google.android.setupwizard报错解决方案
- 恢复出厂设置或者第一次开机,先闪壁纸再显示开机向导
- 多次刷机com.google.android.setupwizard报错
- 开机向导点击 On-body com.google.android.setupwizard报错
1.多次刷机 开机向导过程中com.google.android.gms.ui Crash 解决方案
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
解决方案:
修改1:
在ContextWrapper的 unbindService 方法中try-catch IllegalArgumentException 。frameworks/base/core/java/android/content/ContextWrapper.java
修改点2:
在ContextImpl的unbindService 方法中try-catch IllegalArgumentException 。frameworks/base/core/java/android/app/ContextImpl.java
2.恢复出厂设置,com.google.android.gms.ui crash 解决方案
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-31 21:01:26.711 3776 3776 E AndroidRuntime: android.view.WindowManager$BadTokenException:
Unable to add window -- token android.os.BinderProxy@f176911 is not valid; is your activity running?
12-31 21:01:26.711 3776 3776 E AndroidRuntime: at android.view.ViewRootImpl.setView(ViewRootImpl.java:567)
12-31 21:01:26.711 3776 3776 E AndroidRuntime: at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:310)
12-31 21:01:26.711 3776 3776 E AndroidRuntime: at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85)
12-31 21:01:26.711 3776 3776 E AndroidRuntime: at android.app.Dialog.show(Dialog.java:319)
12-31 21:01:26.711 3776 3776 E AndroidRuntime: at com.google.android.location.network.ConfirmAlertChimeraActivity.a(:com.google.android.gms:164)
12-31 21:01:26.711 3776 3776 E AndroidRuntime: at rzo.onServiceConnected(:com.google.android.gms:71)
12-31 21:01:26.711 3776 3776 E AndroidRuntime: at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1223)
解决方案如下
在 ViewRootImpl
类中,解决恢复出厂设置后的问题frameworks/base/core/java/android/view/ViewRootImpl.java
3.恢复出厂,开机向导 com.google.android.setupwizard报错解决方案
Crash Log如下:
--------- beginning of crash
01-01 12:00:00.918 1583 1583 E AndroidRuntime: FATAL EXCEPTION: main
01-01 12:00:00.918 1583 1583 E AndroidRuntime: Process: com.google.android.setupwizard, PID: 1583
01-01 12:00:00.918 1583 1583 E AndroidRuntime: java.lang.RuntimeException: Error receiving broadcast Intent { act=android.intent.action.TIME_SET flg=0x25200010 } in com.google.android.setupwizard.time.DateTimeMonitor$1@7465601
01-01 12:00:00.918 1583 1583 E AndroidRuntime: at android.app.LoadedApk$ReceiverDispatcher$Args.lambda$-android_app_LoadedApk$ReceiverDispatcher$Args_52497(LoadedApk.java:1323)
01-01 12:00:00.918 1583 1583 E AndroidRuntime: at android.app.-$Lambda$aS31cHIhRx41653CMnd4gZqshIQ.$m$7(Unknown Source:4)
01-01 12:00:00.918 1583 1583 E AndroidRuntime: at android.app.-$Lambda$aS31cHIhRx41653CMnd4gZqshIQ.run(Unknown Source:39)
01-01 12:00:00.918 1583 1583 E AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:790)
01-01 12:00:00.918 1583 1583 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:99)
01-01 12:00:00.918 1583 1583 E AndroidRuntime: at android.os.Looper.loop(Looper.java:164)
01-01 12:00:00.918 1583 1583 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:6523)
01-01 12:00:00.918 1583 1583 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
01-01 12:00:00.918 1583 1583 E AndroidRuntime: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
01-01 12:00:00.918 1583 1583 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:857)
01-01 12:00:00.918 1583 1583 E AndroidRuntime: Caused by: java.util.ConcurrentModificationException
01-01 12:00:00.918 1583 1583 E AndroidRuntime: at java.util.ArrayList$Itr.next(ArrayList.java:860)
01-01 12:00:00.918 1583 1583 E AndroidRuntime: at com.google.android.setupwizard.time.DateTimeMonitor.updateStatus(DateTimeMonitor.java:134)
01-01 12:00:00.918 1583 1583 E AndroidRuntime: at com.google.android.setupwizard.time.DateTimeMonitor.-wrap0(Unknown Source:0)
01-01 12:00:00.918 1583 1583 E AndroidRuntime: at com.google.android.setupwizard.time.DateTimeMonitor$1.onReceive(DateTimeMonitor.java:73)
01-01 12:00:00.918 1583 1583 E AndroidRuntime: at android.app.LoadedApk$ReceiverDispatcher$Args.lambda$-android_app_LoadedApk$ReceiverDispatcher$Args_52497(LoadedApk.java:1313)
01-01 12:00:00.918 1583 1583 E AndroidRuntime: ... 9 more
--------- beginning of system
解决方案如下:
此问题关键在于解决ConcurrentModificationException
,但是没有源码,此问题还未完全解决,尝试规避方案如下:/frameworks/base/core/java/android/app/LoadedApk.java
4.恢复出厂设置或者第一次开机,先闪壁纸再显示开机向导
解决方案如下:
主要修改KeyguardServiceDelegate
这个类。frameworks/base/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java
- 修改点1:
在此类中添加判断方法,获取手机DEVICE_PROVISIONED
状态信息。
- 修改点2:
此类的构造方法中,如果获取到的为true,先隐藏
- 修改点3:
在onScreenTurningOn
中判断显示
5. 多次刷机com.google.android.setupwizard报错
Crash Log如下:
--------- beginning of crash
12-12 15:19:11.984 1471 1471 E AndroidRuntime: FATAL EXCEPTION: main
12-12 15:19:11.984 1471 1471 E AndroidRuntime: Process: com.google.android.setupwizard, PID: 1471
12-12 15:19:11.984 1471 1471 E AndroidRuntime: android.content.ActivityNotFoundException: No Activity found to handle Intent { act=com.android.wizard.NEXT (has extras) }
12-12 15:19:11.984 1471 1471 E AndroidRuntime: at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1843)
12-12 15:19:11.984 1471 1471 E AndroidRuntime: at android.app.Instrumentation.execStartActivity(Instrumentation.java:1557)
12-12 15:19:11.984 1471 1471 E AndroidRuntime: at android.app.Activity.startActivityForResult(Activity.java:4228)
12-12 15:19:11.984 1471 1471 E AndroidRuntime: at android.app.Activity.startActivityForResult(Activity.java:4187)
12-12 15:19:11.984 1471 1471 E AndroidRuntime: at com.google.android.setupwizard.BaseActivity.startActivityForResult(BaseActivity.java:665)
12-12 15:19:11.984 1471 1471 E AndroidRuntime: at com.google.android.setupwizard.BaseActivity.nextAction(BaseActivity.java:651)
12-12 15:19:11.984 1471 1471 E AndroidRuntime: at com.google.android.setupwizard.BaseActivity.nextAction(BaseActivity.java:637)
12-12 15:19:11.984 1471 1471 E AndroidRuntime: at com.google.android.setupwizard.user.SuggestedActionsActivity.onItemSelected(SuggestedActionsActivity.java:226)
12-12 15:19:11.984 1471 1471 E AndroidRuntime: at com.android.setupwizardlib.items.RecyclerItemAdapter$1.onClick(RecyclerItemAdapter.java:106)
12-12 15:19:11.984 1471 1471 E AndroidRuntime: at android.view.View.performClick(View.java:5624)
12-12 15:19:11.984 1471 1471 E AndroidRuntime: at android.view.View$PerformClick.run(View.java:22285)
解决方案如下:
在Instrumentation 类中对Google 开机向导进行特殊处理。/frameworks/base/core/java/android/app/Instrumentation.java
6. 开机向导点击 On-body com.google.android.setupwizard报错
Crash Log如下:
--------- beginning of crash
12-31 19:00:26.668 2010 2010 E AndroidRuntime: FATAL EXCEPTION: main
12-31 19:00:26.668 2010 2010 E AndroidRuntime: Process: com.google.android.setupwizard, PID: 2010
12-31 19:00:26.668 2010 2010 E AndroidRuntime: android.content.ActivityNotFoundException: Unable to find explicit activity class {com.google.android.gms/com.google.android.gms.trustagent.discovery.OnbodyPromotionActivity}; have you declared this activity in your AndroidManifest.xml?
12-31 19:00:26.668 2010 2010 E AndroidRuntime: at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1805)
12-31 19:00:26.668 2010 2010 E AndroidRuntime: at android.app.Instrumentation.execStartActivity(Instrumentation.java:1523)
12-31 19:00:26.668 2010 2010 E AndroidRuntime: at android.app.Activity.startActivityForResult(Activity.java:4229)
12-31 19:00:26.668 2010 2010 E AndroidRuntime: at android.app.Activity.startActivityForResult(Activity.java:4188)
12-31 19:00:26.668 2010 2010 E AndroidRuntime: at com.google.android.setupwizard.BaseActivity.startActivityForResult(BaseActivity.java:665)
12-31 19:00:26.668 2010 2010 E AndroidRuntime: at com.google.android.setupwizard.BaseActivity.startFirstRunActivityForResult(BaseActivity.java:719)
12-31 19:00:26.668 2010 2010 E AndroidRuntime: at com.google.android.setupwizard.user.SuggestedActionsActivity.onItemSelected(SuggestedActionsActivity.java:217)
12-31 19:00:26.668 2010 2010 E AndroidRuntime: at com.android.setupwizardlib.items.RecyclerItemAdapter$1.onClick(RecyclerItemAdapter.java:106)
12-31 19:00:26.668 2010 2010 E AndroidRuntime: at android.view.View.performClick(View.java:5675)
12-31 19:00:26.668 2010 2010 E AndroidRuntime: at android.view.View$PerformClick.run(View.java:22641)
12-31 19:00:26.668 2010 2010 E AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:836)
12-31 19:00:26.668 2010 2010 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:103)
12-31 19:00:26.668 2010 2010 E AndroidRuntime: at android.os.Looper.loop(Looper.java:203)
解决方案如下:
至此,本篇已结束,如有不对的地方,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!