Docker for Mac으로 컨테이너에서 호스트 옆으로 연결된 Android 장치adb 방법
완전 자기 노트예요.
전제 조건
전제 조건: ADB의 구조에 대한 대략적인 분석
https://blog.csdn.net/xgbing/article/details/52096880 그림으로 쓰세요.
adb 클라이언트와 adb 서버는 다른 PC에서도 가능
클라이언트와 서버 간의 단순한 TCP 통신 때문에
adb 서버가 있는 기계와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
오 마이 갓!!
Reference
이 문제에 관하여(Docker for Mac으로 컨테이너에서 호스트 옆으로 연결된 Android 장치adb 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/YusukeIwaki/items/5d31c10bc9bfe6d62845텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)