Android脱离USB执行Shell脚本的方法

超、凢脫俗 2022-06-01 13:13 917阅读 0赞

前言:

安卓自动化测试过程中,经常需要测试机脱离 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

  1. date +%H:%M:%S>>other.txt
  2. sleep 1
  3. \#统计次数
  4. echo count:$i>count.txt
  5. \#按电源键点亮屏幕
  6. input keyevent 26
  7. sleep 2
  8. input tap 120 120
  9. sleep 4
  10. cat/sys/devices/virtual/thermal/thermal\_zone4/temp>>other.txt
  11. sleep 1
  12. \#启动电话
  13. am start -ncom.android.dialer/com.asu.mdialer.MDialtactsActivity
  14. sleep 6
  15. \#滑动进入拨号盘
  16. input swipe 230 100 50 100
  17. sleep 2
  18. input swipe 230 100 50 100
  19. sleep 2
  20. \#输入110
  21. input tap 42 42
  22. sleep 2
  23. input tap 42 42
  24. sleep 2
  25. input tap 120 210
  26. sleep 2
  27. \#获取光机状态值
  28. cat/sys/class/bst/bml050/status/startup>>open.txt
  29. sleep 1
  30. input keyevent 26
  31. sleep 2
  32. input tap 120 120
  33. sleep 4
  34. cat/sys/class/bst/bml050/status/startup>>close.txt
  35. sleep 2
  36. 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进程,如下:

  1. 所以这里只需要排除即可,如下:

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…

  1. input text <string>
  2. input keyevent <key code number or name>
  3. input tap <x> <y>
  4. 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 &”

发表评论

表情:
评论列表 (有 0 条评论,917人围观)

还没有评论,来说两句吧...

相关阅读