이번편에서는

UIautomator2를 활용한 동시 단말 조작 방법 및 자주겪는 이슈들에 대해서 소개한다.

UIAutomator2의 동작원리

PC에서 UIAutomator2 Library통해서 자동으로 연결(ADB 및 network연결)방법을 설정해서 단말기에 설치된 Atx-agent서버(7912)포트에 단말 조작 명령을 전달한다. 이 내용을 Atx-agent는 단말기에 설치된 UIAutomator2 전용 APP과 JsonRPC방식을 통해 수행결과를 통신한다.
결국 단말기와 통신을 위해서는 단말IP:7912에 접근할 수 있는 환경이 구성되어야 한다.

구체적인 연결방법을 설명하려면 우선 UIAutomator2가 어떤방식으로 단말과 연결하는지 살펴봐야 한다.
UIAutomator2에서 단말과 조작하기 위해서 u2.connect() function을 사용하였다.
해당 function의 소스를 살펴보면

def connect(addr=None):
    """
    ...
    (생략)
    ...
    if wifi_addr:
        return connect_wifi(addr)
    return connect_usb(addr)

입력된 주소가 ip address(x.x.x.x)형식이면 connect_wifi를 수행하고, 아니라면 usb연결방법을 수행한다. 이점을 확인한 상태에서 동시단말을 조작하는 방법들을 소개한다.

  1. 단말ID를 통한 접근
    adb devices를 수행한 후 얻게되는 ID값이 다음과 같다면
> adb devices
List of devices attached
ID1xxxxxxxxxxxxxxx     device
ID2xxxxxxxxxxxxxxx     device

다음과 같이 2개의 device를 연결할 수 있다.

device1 = u2.connect('ID1xxxxxxxxxxxxxxx')
device2 = u2.connect('ID1xxxxxxxxxxxxxxx')
  1. wifi를 통한 접근
    앞선 atx-agent 서버를 수행하였을 때 7912포트에 서버가 구동된다고 설명했었다.
    연결을 원하는 device가 wifi로 연결이 되어있다면, device에 ip가 부여되었다고 볼 수 있다. 부여된 device ip는 대체로 공유기 내부의 ip가 부여된다.
    같은 내부IP에 존재하는 pc에서는 별도의 방화벽이 없다면 Network로 접근 할 수 있다.
    만약 부여된 내부IP가 다음과 같다면
device1 = 192.168.1.100
device2 = 192.168.1.101

다음과 같이 2개의 device를 연결할 수 있다.

device1 = u2.connect('192.168.1.100:7912')
device2 = u2.connect('192.168.1.101:7912')
  1. ADB를 통한 portfowarding
    만약 단말기가 wifi에도 연결되어 있지 않고, 외부에서 PC에 연결된 단말기를 조작하고 싶다면.
    ADB의 port forwarding기능을 통해서 PC에 연결된 단말의 7912포트로 접속 할 수 있다.
    단말의 device가 다음과 같다고 가정하고..
> adb devices
List of devices attached
ID1xxxxxxxxxxxxxxx     device
ID2xxxxxxxxxxxxxxx     device

외부에서 접속이 가능하도록 Port fowarding을 위해서는 ADB를 종료하고 -a nodaemon server start모드로 수행해야 한다.

> adb kill-server
> adb -a nodaemon server start

그렇게 하면 adb forward수행 시 외부에서 pc의 device에 접근 할 수 있다.
이 방법을 통해서 2개 device에 연결은 다음과 같이 할 수 있다.
기존의 cmd창은 서버가 구동되고 있으니.
새로 cmd창을 열고
먼저 port forward를 통해 pc의 7912포트와 단말의 7912포트를 연결한다.

adb -s ID1xxxxxxxxxxxxxxx forward tcp:7912 tcp:7912

두번재 단말은 7913으로 연결한다 다음과 같이

adb -s ID1xxxxxxxxxxxxxxx forward tcp:7912 tcp:7913

이렇게 정의한 단말 2개를 다음과 같이 연결할 수 있다.

device1 = u2.connect('<PC_IP>:7912')
device2 = u2.connect('<PC_IP>:7913')

자주 겪는 이슈들

  1. 잘되던 자동화가 갑자기 수행되지 않을때 확인할 사항
    • Atx-agent가 구동되고 있는지 확인한다.
      단말기에 shell을 통해서 접속 후 netstat -anp | grep 7912를 수행해 본다.
      7912로 listen받고 있다면 atx-agent는 정상구동된걸 확인할 수 있다.
      만약 구동되는 서비스가 없다면 다시 atx-agent를 구동한다.
      adb shell /data/local/tmp/atx-agent server -d
    • 만약 Atx-agent가 구동되는데도 실행이 안된다면..UIAutomator2앱의 강제 시작 버튼 클릭
      단말기에 설치된 자동차모양의 앱을 실행

      실행 버튼 클릭
  2. 추가 예정
profile
안녕하세요~ :)

2개의 댓글

comment-user-thumbnail
2020년 9월 22일

오!!2. 추가예정도 잇군여!!궁그미

1개의 답글