#此脚本可以单独执行
#将脚本和apk包放在同一个文件夹,请自行解压任意apk到当前的脚本目录
# 以下是执行命令举例,打开powershell,切换到当前脚本目录
# 无法执行的话或执行报错,在powershell中执行 set-ExecutionPolicy RemoteSigned 选择y
#.\polling-all-apk.ps1 -deviceid 串号 是轮巡当前文件夹下所有apk
#.\polling-all-apk.ps1 -deviceid 串号 -apk_list ("androbench-5.0.1.apk", "HD Video Player.apk") 是轮巡当前文件夹下指定的apk
#.\polling-all-apk.ps1 -polling 0 -deviceid 串号 是停止当前文件夹下所有apk
#.\polling-all-apk.ps1 -polling 0 -deviceid 串号 -apk_list ("androbench-5.0.1.apk", "HD Video Player.apk") 是停止当前文件夹下指定的apk
# 打开powershell !!!
# 打开powershell !!!
# 打开powershell !!!
# 无法执行的话或执行报错,在powershell中执行 set-ExecutionPolicy RemoteSigned 选择y !!!
# 无法执行的话或执行报错,在powershell中执行 set-ExecutionPolicy RemoteSigned 选择y !!!
# 无法执行的话或执行报错,在powershell中执行 set-ExecutionPolicy RemoteSigned 选择y !!!
Param(
[int]$polling = 1,
[int]$pollingAndrobench = 1,
[string]$apkdiristrue = "0",
[string[]]$apk_list = $null,
[string]$deviceid = "0123456789ABCDEF"
)
$scriptName = "pollingapk"
$tempFile = "$scriptName-$deviceid"
#获取当前脚本所在路径
$CurrentyDir = Split-Path -Parent $MyInvocation.MyCommand.Definition
Write-Output $CurrentyDir
$apkdir1 = (Get-ChildItem $CurrentyDir| Where-Object{$_.psiscontainer -eq $true})
$apkdir = "$CurrentyDir\$apkdir1"
$pack_num=0
function deleteTmpFile
{
$FILE_PATH="$CurrentyDir\$tempFile-*.txt"
$TRUE_FALSE=(Test-Path $FILE_PATH)
if($TRUE_FALSE -eq "True")
{
remove-Item -Recurse -Force $FILE_PATH
}
}
#获取包名&activity名
function getPackAndActivityName([Object[]]$pathApk)
{
foreach($i in $pathApk){aapt d badging $LOCALAPKDir\$i|Select-String '^package: name'| out-string -width 4096 >> $CurrentyDir\$tempFile-package1.txt}
Get-Content $CurrentyDir\$tempFile-package1.txt|Where-Object{-not [String]::IsNullOrWhiteSpace($_)} | set-content $CurrentyDir\$tempFile-package_old.txt
Get-Content $CurrentyDir\$tempFile-package_old.txt |ForEach-Object{$_.split('=')[1]}|ForEach-Object{$_.split(' ')[0]} >> $CurrentyDir\$tempFile-package.txt
#写入当前所有apk的activity名
foreach($i in $pathApk){
if(aapt d badging $LOCALAPKDir\$i|Select-String '^launchable-activity: name'){
aapt d badging $LOCALAPKDir\$i|Select-String '^launchable-activity: name'| out-string -width 4096 >> $CurrentyDir\$tempFile-activity1.txt
}else{
Write-Output "no-launchable-activity: name" >> $CurrentyDir\$tempFile-activity1.txt
}
}
Get-Content $CurrentyDir\$tempFile-activity1.txt|Where-Object{-not [String]::IsNullOrWhiteSpace($_)} | set-content $CurrentyDir\$tempFile-activity_old.txt
Get-Content $CurrentyDir\$tempFile-activity_old.txt | ForEach-Object {if ($_.StartsWith("launchable-activity")){
ForEach-Object{$_.split('=')[1]}|ForEach-Object{$_.split(' ')[0]} >> $CurrentyDir\$tempFile-activity.txt
}else{
Write-Output $_ >> $CurrentyDir\$tempFile-activity.txt
}
}
}
#获取当前top 是否已经打开
function confirmTopActiity([string]$topAct)
{
$count=0
while ($count -lt 5)
{
adb -s $deviceid shell "dumpsys activity activities|head -20|grep $topAct"
$Flag = Write-Output $?
if( $Flag -ne "True" ){
Write-Output "not TOP"
Start-Sleep 1
}
else{
break
}
$count += 1
}
}
function CalcStartApkTime([string]$packActivity)
{
$script:singleApkSpend=((adb -s $deviceid shell am start -W $packActivity|Select-String WaitTime).ToString().Split(":")[1])
}
function Invoke-TimeOutCommand()
{
$doit = "$packagename/$line"
$job = Start-Job -ScriptBlock {
param($num)
$numBlock = [Scriptblock]::Create($num)
$numBlock.Invoke()
} -ArgumentList (CalcStartApkTime $doit)| Wait-Job -Timeout 15
if($job.State -ne 'Completed')
{
Write-Warning 'timeout'
Start-Sleep 1
adb -s $deviceid shell pm clear $packagename
adb -s $deviceid shell am force-stop $packagename
$job | Stop-Job | Remove-Job
return $null
}
else
{
return $job | Receive-Job
}
}
function startApk
{
#轮巡安装的app
#获取包名/activity名
$allAPKstartSpend=0
$lines = Get-Content $CurrentyDir\$tempFile-activity.txt
$file_rows=(get-content $CurrentyDir\$tempFile-package.txt|Measure-Object).Count
if( $file_rows -eq 1 ){
foreach ($line in $lines){$packagename=(Get-Content $CurrentyDir\$tempFile-package.txt -TotalCount 500)
$packagename=$packagename -replace "'", ""
Write-Output "$deviceid $line start..."
Invoke-TimeOutCommand
Write-Output "WaitTime: $singleApkSpend"
$allAPKstartSpend = $allAPKstartSpend + $singleApkSpend
Start-Sleep 5
}
}else{
foreach ($line in $lines){$packagename=(Get-Content $CurrentyDir\$tempFile-package.txt -TotalCount 500)[$pack_num]
$pack_num = $pack_num+1;$packagename=$packagename -replace "'", ""
Write-Output "$deviceid $line start..."
Invoke-TimeOutCommand
Write-Output "WaitTime: $singleApkSpend"
$allAPKstartSpend = $allAPKstartSpend + $singleApkSpend
Start-Sleep 5
}
}
Write-Host -ForegroundColor Red ($deviceid + ' all apk start spend: ' + ($allAPKstartSpend/1000) + 's------------------')
}
function stopApk
{
$lines_pack = Get-Content $CurrentyDir\$tempFile-package.txt
foreach ($line in $lines_pack){Write-Output "$line stop app";adb -s $deviceid shell pm clear $line;adb -s $deviceid shell am force-stop $line}
}
#testflow
$start = Get-Date
#删除中间文件
deleteTmpFile
#获取 包名&activity名
if( $null -eq $apk_list ){
if( $apkdiristrue -eq 0){
$pathApk = Get-ChildItem $CurrentyDir\*.apk -name
$LOCALAPKDir = $CurrentyDir
getPackAndActivityName $pathApk
}else{
$pathApk = Get-ChildItem $apkdir\*.apk -name
$LOCALAPKDir = $apkdir
getPackAndActivityName $pathApk
}
}else{
$pathApk = $apk_list
getPackAndActivityName $pathApk
}
#轮巡或者停止apk
if( $pollingAndrobench -eq 1 ){
if( $polling -eq 1 ){
startApk
#删除中间文件
deleteTmpFile
}else{
stopApk
#删除中间文件
deleteTmpFile
}
}else{
Write-Output "skip by python"
}
$end = Get-Date
Write-Host -ForegroundColor Red ($deviceid + ' Total Runtime: ' + ($end - $start).TotalSeconds)