关于monkey测试通过不同入口Intent启动app引起的anr分析

2024-01-14 08:32

本文主要是介绍关于monkey测试通过不同入口Intent启动app引起的anr分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题的根本原因是monkey测试时,com.android.quicksearchbox 应用查找FileExplorer应用并启动FileExploreActivity,创建对应的 task root activity,后续在发生问题期间并未有该token的activity finish及task id 被remove行为;在这个期间monkey测试大量启动了uid 0的FileExploreActivity,由于两者的启动Intent不一样,AMS处理将会创建多个FileExploreActivity实例对象,均建立在roottask activity的task id上,因此,就出现了大量的FileExploreActivity窗口及WIN DEATH,导致filedescriptor打开过多或其他问题,引起应用crash或anr等行为。

 

 

分析log如下:

 

第一步: 确认发生anr时的dum win问题FileExplorerActivity ,有大量的dup win taskid 78 的FileExploreActivity

 

01-01 13:34:05.136  759   833 I WindowManager: Input event dispatching timed out sendingto Prompt.

01-01 13:34:05.136  759   833 I WindowManager: Dump Display#0 windows:

01-01 13:34:05.138  759   833 I WindowManager: Dump Win No.275 = Window{81a08a6 u0com.xx.fileexplorer/com.xx.fileexplorer.activities.FileExploreActivity} =AppWindowToken{483d10b token=Token{5138da ActivityRecord{d3d3285 u0 com.xx.fileexplorer/.activities.FileExploreActivityt78}}}

01-01 13:34:05.215  759   833 I WindowManager: Dump Win No.35 = Window{557c393 u0com.xx.fileexplorer/com.xx.fileexplorer.activities.FileExploreActivity} =AppWindowToken{9f2eaf6 token=Token{6c42b91 ActivityRecord{5a3f1b8 u0com.xx.fileexplorer/.activities.FileExploreActivity t78}}}

 

第二步: 查找该task78 id最初创建者,确认是由quicksearchbox

01-01 08:03:33.381  759   824 I ActivityManager: START u0 {act=android.intent.action.MAINdat=content://applications/applications/com.xx.fileexplorer/com.xx.fileexplorer.activities.FileExploreActivityflg=0x14000000 cmp=com.android.quicksearchbox/.providers.ApplicationLauncher (has extras)} fromuid 10073 on display 0

// 查询 am_create_task task id 78

01-01 08:03:33.470  759   774 I ActivityManager: START u0 {act=android.intent.action.MAINflg=0x10200000 cmp=com.xx.fileexplorer/.activities.FileExploreActivity} fromuid 10073 on display 0

01-01 08:03:33.480  759   774 I am_create_task: [0,78]

// token 231695252

01-01 08:03:33.480  759   774 I am_create_activity: [0,231695252,78,com.xx.fileexplorer/.activities.FileExploreActivity,android.intent.action.MAIN,NULL,NULL,270532608]

 

第三步: 确认问题发生期间,这个task 78是否有被remove过

 

结论: 从01-01 08:03:33.381到发生问题 01-01 13:34:05,并未有 wm_task_removed 该task id 78

 

第四步: 确认发生问题期间,是否token 231695252 的Activity被finish

结论: 未被finish

 

第五步: 确认从taskroot Activity建立,到发生问题期间,monkey大量启动 FileExploreActivity,taskid 78

  01-01 08:03:39.536  759   997 I ActivityManager: START u0 {act=android.intent.action.MAINcat=[android.intent.category.LAUNCHER] flg=0x10200000cmp=com.xx.fileexplorer/.activities.FileExploreActivity} from uid 0 ondisplay 0

 01-01 08:03:39.563  759   997 I am_create_activity: [0,217736970,78,com.xx.fileexplorer/.activities.FileExploreActivity,android.intent.action.MAIN,NULL,NULL,274726912]

//…

01-0110:08:40.496   759   773 I ActivityManager: START u0{act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER]flg=0x10200000 cmp=com.xx.fileexplorer/.activities.FileExploreActivity} fromuid 0 on display 0

