Android脱离USB执行Shell脚本的方法
前言:
安卓自动化测试过程中,经常需要测试机脱离 Usb执行相关 shell 脚本,之前在网上看了很多的例子,没有真正可以直接断开 USB执行 shell 脚本的实例,所以一直也没太搞明白,最近有时间自己捉摸了并且测试了一下,发现安卓脱离 USB 测试 sh 脚本是可行的,最后将方法和步骤总结整理一下分享给大家,亲测可行!!!
一、脚本试例:
#!/system/bin/sh
#后台抓取 log 至 logcat.log
logcat-b main -b system -b radio -b events -vtime >logcat.log &
i=0
#count为测试次数
count=20
while(($i<$count))
do
date +%H:%M:%S>>other.txt
sleep 1
\#统计次数
echo count:$i>count.txt
\#按电源键点亮屏幕
input keyevent 26
sleep 2
input tap 120 120
sleep 4
cat/sys/devices/virtual/thermal/thermal\_zone4/temp>>other.txt
sleep 1
\#启动电话
am start -ncom.android.dialer/com.asu.mdialer.MDialtactsActivity
sleep 6
\#滑动进入拨号盘
input swipe 230 100 50 100
sleep 2
input swipe 230 100 50 100
sleep 2
\#输入110
input tap 42 42
sleep 2
input tap 42 42
sleep 2
input tap 120 210
sleep 2
\#获取光机状态值
cat/sys/class/bst/bml050/status/startup>>open.txt
sleep 1
input keyevent 26
sleep 2
input tap 120 120
sleep 4
cat/sys/class/bst/bml050/status/startup>>close.txt
sleep 2
i=$(($i+1))
done
二、脚本执行
脚本写好,我们就可以开始测试了,具体步骤如下:
adb root
adb remount
adb pushtest.sh /data/
adb shell
cd data
chmod 777test.sh
nohup ./test.sh &
(注意:nohup**是永久执行,&是指在后台运行**
运行 nohup —help
Run COMMAND, ignoring hangup signals. 可以看到是“运行命令,忽略挂起信号”
就是指,用nohup运行命令可以使命令永久的执行下去,和用户终端没有关系,例如我们断开SSH连接都不会影响他的运行,注意了nohup没有后台运行的意思;&才是后台运行
&是指在后台运行,但当用户推出(挂起)的时候,命令自动也跟着退出
那么,我们可以巧妙的吧他们结合起来用就是
nohup COMMAND &
这样就能使命令永久的在后台执行)
此时即使断开 Usb ,脚本也会在后台运行,并生成相关 Log 如下:
time.txt内容:
17:39:09
17:39:14
17:39:19
17:39:24
17:39:29
17:39:34
17:39:39
17:39:45
17:39:50
…
如何查看当前脚本进程并 kill 掉?
1、 pgrep -f ‘./test.sh’ or pgrep -f ‘sh test.sh’
2、 jobs –l
kill -9 pid 强制结束进程
ps
ps是传统方法,只是这里直接使用命令“ps -ef | grep ‘sh test.sh’”,会额外得到一个grep进程,如下:
所以这里只需要排除即可,如下:
pgrep
pgrep的man结果如右:pgrep, pkill - look up or signalprocesses based on name and other attributes。可见,pgrep就时专门基于名称等来获取进程号的,直接使用如下命令即可:
Ps:这里有很重要的一点要提醒大家:
Unix 和 Windows 编码格式不一样,如果在Windows 中编写 shell 脚本,可能会直接报错,这时候需要转换相应的编码格式,notepad++ 可以实现自由转换如下:
文档 —- 编辑—- 文档格式转换 —- 转换为 Unix 格式
具体可见:
Notepad++中Windows,Unix,Mac三种格式之间的转换
http://blog.csdn.net/salutlu/article/details/39082373
三、内容参考
相关的知识点参考了网上一下内容,受益匪浅:
1. 使用 & 符号在后台执行命令
你可以在Linux命令或者脚本后面增加&符号,从而使命令或脚本在后台执行,例如:.
$ ./my-shell-script.sh &
2. 使用nohup在后台执行命令
使用&符号在后台执行命令或脚本后,如果你退出登录,这个命令就会被自动终止掉。要避免这种情况,你可以使用nohup命令,如下所示:
$ nohup ./my-shell-script.sh &
3. 使用screen执行命令
通过nohup和&符号在后台执行命令后,即使你退出登录,这个命令也会一直执行。但是,你无法重新连接到这个会话,要想重新连接到这个会话,你可以使用screen命令。.
Linux的screen命令提供了分离和重新连接一个会话的功能。当你重新连接这个会话的时候,你的终端和你分离的时候一模一样。
4. 使用at将一个命令作为批处理执行
使用at命令,你可以让一个命令在指定的日期和时间运行,例如要在明天上午10点在后台执行备份脚本,执行下面的命令:
$ at -f backup.sh 10 am tomorrow
在批处理模式下执行某些任务需要启用一些选项。下面的文章会给出详细解释:.
How To Capture Unix Top CommandOutput to a File in Readable Format
Unix bc Command Line Calculator inBatch Mode
How To Execute SSH and SCP in BatchMode (Only when Passwordless login is enabled)
5. 使用watch连续地执行一个命令
要想按一个固定的间隔不停地执行一个命令,可以使用watch命令,如下所示:
$ watch df –h
PS: Linux中执行shell脚本的4种方法总结
http://www.jb51.net/article/53924.htm
Android自动化测试shell脚本—-非常有用
http://blog.csdn.net/lhzhang1985/article/details/6580595
adbshell input 模拟事件:
adb shell模拟点击事件 input
1,最开始使用这个的时候 想到是 monkey 事件 因为这个是 可以盲点屏幕的 ,使用的参数 不同 生成的点击效果不同,后来 没有找到 monkey 固定点击的位置。查到的 input 是可以完成模拟点击的需求
adb shell 中 直接输入 input
usage: input…
input text <string>
input keyevent <key code number or name>
input tap <x> <y>
input swipe <x1> <y1> <x2><y2>
inputtext 模拟输入内容
inputkeyevent 模拟 手机的按键 比如音量键 home 键 返回键 inputkeyevent3 模拟按下返回键,很强大的还有 手柄的一系列按键,可以自己查查
inputtap 模拟点击 屏幕 生成 down-up事件 ,例如 input tap 300 400; 这个是 PX值
inputswipe 模拟滑动屏幕 例如 inputswipe 250 250 300 300
附录:shell 循环(对写稳定性及压力测试脚本很有用):
http://www.linuxidc.com/Linux/2012-02/53030.htm
#!/usr/bin/ksh
#数字段形式
for i in {1..10}
do
echo $i
done
#详细列出(字符且项数不多)
for File in 1 2 3 4 5
do
echo $File
done
#对存在的文件进行循环
for shname in `ls *.sh`
do
name=`echo”$shname” | awk -F. ‘{print$1}‘`
echo $name
done
#查找循环(ls数据量太大的时候也可以用这种方法)
for shname in `find . -type f -name “*.sh”`
do
name=`echo”$shname” | awk -F/ ‘{print$2}‘`
echo $name
done
#((语法循环—有点像C语法,但记得双括号
for((i=1;i<100;i++))
do
if((i%3==0))
then
echo $i
continue
fi
done
#seq形式 起始从1开始
for i in `seq 100`
do
if((i%3==0))
then
echo $i
continue
fi
done
#while循环注意为方括号[],且注意空格
min=1
max=100
while [ $min -le $max ]
do
echo $min
min=`expr $min + 1`
done
#双括号形式,内部结构有点像C的语法,注意赋值:i=$(($i+1))
i=1
while(($i<100))
do
if(($i%4==0))
then
echo $i
fi
i=$(($i+1))
done
# 三.循环控制语句
# break 命令不执行当前循环体内break下面的语句从当前循环退出.
# continue 命令是程序在本循体内忽略下面的语句,从循环头开始执行
Shell for&while循环详细总结
http://www.linuxidc.com/Linux/2012-02/53030.htm
让shell脚本在后台飞
http://www.cnblogs.com/Javame/p/3582885.html
Android手机上,利用bat脚本模拟用户操作
http://blog.csdn.net/lzm198707/article/details/71195270
遇到的问题:
发现windows 上直接运行sh 脚本会报错
解决的方法,修改文档编码格式为 Unix(notepad++即可转换),默认是 windows 格式
Kill sh 进程
1、 jobs–l
Kill-9 进程号
2、 pgrep–f “./test.sh &”
还没有评论,来说两句吧...