关于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

相关文章

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

python中Hash使用场景分析

《python中Hash使用场景分析》Python的hash()函数用于获取对象哈希值,常用于字典和集合,不可变类型可哈希,可变类型不可,常见算法包括除法、乘法、平方取中和随机数哈希,各有优缺点,需根... 目录python中的 Hash除法哈希算法乘法哈希算法平方取中法随机数哈希算法小结在Python中,

Java Stream的distinct去重原理分析

《JavaStream的distinct去重原理分析》Javastream中的distinct方法用于去除流中的重复元素,它返回一个包含过滤后唯一元素的新流,该方法会根据元素的hashcode和eq... 目录一、distinct 的基础用法与核心特性二、distinct 的底层实现原理1. 顺序流中的去重

关于MyISAM和InnoDB对比分析

《关于MyISAM和InnoDB对比分析》:本文主要介绍关于MyISAM和InnoDB对比分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录开篇:从交通规则看存储引擎选择理解存储引擎的基本概念技术原理对比1. 事务支持:ACID的守护者2. 锁机制:并发控制的艺

nginx启动命令和默认配置文件的使用

《nginx启动命令和默认配置文件的使用》:本文主要介绍nginx启动命令和默认配置文件的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录常见命令nginx.conf配置文件location匹配规则图片服务器总结常见命令# 默认配置文件启动./nginx

Nexus安装和启动的实现教程

《Nexus安装和启动的实现教程》:本文主要介绍Nexus安装和启动的实现教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Nexus下载二、Nexus安装和启动三、关闭Nexus总结一、Nexus下载官方下载链接:DownloadWindows系统根

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis

Python主动抛出异常的各种用法和场景分析

《Python主动抛出异常的各种用法和场景分析》在Python中,我们不仅可以捕获和处理异常,还可以主动抛出异常,也就是以类的方式自定义错误的类型和提示信息,这在编程中非常有用,下面我将详细解释主动抛... 目录一、为什么要主动抛出异常?二、基本语法:raise关键字基本示例三、raise的多种用法1. 抛

Java中实现线程的创建和启动的方法

《Java中实现线程的创建和启动的方法》在Java中,实现线程的创建和启动是两个不同但紧密相关的概念,理解为什么要启动线程(调用start()方法)而非直接调用run()方法,是掌握多线程编程的关键,... 目录1. 线程的生命周期2. start() vs run() 的本质区别3. 为什么必须通过 st