0. 개요


cmd에서는 명령을 입력하면 명령어를 한 줄씩 실행한다.
즉, 한 줄 실행이 완료될 때 까지 기다리고, 완료되면 그 다음 줄을 실행한다.
이전 회사에서, 한번에 여러개의 디바이스를 다룰 일이 많았다.

아래 예시를 보면, 두개의 디바이스가 연결된 상태에서 screencap 명령어를 통해 스크린샷을 찍어보았다.

위와 같이, more than one device/emulator 에러 메세지가 나오면서 실행이 되지 않는다!


1. -s 옵션

컴퓨터 입장에서 보면, "어떤 디바이스로 해달라는거야?" 라고 되물을 것이다.

우리는 그래서, 직접 이름을 불러주고 명령을 해야한다.

adb devices 명령어를 입력하면 연결되어있는 디바이스의 이름(시리얼넘버) 확인이 가능하다.

아래와 같이 -s 옵션을 붙이면 디바이스를 지정할 수 있다!


2. 직렬 실행

그렇다면, 한번에 두개를 실행하고 싶다면 어떻게 해야 가능할까?

이렇게 두 줄 쓰는 방법도 있을것이다.

하지만 다음과 같이 생각할 내용이 있다.

만약 스크립트가 길어진다면?

set device_1=R3CRA0JW89R
set device_2=R3CX208V22K

adb -s %device_1% shell screencap -p /sdcard/screenshot.png
adb -s %device_2% shell screencap -p /sdcard/screenshot.png

adb -s %device_1% shell screencap -p /sdcard/screenshot1.png
adb -s %device_2% shell screencap -p /sdcard/screenshot1.png

adb -s %device_1% shell screencap -p /sdcard/screenshot2.png
adb -s %device_2% shell screencap -p /sdcard/screenshot2.png

이렇게 길게 작성해야한다..

그리고 또 아래와 같은 문제점이 있다.

  1. 만약 시리얼 넘버가 계속 바뀐다면?
    이런 상황이 있을 수도 있다. 같은 디바이스에서는 같은 시리얼 넘버가 출력되지만, 만약 디바이스를 계속 바꾸면서 하는 경우도 있다.
  2. 만약 스크린샷 찍는것 뿐만 아니라 스크립트가 더 있고, 하나 완료하는데 몇분씩 걸린다면?
    처음 말했듯, cmd에서는 코드를 한줄씩 읽고 실행한다.
    만약 디바이스가 10대라고 가정하면, 1대의 디바이스가 스크립트 실행중일때 나머지 9대의 디바이스는 아무것도 안하는 상태로 있는다.

이미지로 비유하자면, 아래와 같다.

그렇다면 이게 한계일까?

 

그렇지 않다!

다소 억지스럽지만, cmd에서는 병렬 실행을 구현할 수 있다.


3. 병렬 실행

우리가 원하는건 아래 이미지와 같은 병렬 실행이다.

그러기 위해서, 디바이스 만큼 cmd 스크립트를 실행하는 방법으로 구현해냈다.

우선, 아래와 같은 폴더 구조를 만들었다.

order.bat에서는, 다음과 같은 스크립트가 들어가있다.

@echo off
setlocal enabledelayedexpansion

for /f "skip=1" %%i in ('adb devices | findstr "devices"') do (
    start /min capture.bat %%i
)

복잡한 명령어긴 하지만, 단순하게 설명하자면

  1. 'adb devices'를 실행한다.
  2. 거기서, | findstr devices (파이프)를 이용해 devices인 경우를 필터(디바이스가 오프라인, 인증되지 않은 경우 제외)
  3. skip=1 을 통해 adb devices의 List of devices attached 구문을 무시하고, 시리얼 넘버를 가져온다.
  4. start /min 옵션을 통해, 최소화된 창으로 capture.bat을 실행한다.
  5. 다만, capture.bat에 %%i 를 통해 시리얼넘버를 같이 실어서 보내준다.

capture.bat에서는, %1을 통해 해당 시리얼 넘버를 사용할 수 있다.

echo %1 시리얼 넘버를 넘겨받았습니다.
pause>nul

capture.bat을 위와같이 설정하고, 실행한다면

이렇게 시리얼넘버를 넘겨 받을 것을 확인할 수 있다.

그렇다면,

이제 이런식으로 작성하면 다소 억지스럽지만 병렬 실행을 구현할 수 있다.


4. 결론

억지스럽다 표현한 이유는, 저렇게 실행하면 실행한 수 만큼 cmd가 켜지기 때문이다..

그래도 조금은 투박하지만 분명한 성과는 있었다.

3분정도 걸리는 스크립트를 6개의 디바이스에 직렬로 실행했을 때에는 18분 가량 걸리곤 했었는데, 병렬 구현을 한 후에는 약 5분정도 걸리게 되었다. (병렬로 실행하면서 렉이 좀 걸리니까 느려지면서 추가됨)

파이썬에는 아예 병렬 실행을 하는 쓰레딩 라이브러리가 있는 것으로 알고 있다.

이후 실무에서 만약 병렬 실행 수요를 마주친다면 한번쯤 활용해보면 될 것 같다.

+ Recent posts