Google App ANR 优化案例

程序员Android

共 4375字,需浏览 9分钟

 · 2021-01-05

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

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

一、开机向导时 Google DUO 概率ANR
二、开机向导时 Google Calendar 概率 ANR
三、开机向导时 ANR 弹框不show的解决方案
四、开机向导时 Google Music 概率 ANR
五、开机向导时 Google Play Store 概率 ANR
六、 Google play Store 下载apk 概率性闪退

一、开机向导时 DUO 概率ANR

Log中分析主要原因是android.intent.action.LOCALE_CHANGED 广播接收超时导致的ANR

1.ANR Log 如下:

ANR Log

2.ANR 规避方案如下:

BroadcastQueue类的 processNextBroadcast方法中,当第一次开机时候,跳过此Action。

3.修改类路径如下:

/alps/frameworks/base/services/core/java/com/android/server/am/BroadcastQueue.java

public final class BroadcastQueue {
... ...
final void processNextBroadcastLocked(boolean fromMsg, boolean skipOomAdj) {
BroadcastRecord r;
... ...
// 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;
}
}

// This is safe to do even if we are skipping the broadcast, and we need
// this information now to evaluate whether it is going to be allowed to run.
final int receiverUid = info.activityInfo.applicationInfo.uid;
// If it's a singleton, it needs to be the same app or a special app
... ...
}
... ...
}

4. git diff 修改如下:

git 修改记录

二、开机向导时 Calendar 概率 ANR

1.ANR Log 如下:

Calendar ANR log

2.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弹窗。

class AppErrors {
... ...
void handleShowAppErrorUi(Message msg) {
... ...
// 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();
}
}
... ...
}
... ...
}

1. git 解决方案

git 修改差别的

四、开机向导时 Google Music 概率 ANR

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

1.ANR Log 如下:

ANR Log

2. 修改方案

请参考修改一

五、开机向导时 Google Play Store 概率 ANR

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

1.ANR Log 如下:

ANR Log

2.ANR 规避方案如下:

请参考修改一

六、Google play Store 下载apk 概率性闪退

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

闪退 Log 信息

Google Play Store 被kill Log信息

1.解决闪退问题方法

ActivityManagerService中的applyOomAdjLocked方法中修改adj值,防止apk 低内存情况下被杀掉。
修改类如下:frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

public class ActivityManagerService extends IActivityManager.Stub
implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {
... ...
protected boolean applyOomAdjLocked(ProcessRecord app, boolean doingAll, long now,
long nowElapsed) {
... ...
// add by 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 for google play store was killed in sometime
... ...
}
... ...
}

2. 解决方案如下

解决闪退方案

至此,本篇已结束。转载网络的文章,小编觉得很优秀,欢迎点击阅读原文,支持原创作者,如有侵权,恳请联系小编删除。同时感谢您的阅读,期待您的关注。

点个在看,方便您使用时快速查找!

浏览 19
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报