零基础写Shell脚本
原创不易,转载请备注:https://blog.csdn.net/junfeng19950206/article/details/94291483
欢迎关注我的个人博客:http://www.offday.club/
问题背景
由于组内给安排了一个动画,这个动画其中有部分会由系统调用,从而到达某种效果。动画本身不难,但是由于系统的参与,所以必须慎重进行压测,于是萌生了写shell脚本的想法,故写本文记录。
本文偏实战型,只会介绍如何编写一个shell脚本---- 只涉及触摸以及滑动,其他不涉及,请知悉,以及自己在编写shell脚本中遇到的问题。
前提条件
- Android设备一台,无需Root,本文中我将以华为P20pro为例子;
- 最好自己有Linux环境,稍后解释为什么;
实战
模拟点击事件
本文只讲最简单的两种点击方式,如果大家对其他的方式有兴趣,可以看下我最下方的参考文章,里面有介绍。
1.input keyevent [keycode]
注意keycode是参数,比如说我们常见的home键keycode是3,back键keycode是4;
所以模拟点击home键的指令为:adb shell input keyevent 3
2.input swipe [x1][y1][x2][y2][time]
这种方式其实就是滑动事件,将滑动事件限定在一定的范围内,那么就可以认定他为点击事件。
仍然以home键为例,此方法模拟点击home键的指令为:adb shell input swipe 539 2181 524 2160 100
解释下上面的命令,其中 539 2181,代表我滑动(点击)的初始位置, 524 2160代表我滑动(点击)的末尾位置,100为我滑动(点击)的时长。
那么肯定会有人问,我点击的位置如何确定呢?你上面的539 2181的坐标是如何得到的呢?看下方介绍。
获得点击位置的坐标
这个很简单,这是Android设置开发者模式中的一个辅助功能。打开指针位置这个开关,见下图
然后,你每次点击屏幕,都会在状态栏发现有坐标的变化,比如我点击屏幕中的脉脉,得到的坐标为:535 1083
顺便说一下,开启开发者模式的方式是:在设置中,找到自己手机的版本号,连续点击5-7次(不同手机的设定不同),就可以触发开发者模式。
模拟长按事件
方式与input swipe相同,只需要将time的时间延长即可。一般Android系统默认2s为长按事件,所以大家记得事件最好不要小于2s,我一般都是设置3s左右
睡眠指令
类似上面的点击事件,执行都蛮快的,很多时候,我们点击完一个按钮,通常需要等待一段时间,就比如说,我点击按钮后,出发了我的动画,动画是有duration的,所以,必须要等动画执行完之后,再确认下一步的操作。
睡眠指令:sleep 2
其中2代表2s
循环命令
说到底,我们做脚本的最终目的,是节省人力做重复性的操作,所以如果说你不循环的话,你这个脚本貌似写的也没啥意思啊。
直接贴上循环的代码
for i in $(seq 1 10)
do
echo "222"
done
$(seq 1 10) 是从1到10;
do–done,中间的方法体是循环体,这个循环体就是打印“222”这个字符串。
脚本生成
我的脚本如下:
#!/bin/bash
for i in $(seq 1 10)
do
#长按home键
input swipe 590 2270 589 2271 2000
#睡眠2s,等待xx动画执行完毕
sleep 2
#点击按钮 xx
input swipe 793 1990 800 2000 200
#点击xx
input swipe 500 740 550 750 100
#睡眠2s,等待xx动画
sleep 2
#点击xx
input swipe 793 1990 800 2000 100
#睡眠1s
sleep 1
#点击xx
input swipe 1000 1540 1001 1541 100
#睡眠2s,等待动画执行完毕,然后执行下一次动画
sleep 2
done
使用脚本
很简单,将你写的脚本push到手机的某个目录下,直接sh xx(脚本名称)执行它,比如说我的:
C:\Users\84707>adb push C:\Users\84707\Desktop\jiaoben\key.sh sdcard/key.sh
6 KB/s (53 bytes in 0.007s)
C:\Users\84707>adb shell
xx00:/ $ cd sd
xx00:/ $ cd sdcard/
xx00:/sdcard $ sh key.sh
222
222
222
222
222
222
222
222
222
222
xx00:/sdcard $
遇到的问题
比如我在执行for循环的时候,曾经遇到过下面的问题:
后来百度发现,那是因为windows下面的换行符与Linux不符,见linux下与windows下的换行符博客。所以这也是我在文章最开头说的,为什么要有Linux环境的原因。毕竟Android底层还是Linux内核。
之前还遇到过这样类似的一个问题:
我感觉问题原因与上面for原因一致。
总结
本文偏实战,纯粹的点击事件,当然也可以通过shell脚本将动画执行过程中的内存情况抓取下来,看下是否有内存泄漏。不过这一部分暂时没有去了解,之后会再去了解下,完善本文。
感谢以下文章的作者,我从文章中学到了很多,参考文章:
Android adb 模拟滑动 按键 点击事件
android在adb下模拟长按事件
格式不兼容问题