当前位置: 首页 > news >正文

Android_Monkey_测试执行策略及标准

一、Monkey命令概述

NO命令说明用法解释
1 -p ALLOWED_PACKAGE用于指定某个apk,可以使用多个-p选项,但是每个-p命令选项只能用于一个apk
如果不指定-p,Monkey就会默认进行全系统测试。
 -p com.android.contacts可以进行特定apk的Monkey测试
2 -c MAIN_CATEGORY用于指定某个类,可以使用多个-c选项,但是每个-c命令选项只能用于一个类。如不指定类,Monkey就默认执行Intent.Category_LAUNCHER或者Intent.Category_MONKEY -c intent.CATEGORY_LAUNCHER所有类别:
* CATEGORY_DEFAULT
* CATEGORY_BROWSABLE
* CATEGORY_TAB
* CATEGORY_ALTERNATIVE
* CATEGORY_SELECTED_ALTERNATIVE
* CATEGORY_LAUNCHER
* CATEGORY_INFO
* CATEGORY_HOME
* CATEGORY_PREFERENCE
* CATEGORY_TEST
* CATEGORY_CAR_DOCK
* CATEGORY_DESK_DOCK
* CATEGORY_CAR_MODE 
3 --ignore-crashes忽略程序崩溃。设置此选项后,Monkey会执行完所有的事件,不会因crash而停止。 --ignore-crashes针对各种crash的忽略,监控,停止进程操作
4 --ignore-timeouts忽略程序无响应。设置此选项后,Monkey会执行完所有的事件,不会因ANR而停止。 --ignore-timeouts
5 --ignore-security-exceptions忽略证书或认证异常。设置此选项后,Monkey会执行完所有的事件,不会因认证或证书异常而停止。 --ignore-security-exceptions
6 --monitor-native-crashes监视系统中本地代码发生的崩溃。 --monitor-native-crashes
7 --ignore-native-crashes忽略本地代码导致的崩溃。设置忽略后,Monkey将执行完所有的事件,不会因此停止。 --ignore-native-crashes
8 --kill-process-after-error设置了该选项,出错的程序就会停止。 --kill-process-after-error
10 --pct-touch PERCENT调整触摸事件的百分比 --pct-touch 20所有的事件的百分比应该是100%,从Monkey测试报告中没有发现特定事件的影响:比如在U8800上进行100%的轨迹球事件测试,没有发现任何影响。
11 --pct-motion PERCENT调动作事件的百分比 --pct-motion 20
12 --pct-trackball PERCENT调整轨迹球事件的百分比 --pct-trackball 10
13 --pct-syskeys PERCENT调整系统按键事件的百分比(home\back\call\end call\volume key) --pct-syskeys 5
14 --pct-nav PERCENT调整基本导航事件的百分比 --pct-nav 5
15 --pct-majornav PERCENT调整主要导航事件的百分比(ok\cancel\menu等引发图形接口的动作) --pct-majornav 10
16 --pct-appswitch PERCENT调整启动活动的百分比 --pct-appswitch 10
17 --pct-flip PERCENT调整点击事件的百分比 --pct-flip 10
18 --pct-anyevent PERCENT调整其他类型事件的百分比(其他所有类型) --pct-anyevent 10
19 --pkg-blacklist-file PACKAGE_BLACKLIST_FILEapk黑名单,屏蔽掉黑名单中的apk。 --pkg-blacklist-file /data/blacklist/blacklist.txt1.需要新建黑白名单文件夹和同名txt文件。
2.然后在txt文件中编辑apk列表。
20 --pkg-whitelist-file PACKAGE_WHITELIST_FILEapk白名单,只测试包含在白名单中的apk --pkg-whitelist-file /data/whitelist/whitelist.txt
21 --wait-dbg一旦连接了调试器,Monkey就会停止。 --wait-dbg开发调试时使用
9 --hprof用于在Monkey事件时序的前后,在/data/misc中生成5Mb左右的profiling报告。在data\misc文件夹下产生一个“.hprof”的文件(heap-dump-tm1312534653-pid159.hprof)
22 --dbg-no-events设置该选项后,Monkey会执行初始启动,进入到测试活动中而不产生任何事件。可以设置几个apk包以及其他环境,来监视应用程序所调用的包之间的转换。 --dbg-no-events
25 --port port为Monkey开启专用端口。之后Monkey就不会执行,此时你就可以像Monkey一样乱点,Monkey会输出你点击后的回馈信息。如果你打完命令后,模拟器没有启动你所要启动的包,需要自己启动你在-p中指定的应用.开启专用端口后,人可以模拟Monkey进行操作。用于开发手动重现问题。
26 -s SEED随机数生成器的seed值。如果用相同的seed值再次运行Monkey,它将生成相同的事件时序。 -s 100主要帮助开发排查错误并验证修改的代码
27 -v每个-v都将增加反馈信息的级别。共3个级别,因此,-v -v -v可以提供最详细的设置信息。 -v -v -v使用3个v命令,可以在Monkey测试报告中看最详细的设置信息
28 --throttle MILLISEC事件之间插入的固定延迟。通过这个选项可以减缓Monkey的执行速度。如果不指定,Monkey将尽可能快的产生并执行事件。 --throttle 3000设置事件间的时间延时
29 --randomize-throttle事件之间插入随机延时。 --randomize-throttle
30 COUNT执行数99999执行事件次数

 二、死机log信息汇总