01-0110:08:40.572   759   773 I am_create_activity:[0,186726681,78,com.xx.fileexplorer/.activities.FileExploreActivity,android.intent.action.MAIN,NULL,NULL,274726912]

// …

01-0113:32:24.161   759   773 I ActivityManager: START u0{act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER]flg=0x10200000 cmp=com.xx.fileexplorer/.activities.FileExploreActivity} fromuid 0 on display 0

01-0113:32:24.266   759   773 I am_create_activity:[0,124159793,78,com.xx.fileexplorer/.activities.FileExploreActivity,android.intent.action.MAIN,NULL,NULL,274726912]

 

第六步:对比确认quicksearchbox、monkey、launcher启动的Intent

1)       Quicksearchbox

01-01 08:03:33.470   759   774 IActivityManager: START u0 {act=android.intent.action.MAINflg=0x10200000 cmp=com.xx.fileexplorer/.activities.FileExploreActivity}from uid 10073 on display 0

 

2)       Monkey

01-01 08:03:39.536   759   997 IActivityManager: START u0 {act=android.intent.action.MAINcat=[android.intent.category.LAUNCHER] flg=0x10200000cmp=com.xx.fileexplorer/.activities.FileExploreActivity} from uid 0 ondisplay 0

 

3)       launcher

03-2117:22:57.937   739   754 I ActivityManager: START u0 {act=android.intent.action.MAINcat=[android.intent.category.LAUNCHER]flg=0x10200000cmp=com.xx.fileexplorer/.activities.FileExploreActivity (has extras)}from uid 10017 on display 0

 

 

结论:

  根本原因是 quicksearchbox启动应用时,同monkey和launcher的Intent不一样,导致后续建立在该task上,monkey方式一直重复创建FileExplorerActivity实例,引起问题。

因此,是否quicksearchbox可以参考launcher启动应用方式添加cat标记使Intent一致,这样就不会创建多个实例对象; 

这篇关于关于monkey测试通过不同入口Intent启动app引起的anr分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/604545

相关文章

Nginx启动失败:端口80被占用问题的解决方案

《Nginx启动失败:端口80被占用问题的解决方案》在Linux服务器上部署Nginx时,可能会遇到Nginx启动失败的情况,尤其是错误提示bind()to0.0.0.0:80failed,这种问题通... 目录引言问题描述问题分析解决方案1. 检查占用端口 80 的进程使用 netstat 命令使用 ss

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

Python如何计算两个不同类型列表的相似度

《Python如何计算两个不同类型列表的相似度》在编程中,经常需要比较两个列表的相似度,尤其是当这两个列表包含不同类型的元素时,下面小编就来讲讲如何使用Python计算两个不同类型列表的相似度吧... 目录摘要引言数字类型相似度欧几里得距离曼哈顿距离字符串类型相似度Levenshtein距离Jaccard相

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

《关于Spring@Bean相同加载顺序不同结果不同的问题记录》本文主要探讨了在Spring5.1.3.RELEASE版本下,当有两个全注解类定义相同类型的Bean时,由于加载顺序不同,最终生成的... 目录问题说明测试输出1测试输出2@Bean注解的BeanDefiChina编程nition加入时机总结问题说明

Windows设置nginx启动端口的方法

《Windows设置nginx启动端口的方法》在服务器配置与开发过程中,nginx作为一款高效的HTTP和反向代理服务器,被广泛应用,而在Windows系统中,合理设置nginx的启动端口,是确保其正... 目录一、为什么要设置 nginx 启动端口二、设置步骤三、常见问题及解决一、为什么要设置 nginx

springboot启动流程过程

《springboot启动流程过程》SpringBoot简化了Spring框架的使用,通过创建`SpringApplication`对象,判断应用类型并设置初始化器和监听器,在`run`方法中,读取配... 目录springboot启动流程springboot程序启动入口1.创建SpringApplicat

树莓派启动python的实现方法

《树莓派启动python的实现方法》本文主要介绍了树莓派启动python的实现方法,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录一、RASPBerry系统设置二、使用sandroidsh连接上开发板Raspberry Pi三、运