GT君此次给大家送来了强力的安卓GT3.1版本更新。在本次更新中,采用了在被测应用内嵌SDK的方式来获取流畅值,解决了2.x版本测试应用流畅值必须root手机的痛点。除此之外,GT3.1版本引入了Hook功能,可以获取更加丰富详细的应用信息,例如页面加载速度,卡顿代码调用栈、IO使用情况等。
前言 在启动app的时候,如果直接做下一步点击操作,经常会报错,于是我们会在启动完成的时候加sleep。 那么问题来了,这个sleep时间到底设置多少合适呢?设置长了,就浪费时间,设置短了,就会找不到元素报错了。 这个时候我们可以用wait_activity的语法,等到你想点击的页面activity出现了,再点击,可以有效的节省时间。 一、wait_activity 1.查看源码 ``` def wait_activity(self, activity, timeout, interval=1):
作者介绍了一种比较隐蔽的 BadTokenException 场景,并给出了初步解决方案,值得一看。
package com.robotium.solo; import android.app.Activity; import android.content.Context; import android.os.SystemClock; import android.view.ContextThemeWrapper; import android.view.View; import android.view.inputmethod.InputMethodManager; import android.widget.EditText;
最近工作中一直和 SWF(Amazon 的 Simple Work Flow)打交道,在一个基于 SWF 的工作流框架上面开发和修 bug。SWF 的 activity 超时时间是 5 分钟,在 activity task 开始执行以后,activity worker 需要主动发送心跳请求告知 service 端:“我还活着,我还在干活”,如果出现超过 5 分钟(可以配置)没有心跳,SWF 的 service 端就认为,你已经挂了,我需要把这个 activity 安排到别的 activity worker 上来执行了。借用 AWS 官网的一张图:
许仙小时候最喜欢吃又甜又软的汤圆了,一次一颗汤圆落入西湖,被一条小白蛇衔走了。十几年后,一位身着白衣、有青衣丫鬟相伴的美丽女子与许仙相识了,她叫白娘子。白娘子聪明又善良,两个人很快走到了一起。靠着自己的力量,他们过上了幸福的生活。一天,僧人法海找到许仙,警告说白娘子是一条修行千年的蛇精,许仙不信。到了端午节,勉强喝下了雄黄酒的白娘子现了原形,许仙被吓得昏死过去。原来白娘子真的是之前吃下许仙汤圆的小蛇。白娘子辛苦救回了许仙的性命,但之后法海却以保护许仙的名义将他囚禁起来,白娘子与小青召集虾兵蟹将,要逼法海放出许仙。突然一座宝塔从天而降,把白娘子镇在了塔下…… 想必小伙伴和童鞋们都听过,或者是看过这个故事,是多么的痴情感人,尤其是千年等一回的歌曲是一个经典音乐。好了废话还是少说,进入今天的主题--元素等待 前边介绍了APP页面元素的识别定位、操作等技术,可能你会觉得掌握这两项技术就可以实施APP自动化了,答案基本是这样的,毕竟元素定位和操作是核心技术。但是,在某些场景,脚本的运行并非预期那样,如,要操作的元素用常规方法无法识别、元素可以识别但在脚本运行时却未如期而至等。为了解决这些疑难杂症,接下来内容将会介绍处理这些问题的通用方法。 在本节,主要介绍元素等待的使用方法和场景,该方法是开发稳定、高容错性自动化脚本的前提。
https://www.cnblogs.com/iteacat/p/12569008.html
常规类参数包括帮助参数和日志信息参数。帮助参数用于输出Monkey命令使用指导;日志信息参数将日志分为三个级别,级别越高,日志的信息越详细。
1. 前言 卡顿问题,就是在主线程上无法响应用户交互的问题。如果一个 App 时不时地就给你卡一下,有 时还长时间无响应,这时你还愿意继续用它吗?所以说,卡顿问题对 App 的伤害是巨大的,也是 我们
前边几篇介绍了Monkey以及Monkey的事件,今天就给小伙伴们介绍和分享一下Monkey的参数。
OKhttp3是一个非常强大的Android网络框架,它是由Square公司开发并开源的,很大Android开发者都会使用到,所以我也要来学学。
这个系列我做了协程和Flow开发者的一系列文章的翻译,旨在了解当前协程、Flow、LiveData这样设计的原因,从设计者的角度,发现他们的问题,以及如何解决这些问题,pls enjoy it。
如果执行的协程任务中 , 需要 执行 关闭文件 , 输入输出流 等操作 , 推荐使用 try…catch…finally 代码块 , 在 finally 代码块中的代码 , 即使是协程取消时 , 也会执行 ;
任何数据库都有死锁,MYSQL的死锁有相关的工具,或者去日志查找,postgresql的死锁又怎么搞,今天的来说说。
在Android开发中,处理异步任务一直是一项挑战。以往的回调和线程管理方式复杂繁琐,使得代码难以维护和阅读。Jetpack引入的Coroutine(协程)成为了异步编程的新标杆。本文将深入探讨Android Jetpack Coroutine的使用、原理以及高级用法,助您在异步编程的路上游刃有余。
上一篇文章中,傻蛋提到了BroadcastReceiver是Android中最轻薄、最短小的组件,它的对象生命周期十分短暂,经过傻蛋测试在BroadcastReceiver中让线程睡眠10秒(Activity是5秒钟)的话,Android就会弹出错误(和Activity超时的错误相同),同时需要注意的是Activity、Service和BroadcastReceiver都是运行在本进程的主线程里面的。通过这个测试让傻蛋进一步产生了疑问,如果在Service中处理一个长时间的任务会怎么样?
在上一篇APP自动化系列文章:APP自动化测试系列之Appium介绍及运行原理,主要介绍appium的运行原理。
Monkey是Android中的一个命令行工具,可以运行在模拟器里或者现实设备中,向系统发送伪随机的用户事件流(点击、滑动、Application切换、横竖屏、应用关闭)实现对正在开发的应用程序进行压力测试。monkey测试是一种为了测试软件的稳定性,健壮性的快速有效的方法,只针对Activity做测试,不能对Service做测试。
在调用完setResult以及finish之后,开始启动Activity销毁以及结果返回的流程。
ANR:Application Not Responding,即应用无响应,Android系统对于一些事件需要在一定的时间范围内完成,如果超过预定时间能未能得到有效响应或者响应时间过长,都会造成ANR。一般地,这时往往会弹出一个提示框,告知用户当前xxx未响应,用户可选择继续等待或者Force Close。
注意:还有一点,非常重要,一个 Android 的变更细节!当 API >12 时,需要加入 screenSize 属性,否则屏幕切换时即使你设置了 orientation 系统也会重建 Activity !
1.java代码中不出现中文,最多注释中可以出现中文 2.局部变量命名、静态成员变量命名 只能包含字母,名字中每个单词首字母都为大写(第一个单词首字母除外),其他都为小写 3.常量命名 只能包含字母和_,字母全部大写,单词之间用_隔开 4.layout中的id命名 命名模式为:view缩写_模块名称_view的逻辑名称 view的缩写详情如下 LayoutView:lv RelativeView:rv TextView:tv ImageView:iv ImageButton:im Button:btn 5.activity中的view变量命名 命名模式为:逻辑名称+view缩写 建议:如果layout文件很复杂,建议将layout分成多个模块,每个模块定义一个moduleViewHolder,其成员变量包含所属view 6.strings.xml中的id命名 命名模式:activity名称_功能模块名称_逻辑名称/activity名称_逻辑名称/common_逻辑名称 strings.xml中,使用activity名称注释,将文件内容区分开来 7.drawable中的图片命名 命名模式:activity名称_逻辑名称/common_逻辑名称 7.styles.xml:将layout中不断重现的style提炼出通用的style通用组件,放到styles.xml中; 8.使用layer-list和selector 9.图片尽量分拆成多个可重用的图片 10.服务端可以实现的,就不要放在客户端 11.引用第三方库要慎重,避免应用大容量的第三方库,导致客户端包非常大 12.处理应用全局异常和错误,将错误以邮件的形式发送给服务端 13.图片的.9处理 14.使用静态变量方式实现界面间共享要慎重 15.Log(系统名称 模块名称 接口名称,详细描述) 16.单元测试(逻辑测试、界面测试) 17.不要重用父类的handler,对应一个类的handler也不应该让其子类用到,否则会导致message.what冲突 18.activity中在一个View.OnClickListener中处理所有的逻辑 19.strings.xml中使用%1$s实现字符串的通配 20.如果多个Activity中包含共同的UI处理,那么可以提炼一个CommonActivity,把通用部分叫由它来处理,其他activity只要继承它即可 21.使用button+activitgroup实现tab效果时,使用Button.setSelected(true),确保按钮处于选择状态,并使activitygroup的当前activity与该button对应 22.如果所开发的为通用组件,为避免冲突,将drawable/layout/menu/values目录下的文件名增加前缀 23.数据一定要效验,例如 字符型转数字型,如果转换失败一定要有缺省值; 服务端响应数据是否有效判断;
ANR (Application Not Responding) ANR定义:在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:Application Not Responding)对话框。用户可以选择“等待”而让程序继续运行,也可以选择“强制关闭”。所以一个流畅的合理的应用程序中不能出现anr,而让用户每次都要处理这个对话框。因此,在程序里对响应性能的设计很重要,这样系统不会显示ANR给用户。 默认情况下,在android中Activity的最长执行时间是5秒,BroadcastReceiver的最长执行时间则是10秒。 第一:什么会引发ANR? 在Android里,应用程序的响应性是由Activity Manager和WindowManager系统服务监视的 。当它监测到以下情况中的一个时,Android就会针对特定的应用程序显示ANR: 1.在5秒内没有响应输入的事件(例如,按键按下,屏幕触摸) 2.BroadcastReceiver在10秒内没有执行完毕 造成以上两点的原因有很多,比如在主线程中做了非常耗时的操作,比如说是下载,io异常等。 潜在的耗时操作,例如网络或数据库操作,或者高耗时的计算如改变位图尺寸,应该在子线程里(或者以数据库操作为例,通过异步请求的方式)来完成。然而,不是说你的主线程阻塞在那里等待子线程的完成——也不是调用 Thread.wait()或是Thread.sleep()。替代的方法是,主线程应该为子线程提供一个Handler,以便完成时能够提交给主线程。以这种方式设计你的应用程序,将能保证你的主线程保持对输入的响应性并能避免由于5秒输入事件的超时引发的ANR对话框。 第二:如何避免ANR? 1、运行在主线程里的任何方法都尽可能少做事情。特别是,Activity应该在它的关键生命周期方法(如onCreate()和onResume())里尽可能少的去做创建操作。(可以采用重新开启子线程的方式,然后使用Handler+Message的方式做一些操作,比如更新主线程中的ui等) 2、应用程序应该避免在BroadcastReceiver里做耗时的操作或计算。但不再是在子线程里做这些任务(因为 BroadcastReceiver的生命周期短),替代的是,如果响应Intent广播需要执行一个耗时的动作的话,应用程序应该启动一个 Service。(此处需要注意的是可以在广播接受者中启动Service,但是却不可以在Service中启动broadcasereciver,关于原因后续会有介绍,此处不是本文重点) 3、避免在Intent Receiver里启动一个Activity,因为它会创建一个新的画面,并从当前用户正在运行的程序上抢夺焦点。如果你的应用程序在响应Intent广 播时需要向用户展示什么,你应该使用Notification Manager来实现。 总结:anr异常也是在程序中自己经常遇到的问题,主要的解决办法自己最常用的就是不要在主线程中做耗时的操作,而应放在子线程中来实现,比如采用Handler+mesage的方式,或者是有时候需要做一些和网络相互交互的耗时操作就采用asyntask异步任务的方式(它的底层其实Handler+mesage有所区别的是它是线程池)等,在主线程中更新UI。
ANR定义:在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:Application Not Responding)对话框。用户可以选择“等待”而让程序继续运行,也可以选择“强制关闭”。所以一个流畅的合理的应用程序中不能出现anr,而让用户每次都要处理这个对话框。因此,在程序里对响应性能的设计很重要,这样系统不会显示ANR给用户。
作者:matrix 被围观: 3,901 次 发布时间:2020-02-11 分类:零零星星 | 一条评论 »
Android ANR(Application Not Responding)的分析
最近为了解决ABP集成CAP时无法通过拦截器启用工作单元的问题,从小伙伴那里学了一招。借助DiagnossticSource,可以最小改动完成需求。关于DiagnosticSource晓东大佬18年在文章 在 .NET Core 中使用 Diagnostics (Diagnostic Source) 记录跟踪信息就有介绍,文章开头就说明了Diagnostics 一直是一个被大多数开发者忽视的东西。是的,我也忽略了,这个好东西,有必要学习一下,下面就和大家简单聊一聊System.Diagnostics.DiagnosticSource在.NET上的应用。
本人普通本科毕业,计算机专业,从事Android开发也有3年了。 2020年因为疫情的原因,整个互联网行业都进入了低谷期,许多公司都进行了裁员,而我所在的公司也不例外。就这样,我离开了工作了3年多的公司。开启了2020年的面试旅程。
界面布局LinerLayout线性布局,ImageView控件,EditText控件 hint属性提示信息,Button控件。
Activity是Android的四大组件之一,也是平时我们用到最多的一个组件,可以用来显示View。官方的说法是Activity一个应用程序的组件,它提供一个屏幕来与用户交互,以便做一些诸如打电话、发邮件和看地图之类的事情,它提供屏幕进行交互。每个Activity都会获得一个用于绘制其用户界面的窗口,窗口可以充满哦屏幕也可以小于屏幕并浮动在其他窗口之上。一个应用通常是由多个彼此松散联系的Activity组成,一般会指定应用中的某个Activity为主活动,也就是说首次启动应用时给用户呈现的Activity。
首先说3个测试内存泄露的三个动作,内存GC,退出测试app,关闭测试APP的进程的区别;
jeb 安卓反编译工具,用于逆向工程或审计APK文件,可以提高效率减少许多工程师的分析时间,能将Dalvik字节码反编译为Java源代码
现在Android 市面上很火的当然是 Retrofit+RxJava + OkHttp, 功能强大,简单易用,因此选用这套方案来改造网络库。
Dex文件用的到的类和安装包APK里面各种资源文件一般都比较小,但是读取非常频繁。
一、 什么是工作流 Georgakopoulos给出的工作流定义是:工作流是将一组任务组织起来以完成某个经营过程:定义了任务的触发顺序和触发条件,每个任务可以由一个或多个软件系统完成,也可以由一个或一组人完成,还可以由一个或多个人与软件系统协作完。我们来看OA系统中的一个工作流。
如今安卓开发不像前几年那么热门,但是高级人才依然紧缺,大家看着这句话是不是很熟悉,因为 web 高级人才也紧缺,c++ 高级人才一样紧缺,那么到了人工智能时代,人工智能时代的高级人才也同样会紧缺!似乎是高级人才的人在其他领域也是高级人才,而不是因为选择了热门才会一帆风顺。文末有免费福利哦
建议:假设layout文件非常复杂,建议将layout分成多个模块,每一个模块定义一个moduleViewHolder。其成员变量包括所属view
对于 .NET 的每个新版本,我们都希望发布一篇博客文章,重点介绍网络的一些变化和改进。在这篇文章中,我很高兴谈论 .NET 6 中的变化。
图像的显示可以理解为先经过CPU的计算、排版、编解码等操作,然后交有GPU去完成渲染放入缓冲中,当视频控制器受到vSync时会从缓冲中读取已经渲染完成的帧并显示到屏幕上。
由于Android Hook技术底层原理其实说白了就是java的反射和动态代理,所以这里我们先来讲一下代理模式。
2015年伊始,Google发布了关于Android性能优化典范的专题, 一共16个短视频,每个3-5分钟,帮助开发者创建更快更优秀的Android App。课程专题不仅仅介绍了Android系统中有关性能问题的底层工作原理,同时也介绍了如何通过工具来找出性能问题以及提升性能的建议。主要从三个 方面展开,Android的渲染机制,内存与GC,电量优化。下面是对这些问题和建议的总结梳理。
不管是Activity,Dialog还是Toast,它们视图都是附加在window上的,window才是view的直接管理者。
由于手机流量有限,又要加快app的运行效率,因此好的app都有做图片缓存。图片缓存说起来简单,做起来就用到很多知识点,可算是集Android技术之大全了。只要理解图片缓存的算法,并加以实践把它做好,我觉得差不多可以懂半个Android的开发。
Handler、Looper、MessageQueue基本了解可以看下这篇文章 Android源码解读-Handler、Loop、MessageQueue
Desired Capability是编码在JSON对象中的键和值,在请求新的自动化会话时由Appium客户端发送到服务器。
二、Monkey 测试的目的? 该工具用于进行压力测试。 然后开发人员结合monkey 打印的日志 和系统打印的日志,结局测试中出现的问题。
领取专属 10元无门槛券
手把手带您无忧上云