NOlog信息类型可以解决哪些问题如何获得不同的log信息说明如何导出该文件
1LogcatApp crash通过命令获得:
#adb shell logcat –v time > c:\logcat-log.txt
可以通过命令导出
2BugreportApp crash获取bugreport和dumpstate:
#adb shell bugreport > bugreport-yyyy-mm-dd-hh-mm-ss.txt
#adb shell dumpstate > dumpstate-yyyy-mm-dd-hh-mm-ss.txt
dumpstate是一个具体对系统的各个信息进行收集的程序
bugreport则会以服务的形式来启动dumpstate,它不完成具体的收集操作,只负责将dumpstate的信息通过socket的形式进行接收并重定向出来。它存储在/mnt/sdcard/bugreports或者/data/bugreports或/HWUserData
可以实现自动导出
3Dump logApp crash从qpst或者dump工具导出1.利用QPST efs工具,手动创建dump目录和一个空白的debug.dbg文件在dump目录下。
2.通过QXDM将NV905设置为0(0表示进入dump,1表示重启,2或者未激活表示不做任何动作)
只能手动导出
4ANR traceApp not respondingTrace.txt文件保存在在/data/anr中,可以通过命令导出可以通过命令导出
5DropboxApp crash、kernel保存在/data/system/dropbox,该目录下有4类信息对分析比较有帮助:
1.APANIC_CONSOLE@xxxxxxxxxxxxx.txt.gz
2.APANIC_THREADS@xxxxxxxxxxxxx.txt.gz
3.system_server_watchdog@xxxxxxxxxxxxx.txt
4.system_server_crash@xxxxxxxxxxxxx.txt
APANIC_CONSOLE@xxxxxxxxxxxxx.txt.gz:记录的是核心发生死机的时候的核心LOG
APANIC_THREADS@xxxxxxxxxxxxx.txt.gz:核心发生死机的时候各个线程在核心中的调用stack
system_server_watchdog@xxxxxxxxxxxxx.txt:记录了发生死机的时刻上系统对SystemServer中的各个线程的调用stack进行记录的一个文件
system_server_crash@xxxxxxxxxxxxx.txt:记录了发生死机的时刻上SystemServer中的具体死机的异常点
可以实现自动导出
6TombstonesNative保存在/data/tombstones,该目录下生成一个tombstone_xx文件Tombstone文件是异常进程的调用栈信息,在该进程异常退出或崩溃时由android的后台进程debuggerd负责生成可以实现自动导出
7CoredumpNative一是编译器支持:要产生coredump文件,在android编译的时候要加上调试-g选项以支持coredump文件的生成。
二是环境参数支持:可以修改<工程目录>system/core/rootdir下的init.rc文件来支持coredump文件的产生。
这是一种常见的linux收集进程异常信息的机制。用户态进程在中止时将产生信号,linux内核根据信号的类型来决定是否要产生coredump文件。Android上保留了这种机制,但默认是关闭的。要使进程产生coredump文件,还要满足两个条件:一是编译器支持,二是环境参数支持。目前没有开发使用过该信息去处理死机问题
8KmsgKernel、Native保存在cat/proc/kmsg来查看sysrq信息,它用来收集内核和用户态进程信息。
需要通过adb命令:
打开这个功能,运行:
# echo 1 > /proc/sys/kernel/sysrq
关闭这个功能:
# echo 0 > /proc/sys/kernel/sysrq
sysrq信息:
只要内核没有被完全锁住,不管内核在做什么事情,使用sysrq可以立即打印出内核的信息,当然也包括用户态进程的信息。
如果系统出现挂起的情况或者在诊断一些和内核相关,比较怪异,比较难重现的问题的时候,亦可使用sysrq方式来收集信息。
可以实现自动导出,但是需要先开启该功能。
9DontpanicKernel有三个文件保存在在/data/dontpanic/目录下:
apanic_console:记录内核的控制台信息
apanic_threads:记录的是panic时内核寄存器、调用栈等信息
apanic_sysinfo:记录meminfo、zoneinfo、slabinfo、vmallocinfo等信息。
apanic_sysinfo:
在apanic中打开这些文件并用printk读取到内核log_buf中,然后再利用apanic的写入flash机制将这些信息分别保存到/data/dontpanic/目录下
apanic_sysinfo需要开发手动增加的,而非系统自动生成。
10Mondem logmondem通过QPST工具连接手机打开/err文件,并导出其中的log文件通过QPST获得的高通死机log err文件夹下的内容(适用于7x25/7x27平台)通过QPST可以获得err文件夹下的内容,该目录下的内容是ARM9在死机的时候记录在ARM9侧的LOG记录,通过该目录可以简单的判断一下ARM9侧的死机情况。只能手动导出

