Google APK ANR 优化方案

本文深入探讨了Android设备开机向导阶段出现的ANR(应用无响应)及闪退问题,尤其针对Google Duo、Calendar、Google Music、Google Play Store等应用进行了详细分析。提供了修改BroadcastQueue类和AppErrors类的方法来规避ANR,以及调整ActivityManagerService中的OOM调整值来避免低内存环境下Google Play Store的闪退。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

640?wx_fmt=gif

640?wx_fmt=gif

极力推荐文章:欢迎收藏

Android 干货分享 640?wx_fmt=gif

阅读五分钟,每日十点,和您一起终身学习,这里是 程序员Android

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

一、开机向导时 Google DUO 概率ANR

一、开机向导时 DUO 概率ANR

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

ANR Log 如下:

640?wx_fmt=other

ANR Log

ANR 规避方案如下:

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

修改类路径如下:

/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
          ... ...
  }
    ... ...
}
git diff 修改如下:

640?wx_fmt=other

git 修改记录

二、开机向导时 Calendar 概率 ANR

ANR Log 如下:

640?wx_fmt=other

Calendar ANR log

ANR 规避方案如下:

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

修改方案

请参考修改一

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

刷机或者恢复出厂设置是,开机向导过程中不应该显示ANRframeworks/base/services/core/java/com/android/server/am/AppErrors.javaAppErrors 类中 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();
                        }
                }
            ... ...
        }
        ... ...
}
git 解决方案

640?wx_fmt=other

git 修改差别的

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

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

ANR Log 如下:

640?wx_fmt=other

ANR Log

修改方案

请参考修改一

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

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

ANR Log 如下:

640?wx_fmt=other

ANR Log

ANR 规避方案如下:

请参考修改一

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

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

闪退 Log 信息

640?wx_fmt=other

Google Play Store 被kill Log信息

解决闪退问题方法

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 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=other

解决闪退方案

640?wx_fmt=png

坚持就有惊喜

<think>嗯,用户这次想理解APK Demo的含义,结合之前的讨论和提供的引用来看,需要特别注意上下文关联。用户之前询问过vendor目录结构,现在突然转向APK概念,可能是工作中遇到了移动开发的实际需求。 注意到引用[1]里提到demo和量产项目的区别,这个对比很关键。用户作为开发者,应该需要区分不同阶段的技术要求。APK Demo在移动开发中特指那些用于技术验证的非商用版本,和量产APK的核心差异在于: - 功能上:Demo通常只保留核心功能模块,比如地图Demo可能只展示一个定位按钮 - 流程上:省去了安全加固、性能优化等量产环节 - 法律层面:不包含最终用户许可协议 用户邮件沟通受阻的经历也值得注意,这说明ta可能刚接触企业级开发流程。需要强调Demo的沟通价值——它本质是可视化技术方案,能避免文档沟通的滞后性。 从技术实现角度,应该补充说明Demo的两种常见形式: 1 独立演示APK:比如华为HMS Toolkit生成的扫码Demo 2 主工程内的Demo模块:通过build变体控制,参考Android Studio的"demoDebug"构建类型 最后生成的问题要覆盖实用场景,特别是用户可能遇到的陷阱,比如权限声明遗漏问题在Demo阶段很常见。</think>在Android开发领域,**APK Demo** 指用于演示核心功能或技术验证的非商用安装包。其本质是**简化版应用原型**,与量产项目的区别主要体现在以下方面: --- ### 一、核心特征 1. **功能精简性** - 仅保留核心功能模块(如地图SDK的定位演示) - 移除支付、账户系统等复杂模块 *示例:相机Demo可能仅包含拍照/保存功能,省略相册管理* 2. **流程简化** - 跳过正式测试流程(兼容性/压力测试)[^1] - 无需严格遵循发布规范(如签名加固) - 开发周期缩短 **50%-70%** 3. **技术验证目标** ```mermaid graph LR A[APK Demo] --> B{验证目标} B --> C(第三方库集成效果) B --> D(硬件兼容性) B --> E(算法可行性) ``` --- ### 二、与量产项目的对比 | 维度 | APK Demo | 量产项目 | |--------------|------------------------------|------------------------------| | **测试要求** | 基础功能验证即可 | 需通过CTS/VTS等认证[^1] | | **代码质量** | 允许临时解决方案(hack) | 必须符合架构规范 | | **性能指标** | 不强制优化内存/功耗 | 需满足ANR/崩溃率<0.1% | | **发布流程** | 直接安装调试 | 需应用商店审核(如Google Play)| --- ### 三、典型应用场景 1. **技术预研** - 快速验证AI模型在端侧运行的延迟:$$ t_{latency} = \frac{\sum_{i=1}^{n} t_i}{n} \leq 50\text{ms} $$ 2. **客户演示** - 向客户展示核心交互逻辑(如AR特效) 3. **内部评审** - 产品经理确认需求实现可行性 - 规避邮件沟通延迟问题(如引用中案例[^1]) --- ### 四、开发注意事项 1. **明确标识** - 在应用标题栏添加`[DEMO]`后缀 - 使用醒目颜色区分(如橙色工程图标) 2. **风险控制** - 禁用敏感权限(`READ_SMS`/`LOCATION`) - 添加过期逻辑: ```java if (buildDate.before("2024-12-31")) { showExpireDialog(); // 到期自动禁用 } ``` > **关键结论**:APK Demo是技术可行性验证的**低成本载体**,其价值在于快速迭代。如引用所述,在正式流程中发送Demo给工程师评审可能导致沟通失效,更适合用于面对面演示[^1]。 --- ### 相关问题 1. 如何将APK Demo快速转换为可上架应用? 2. Demo项目中的临时代码(hacks)如何安全重构? 3. 为什么某些硬件功能在Demo可用但量产失效? 4. 如何设计自动过期的Demo保护机制? 5. 在技术评审中,Demo相比文档有何优势?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序员Android

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

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

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

打赏作者

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

抵扣说明:

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

余额充值