Docker for Mac으로 컨테이너에서 호스트 옆으로 연결된 Android 장치adb 방법

9669 단어 AndroidDockeradb
Appium 테스트를 했지만 Docker화 하려고 할 때 빠져서 필기를 했습니다.
완전 자기 노트예요.

전제 조건

  • Docker for Mac을 실행하는 OS는 Mojave
  • 용기 기반 알파인
  • 전제 조건: ADB의 구조에 대한 대략적인 분석


    https://blog.csdn.net/xgbing/article/details/52096880 그림으로 쓰세요.
  • adb는 서버와 클라이언트가 있습니다
  • USB 드라이버를 통한 서버 프로세스
  • 실제 ADB 데몬(adbd)과 대화
  • 이런 인상.

    adb 클라이언트와 adb 서버는 다른 PC에서도 가능


    클라이언트와 서버 간의 단순한 TCP 통신 때문에

    adb 서버가 있는 기계와adb 클라이언트를 조작하는 기계는 다를 수 있습니다.
  • adb 클라이언트의localhost:5037->adb 서버의localhost:5037 포트 전송
  • adb 사용-H 옵션
  • 에서 기술한 장면은 다음과 같은 절차를 이용하여 명세표를 작성하여 개념 디자인에서 체량의 부피를 분석하도록 한다.
    (참고로 -H 옵션은 이번 시도 전에는 몰랐어요

    어떻게 adb를 넣을까요?


    alpine에서adb명령을 사용할 수 있는 두 가지 방법이 있습니다.

    android-tools 패키지


    https://github.com/sorccu/docker-adb/issues/9
    apk --update-cache --repository http://dl-3.alpinelinux.org/alpine/edge/testing/ add android-tools
    
    하면 돼!있다.
    확실히 이렇게 하면 된다.가능하지만 후술한 이유로 채용되지 못했다.

    설치 노력 다운로드


    결국 이렇게 되면 돼.이유를 후술하다.

    adb 설치

    apk --update-cache --repository http://dl-3.alpinelinux.org/alpine/edge/testing/ add android-tools해봐.

    adb 장치에서는 아무것도 나오지 않습니다.


    그럼컨테이너 (alpine linux) 에는 아무런 장치도 없고 포트 전송도 하지 않았기 때문이다.
    adb 클라이언트가 실행하는 용기에서adb 서버가 실행하는 호스트(Mac)까지 5037개의 포트를 전송할 수 있지만 Docker는 용기→호스트의 포트를 전송할 수 없습니다.그럼, 왜... (이것이 바로 이번 대화의 계기)

    /dev/bus/usb 포트를 지정할 수 있습니까?

    --privileged -v /dev/bus/usb:/dev/bus/usb 이렇게 하면 컨테이너에서 호스트 OS의 USB 장치에 직접 접근할 수 있습니다.
    https://codeday.me/jp/qa/20190301/305118.html
    네.호스트가 Linux라면
    Docker for Mac이면 안돼.

    adb의 - H 옵션을 사용하시면 됩니다!


    adb 클라이언트는 Docker 컨테이너 측면에서 이동하고 adb 서버는 호스트 측의 작전을 사용합니다.
    $ adb
    Android Debug Bridge version 1.0.41
    Version 29.0.1-5644136
    Installed as /Users/yusuke-iwaki/Library/Android/sdk/platform-tools/adb
    
    global options:
     -a         listen on all network interfaces, not just localhost
     -d         use USB device (error if multiple devices connected)
     -e         use TCP/IP device (error if multiple TCP/IP devices available)
     -s SERIAL  use device with given serial (overrides $ANDROID_SERIAL)
     -t ID      use device with given transport id
     -H         name of adb server host [default=localhost]
     -P         port of adb server [default=5037]
     -L SOCKET  listen on given socket for adb server [default=tcp:localhost:5037]
    
    
    이거다!
    물론 맥 측도 안드로이드 SDK에 가입해야 하지만 안드로이드 앱을 개발하는 사람도 있겠지 (에? w
    그럼 해보면
    /usr/src/app # adb -H docker.for.mac.localhost devices
    List of devices attached
    adb server version (41) doesn't match this client (40); killing...
    ADB server didn't ACK
    Full server startup log: /tmp/adb.0.log
    Server had pid: 20
    --- adb starting (pid 20) ---
    adb I 07-17 04:52:43    20    20 main.cpp:56] Android Debug Bridge version 1.0.40
    adb I 07-17 04:52:43    20    20 main.cpp:56] Version 9.0.0_r33
    adb I 07-17 04:52:43    20    20 main.cpp:56] Installed as /usr/bin/adb
    adb I 07-17 04:52:43    20    20 main.cpp:56] 
    error: could not install *smartsocket* listener: listening on specified hostname currently unsupported
    
    * failed to start daemon
    error: cannot connect to daemon
    
    Ω\ζ땡그랑
    TCP 수준의 통신 성공-H name of adb server host [default=localhost] 설치된adb버전이 유행이 지났습니다!!따라서 이대로는adb 프로토콜로 통신할 수 없다.

    adb 다시 불러오기


    https://qiita.com/kichinaga/items/66872432747e76d72af7, 어리석게도 zip을 통해 SDK를 다운로드, PATH, ANDROID_HOME 설정
    이런 일을 하다.하면, 만약, 만약...
    # Android SDK
    RUN apk add --no-cache openjdk8-jre wget unzip
    RUN wget https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip && unzip -d /usr/local/android sdk-tools-linux-4333796.zip && rm sdk-tools-linux-4333796.zip
    ENV JAVA_HOME /usr/lib/jvm/default-jvm
    ENV ANDROID_HOME /usr/local/android
    ENV PATH /usr/local/android/tools:/usr/local/android/tools/bin:/usr/local/android/platform-tools:/usr/lib/jvm/default-jvm/bin:$PATH
    RUN mkdir -p ~/.android && touch ~/.android/repositories.cfg
    RUN yes | sdkmanager --licenses
    RUN sdkmanager "tools" "platform-tools"
    
    # add glibc (see: https://hub.docker.com/r/frolvlad/alpine-glibc/dockerfile)
    RUN ALPINE_GLIBC_BASE_URL="https://github.com/sgerrand/alpine-pkg-glibc/releases/download" && \
        ALPINE_GLIBC_PACKAGE_VERSION="2.29-r0" && \
        ALPINE_GLIBC_BASE_PACKAGE_FILENAME="glibc-$ALPINE_GLIBC_PACKAGE_VERSION.apk" && \
        ALPINE_GLIBC_BIN_PACKAGE_FILENAME="glibc-bin-$ALPINE_GLIBC_PACKAGE_VERSION.apk" && \
        ALPINE_GLIBC_I18N_PACKAGE_FILENAME="glibc-i18n-$ALPINE_GLIBC_PACKAGE_VERSION.apk" && \
        apk add --no-cache --virtual=.build-dependencies wget ca-certificates && \
        echo \
            "-----BEGIN PUBLIC KEY-----\
            MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApZ2u1KJKUu/fW4A25y9m\
            y70AGEa/J3Wi5ibNVGNn1gT1r0VfgeWd0pUybS4UmcHdiNzxJPgoWQhV2SSW1JYu\
            tOqKZF5QSN6X937PTUpNBjUvLtTQ1ve1fp39uf/lEXPpFpOPL88LKnDBgbh7wkCp\
            m2KzLVGChf83MS0ShL6G9EQIAUxLm99VpgRjwqTQ/KfzGtpke1wqws4au0Ab4qPY\
            KXvMLSPLUp7cfulWvhmZSegr5AdhNw5KNizPqCJT8ZrGvgHypXyiFvvAH5YRtSsc\
            Zvo9GI2e2MaZyo9/lvb+LbLEJZKEQckqRj4P26gmASrZEPStwc+yqy1ShHLA0j6m\
            1QIDAQAB\
            -----END PUBLIC KEY-----" | sed 's/   */\n/g' > "/etc/apk/keys/sgerrand.rsa.pub" && \
        wget \
            "$ALPINE_GLIBC_BASE_URL/$ALPINE_GLIBC_PACKAGE_VERSION/$ALPINE_GLIBC_BASE_PACKAGE_FILENAME" \
            "$ALPINE_GLIBC_BASE_URL/$ALPINE_GLIBC_PACKAGE_VERSION/$ALPINE_GLIBC_BIN_PACKAGE_FILENAME" \
            "$ALPINE_GLIBC_BASE_URL/$ALPINE_GLIBC_PACKAGE_VERSION/$ALPINE_GLIBC_I18N_PACKAGE_FILENAME" && \
        apk add --no-cache \
            "$ALPINE_GLIBC_BASE_PACKAGE_FILENAME" \
            "$ALPINE_GLIBC_BIN_PACKAGE_FILENAME" \
            "$ALPINE_GLIBC_I18N_PACKAGE_FILENAME" && \
        \
        rm "/etc/apk/keys/sgerrand.rsa.pub" && \
        /usr/glibc-compat/bin/localedef --force --inputfile POSIX --charmap UTF-8 "$LANG" || true && \
        echo "export LANG=$LANG" > /etc/profile.d/locale.sh && \
        \
        apk del glibc-i18n && \
        \
        rm "/root/.wget-hsts" && \
        apk del .build-dependencies && \
        rm \
            "$ALPINE_GLIBC_BASE_PACKAGE_FILENAME" \
            "$ALPINE_GLIBC_BIN_PACKAGE_FILENAME" \
            "$ALPINE_GLIBC_I18N_PACKAGE_FILENAME"
    
    이런 느낌.
    glibc를 제대로 안 하면...
    /usr/src/app # adb -H docker.for.mac.localhost devices
    /bin/sh: adb: not found
    /usr/src/app # which adb
    /usr/local/android/platform-tools/adb
    /usr/src/app # ldd /usr/local/android/platform-tools/adb
        /lib64/ld-linux-x86-64.so.2 (0x7f8010899000)
        libdl.so.2 => /lib64/ld-linux-x86-64.so.2 (0x7f8010899000)
        libpthread.so.0 => /lib64/ld-linux-x86-64.so.2 (0x7f8010899000)
        libm.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7f8010899000)
        librt.so.1 => /lib64/ld-linux-x86-64.so.2 (0x7f8010899000)
        libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x7f801063f000)
        libc.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7f8010899000)
    Error relocating /usr/local/android/platform-tools/adb: __vfprintf_chk: symbol not found
    Error relocating /usr/local/android/platform-tools/adb: __fprintf_chk: symbol not found
    Error relocating /usr/local/android/platform-tools/adb: __vsnprintf_chk: symbol not found
    Error relocating /usr/local/android/platform-tools/adb: group_member: symbol not found
    Error relocating /usr/local/android/platform-tools/adb: __syslog_chk: symbol not found
    Error relocating /usr/local/android/platform-tools/adb: __fdelt_chk: symbol not found
    Error relocating /usr/local/android/platform-tools/adb: __snprintf_chk: symbol not found
    Error relocating /usr/local/android/platform-tools/adb: __strdup: symbol not found
    Error relocating /usr/local/android/platform-tools/adb: __asprintf_chk: symbol not found
    Error relocating /usr/local/android/platform-tools/adb: __strcat_chk: symbol not found
    Error relocating /usr/local/android/platform-tools/adb: __vasprintf_chk: symbol not found
    Error relocating /usr/local/android/platform-tools/adb: strtoll_l: symbol not found
    Error relocating /usr/local/android/platform-tools/adb: strtoull_l: symbol not found
    
    이런 느낌은adb명령이 있는데notfound라고 하니 상당히 매혹적이다.

    다시 일어서다


    그래서 adb를 최신 물건으로 만들면
    /usr/src/app # adb -H docker.for.mac.localhost devices
    List of devices attached
    emulator-5554   device
    
    오 마이 갓!!

    좋은 웹페이지 즐겨찾기