Android Framework框架系列之GMS ANR

本文深入探讨并提供解决方案针对Android设备在开机向导阶段遇到的Google应用如DUO、Calendar、Music及PlayStore的ANR问题,以及PlayStore在低内存环境下下载多个APK时的概率性闪退。通过对BroadcastQueue类和ActivityManagerService的修改,有效避免了ANR及闪退现象。

640?wx_fmt=gif

640?wx_fmt=gif

极力推荐Android 开发大总结文章:欢迎收藏程序员Android 力荐 ,Android 开发者需要的必备技能

640?wx_fmt=jpeg

本篇文章主要介绍 Android 开发中的部分GMS 包 相关APK ANR,闪退问题解决方案知识点,通过阅读本篇文章,您将收获以下内容:

  1. 开机向导时 Google DUO 概率ANR

  2. 开机向导时 Google Calendar 概率 ANR

  3. 开机向导时 ANR 弹框不show的解决方案

  4. 开机向导时 Google Music 概率 ANR

  5. 开机向导时 Google Play Store 概率 ANR

  6. Google play Store 下载apk 概率性闪退

1. 开机向导时 DUO 概率ANR

主要原因是 android.intent.action.LOCALE_CHANGED 广播接收超时导致的ANR。ANR Log 如下:

640?wx_fmt=jpeg

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;
                 }
            }  

历史修改记录

640?wx_fmt=jpeg

git 修改记录

2. 开机向导时 Calendar 概率 ANR

ANR Log 如下:

640?wx_fmt=jpeg

Calendar ANR log

ANR 规避方案如下:android.intent.action.LOCALE_CHANGED 广播接收超时导致的ANR。历史修改记录

640?wx_fmt=jpeg

git 修改记录

3. 开机向导时,ANR 弹框不show的解决方案

刷机或者恢复出厂设置是,开机向导过程中不应该显示ANR。frameworks/base/services/core/java/com/android/server/am/AppErrors.java

解决方案

640?wx_fmt=png

git 修改差别的

                // 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 如下:

640?wx_fmt=jpeg

ANR Log

ANR 规避方案如下:

5.开机向导时 Google Play Store 概率 ANR

开机向导时候 接收android.intent.action.LOCALE_CHANGED 广播超时导致的ANR。ANR Log 如下:

640?wx_fmt=jpeg

ANR Log

ANR 规避方案如下:

2. Google play Store 下载apk 概率性闪退

低内存情况下,使用play Store 下载多个apk,playstore 概率性ANR。

闪退 Log 信息

640?wx_fmt=png

Google Play Store 被kill Log信息

解决闪退问题方法

frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java 

640?wx_fmt=png

解决闪退方案

            // 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 

至此,本篇已结束,如有不对的地方,欢迎您的建议与指正。期待您的关注,

如有侵权,请联系小编,小编对此深感抱歉,同时小编会立即停止侵权行为。

640?wx_fmt=jpeg

至此,本篇已结束,如有不对的地方,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!

640?wx_fmt=jpeg

如有侵权,请联系小编,小编对此深感抱歉,届时小编会删除文章,立即停止侵权行为,请您多多包涵。

640?wx_fmt=other

既然都看到这里,领两个红包在走吧!以下两个红包每天都可以领取

1.支付宝搜索 522398497,或扫码支付宝红包海报。

支付宝扫一扫,每天领取大红包

2.微信红包,微信扫一扫即可领取红包

微信扫一扫,每天领取微信红包

小礼物走一走,来简书关注我

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序员Android

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

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

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

打赏作者

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

抵扣说明:

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

余额充值