三、参考数据

NO手机延时(ms执行时间(ms)执行时间(minute注入事件数事件执行频率:个/分钟Monkey停止原因
1HTC无延时11480651917205899at com.htc.album.DisplayManager.onMenuItemSelected
215515282619401750android.app.ActivityThread.performLaunchActivity
310028591714937894at com.android.htcdialer.BaseSmartSearchList.onKeyDown
426794784537625843at android.app.ActivityThread.performLaunchActivity
555335998229892java.lang.RuntimeException
at android.app.ActivityThread.performResumeActivity
67254231210348856java.lang.NullPointerException
at com.htc.android.worldclock.DeskClock.dispatchKeyEvent
714809352518897766java.lang.NullPointerException
at com.google.android.street.StreetView.setPanoramaConfig
810682661812814720ANR in com.htc.launcher (com.htc.launcher/.Launcher)
925753714334454803java.lang.RuntimeException: Unable to resume activity
at android.app.ActivityThread.performResumeActivity
10589575108492864android.view.WindowManager$BadTokenException: Unable to add window
at android.view.ViewRoot.setView
1Nexus无延时61098610189061857java.lang.IllegalStateException: Calling RS with no Context active.
258584710168621727ANR in com.google.android.voicesearch
3238446240717571806ANR in com.google.android.apps.maps:driveabout 
475105113180851445ANR in com.google.android.apps.maps:driveabout 
5118013820318441619OutOfMemory
6100448717254981523java.lang.IllegalArgumentException
at com.google.android.gles_jni.EGLImpl._eglCreateWindowSurface
7131602222323901477ANR in com.google.android.apps.maps
8222782537636411714java.lang.IllegalArgumentException
at com.google.android.gles_jni.EGLImpl._eglCreateWindowSurface
9129126422364561694ANR in com.google.android.apps.maps 
10120091920351251755ANR in com.google.earth (com.google.earth/.EarthActivity)
1C8800(大内存)无延时21924742958809ANR in com.android.camera 
272382112481035java.lang.RuntimeException: lock failed
at android.hardware.Camera.lock(Native Method)
1U8800无延时24150243800944java.lang.NullPointerException
at com.erdo.unicom.GameMIDlet$10.onClick
2486920886461065java.lang.RuntimeException: An error occured while executing doInBackground
at android.os.AsyncTask$3.done
311832622019594994SocketTimeoutException
at org.apache.harmony.luni.platform.OSNetworkSystem.connectStreamWithTimeoutSocketImpl(Native Method)
4158476350051895android.view.WindowManager$BadTokenException
at android.view.ViewRoot.setView
513316722097945java.lang.RuntimeException: Unable to resume activity
at android.app.ActivityThread.performResumeActivity
6428677782271151java.lang.NullPointerException
at com.erdo.unicom.WelcomeForm.onKeyUp
7371265669911130java.lang.RuntimeException: Unable to pause activity {com.android.contacts/com.android.contacts.commonext.GroupGridActivity}
at android.app.ActivityThread.performPauseActivity
852676398633983java.lang.NullPointerException
at com.huawei.inputmethod.hwpal.PinyinIME.showCandidateWindow
9591910108633875android.view.WindowManager$BadTokenException
10270742575611676java.lang.NullPointerException
at com.erdo.unicom.WelcomeForm.onKeyUp

相关文章:

Android_Monkey_测试执行策略及标准

一、Monkey命令概述 NO命令说明用法解释1 -p ALLOWED_PACKAGE用于指定某个apk&#xff0c;可以使用多个-p选项&#xff0c;但是每个-p命令选项只能用于一个apk 如果不指定-p&#xff0c;Monkey就会默认进行全系统测试。 -p com.android.contacts可以进行特定apk的Monkey测试2 …...

windows安装nginx

官网提供的下载地址&#xff1a;nginx: download nginx1.25.2下载地址&#xff1a;http://nginx.org/download/nginx-1.25.2.zip 直接运行nginx.exe会闪退&#xff0c;我们还得使用cmd/git bash/power shell 命令进行启动&#xff1b; 个人更喜欢git bash&#xff1b; 运行命…...

Java日期的学习篇

关于日期的学习 目录 关于日期的学习JDK8以前的APIDate Date常用APIDate的API应用 SimpleDateFormatSimpleDateFormat常用API测试 反向格式化(逆操作)测试 训练案例需求(秒杀活动)实现 Calendar需求痛点常见API应用测试 JDK8及以后的API(修改与新增)为啥学习(推荐使用)新增的AP…...

spark on hive

需要提前搭建好hive&#xff0c;并对hive进行配置。 1、将hive的配置文件添加到spark的目录下 cp $HIVE_HOME/conf/hive-site.xml $SPARK_HOME/conf2、开启hive的hivemetastore服务 提前创建好启动日志存放路径 mkdir $HIVE_HOME/logStart nohup /usr/local/lib/apache-hi…...

Linux Vi编辑器基础操作指南

Linux Vi编辑器基础操作指南 Linux中的Vi是一个强大的文本编辑器&#xff0c;虽然它有一些陡峭的学习曲线&#xff0c;但一旦掌握了基本操作&#xff0c;它就变得非常高效。以下是Vi编辑器的一些基本用法&#xff1a; 打开Vi编辑器&#xff1a; vi 文件名退出Vi编辑器&#xff…...

WEB3 创建React前端Dapp环境并整合solidity项目,融合项目结构便捷前端拿取合约 Abi

好 各位 经过我们上文 WEB3 solidity 带着大家编写测试代码 操作订单 创建/取消/填充操作 我们自己写了一个测试订单业务的脚本 没想到运行的还挺好的 那么 今天开始 我们就可以开始操作我们前端 Dapp 的一个操作了 在整个过程中 确实是没有我们后端的操作 或者说 我们自己就…...

rust运算

不同类型不能放在一起运算。如果非要计算&#xff0c;必须先强转成一个类型再运算。 一 、数字运算 &#xff08;一&#xff09;算术运算 a 10且b 5 名称运算符范例加ab的结果为15减-a-b的结果为5乘*a*b的结果为50除/a / b的结果为2求余%a % b的结果为0 Rust语言不支持自增…...

游戏引擎,脚本管理模块

编辑器中删除脚本&#xff0c;然后立即恢复删除的脚本关系正常编辑器中删除脚本&#xff0c;关掉编辑器&#xff0c;然后只恢复脚本&#xff0c;不恢复meta,然后再打开编辑器关系丢失编辑器中删除脚本&#xff0c;关掉编辑器&#xff0c;然后恢复脚本且恢复meta,然后再打开编辑…...

2023年7月工作经历三

年龄危机 传言&#xff1a;程序员干不过37岁&#xff0c;架构师干不过45岁&#xff0c;总监干不过55岁。我已经43岁了。当总监需要机遇&#xff1b;首下犯错&#xff0c;会扣领导工资&#xff1b;有的公司总监还需要出资。为了方便以后当总监&#xff0c;我还在超音速带过小团…...

1801_codesys产品主样本了解

全部学习汇总&#xff1a; GreyZhang/g_codesys: some codesys learning notes (github.com) 有些技术、学术的成长&#xff0c;氛围也是很重要的。我觉得工业控制&#xff0c;德国做得算是世界上很突出的。而这个巴伐利亚&#xff0c;更是突出中的佼佼者了。从这里的介绍看&am…...

flink的计时器

背景 在flink中&#xff0c;我们经常使用ontimer计时器实现很多逻辑的功能&#xff0c;常见的比如某个传感器温度增加连续超过1分钟的告警输出等&#xff0c;本文就来简单记录下计时器的作用 计时器 ontimer的定义 public void onTimer(long timestamp, OnTimerContext ctx…...

@SpringBootApplication剖析

一、前言 在SpringBoot项目中启动类必须加一个注解SpringBootApplication&#xff0c;今天我们来剖析SpringBootApplication这个注解到底做了些什么。 二、SpringBootApplication简单分析 进入SpringBootApplication源代码如下&#xff1a; 可以看出SpringBootApplication是…...

浅谈wor2vec,RNN,LSTM,Transfermer之间的关系

浅谈wor2vec&#xff0c;RNN&#xff0c;LSTM&#xff0c;Transfermer之间的关系 今天博主谈一谈wor2vec&#xff0c;RNN&#xff0c;LSTM&#xff0c;Transfermer这些方法之间的关系。 首先&#xff0c;我先做一个定位&#xff0c;其实Transfermer是RNN&#xff0c;LSTM&…...

【11】c++设计模式——>单例模式

单例模式是什么 在一个项目中&#xff0c;全局范围内&#xff0c;某个类的实例有且仅有一个&#xff08;只能new一次&#xff09;&#xff0c;通过这个唯一的实例向其他模块提供数据的全局访问&#xff0c;这种模式就叫单例模式。单例模式的典型应用就是任务队列。 为什么要使…...

深度学习-卷积神经网络-AlexNET

文章目录 前言1.不同卷积神经网络模型的精度2.不同神经网络概述3.卷积神经网络-单通道4.卷积神经网络-多通道5.池化层6.全连接层7.网络架构8.Relu激活函数9.双GPU10.单GPU模型 1.LeNet-52.AlexNet1.架构2.局部响应归一化&#xff08;VGG中取消了&#xff09;3.重叠/不重叠池化4…...

人机关系不是物理关系也不是数理关系

人机关系是一种复杂的社会技术系统&#xff0c;涉及到人类和机器、环境之间的相互作用和影响。它不仅限于物理接触和数理规律&#xff0c;同时还包括了思维、情感、意愿等方面的交流和互动。在人机关系中&#xff0c;人类作为使用者和机器作为工具&#xff08;将来可能会上升到…...

<html dir=ltr>是什么意思?

<html dirltr>的意思是&#xff1a; 文字默认从左到右排列 说明&#xff1a; HTML--超级文本标记语言 dir 属性 -- (文字的)排列方式属性 取值&#xff1a; ltr -- 代表左到右的排列方式 rtl -- 代表右到左的排列方式 默认值:ltr 示例&#xff1a; ltr左到右的对…...

工厂模式:简化对象创建的设计思想 (设计模式 四)

引言 在软件开发中&#xff0c;我们经常需要创建各种对象实例来满足不同的需求。通常情况下&#xff0c;我们会使用new关键字直接实例化对象&#xff0c;但这种方法存在一些问题&#xff0c;比如对象的创建逻辑分散在代码中&#xff0c;难以维护和扩展&#xff0c;同时也违反了…...

【2023最新】微信小程序中微信授权登录功能和退出登录功能实现讲解

文章目录 一、讲解视频二、小程序前端代码三、后端Java代码四、备注 一、讲解视频 教学视频地址&#xff1a; 视频地址 二、小程序前端代码 // pages/profile/profile.js import api from "../../utils/api"; import { myRequest } from "../../utils/reques…...

复习 --- C++运算符重载

.5 运算符重载 运算符重载概念&#xff1a;对已有的运算符重新进行定义&#xff0c;赋予其另外一种功能&#xff0c;以适应不同的数据类型 4.5.1 加号运算符重载 作用&#xff1a;实现两个自定义数据类型相加的运算 1 #include<iostream>2 using namespace std;3 /…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

Sklearn 机器学习 缺失值处理 获取填充失值的统计值

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...

【Ftrace 专栏】Ftrace 参考博文

ftrace、perf、bcc、bpftrace、ply、simple_perf的使用Ftrace 基本用法Linux 利用 ftrace 分析内核调用如何利用ftrace精确跟踪特定进程调度信息使用 ftrace 进行追踪延迟Linux-培训笔记-ftracehttps://www.kernel.org/doc/html/v4.18/trace/events.htmlhttps://blog.csdn.net/…...