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

2021年9月16日 53点热度 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  

       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 &”

 

    原文作者:不自由
    原文地址: https://blog.csdn.net/MzTestor/article/details/79206427
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。