目前测启动时间用得较多的方法:
- adb shell am start -W 只获取activity的启动时间
-W:等目标Activity启动后才返回
-n:用于设置Intent的Component
2.高速相机 以真实的用户体验去获取应用的启动时间
3.在源代码中每个启动的函数中加计时器。相加即可得启动时间
第一种可能得不到我们想要的。(csdn的APP中包含等待时间这个操作,可自行验证,此adb命令获取的时间不准确,差距较大)
第二种过于依赖硬件设备,
第三忽略掉了硬件设备或者其他因素,获取到的时间不稳定(需要开发配合等因素)
进入正题
将以第二种方法进行启动时间的获取
思路:1.首先调用uiautomator2 在app启动时进行截屏,快速截取20张。注意:前几次截图中发现如果按照等待进程结束后再次截图,会出现app已经加载完成后任然未能截图到达25张,所以采用多进程中的非阻塞方式—map_async()进行,起25个线程进行不同的截图,并以时间戳为名称,并压缩30倍后进行保存!压缩30倍是为了加快保存的时间。
2.实际对截图后的图片进行对比发现截图后的图片按大小和时间排序后能满足进行图片对比的条件,遍历路径下的截图,然后通过–getsize,getmtime 两个函数进行对图片的整理
3.选择对比图像相似度的算法:感知哈希算法。
感知哈希算法包括:
ahash:平均值哈希,速度比较快,准确度不是很高
phash:感知哈希,精确度比较高,但是速度方面较差一些
dhash:差异值哈希,精确度较高,并且速度也很快
实际中使用三个不同的算法计算结果基本一致。dhash速度最快
4.从最后一张截图即最后加载完成的图片,选出后与前面的几张截图遍历做相似度对比。
如果相似度小于80%,则判定为最后加载完成的一张。以最后一张的时间戳减去第一张的时间戳既可以得到启动时间
屏幕截屏:
def get_screenshot(savepath):
'''对屏幕截图30张后进行像素对比'''
t = time.time()
img_name = str(t) + ".png"
path = 'F:/android_test/screen_shot'
savepath = os.path.join(path,img_name)
d = u2.connect_usb('71BQ3DSD223EG')
d.app_start('net.csdn.csdnplus','.activity.MainActivity')
img = d.screenshot()
w,h = img.size
rimg = img.resize((int(w/30),int(h/30)), Image.ANTIALIAS)
rimg.save(savepath)
time.sleep(0.1)
对图片排序整理
def sort_picture(file_path):
'''获取文件名和大小i并从小到大排序'''
dir_list = os.listdir(file_path)
if not dir_list:
return
else:
dir_list = sorted(dir_list,key=lambda x:os.path.getsize(os.path.join(file_path,x)),reverse=True)
dir_list = sorted(dir_list,key=lambda x:os.path.getmtime(os.path.join(file_path,x)),reverse=True)
return dir_list
调用hash算法获取图片的相似度
def dhash(image):
image = cv2.resize(image,(9,8),interpolation=cv2.INTER_CUBIC) #图片缩放为9*8,保留结构,除去细节
gray = cv2.cvtColor(image,cv2.COLOR_RGB2GRAY) #转为256阶灰度图
dhash_str = ''
for i in range(8):
for j in range(8):
if gray[i,j]>gray[i,j+1]:
dhash_str = dhash_str + '1'
else:
dhash_str = dhash_str + '0'
# return dhash_str
result = ''
for i in range(0,64,4):
result +=''.join('%x'%int(dhash_str[i:i+4],2))
return result
def haming_distance(hash1,hash2):
n=0
#hash长度不同则返回-1代表传参出错
if len(hash1)!=len(hash2):
return -1
for i in range(len(hash1)):
if hash1[i] != hash2[i]:
n = n+1
return n
将获取到的多组数据保存为json ,可以通过highchart 展示为启动时间的波线图