Эмулятор Android внутри докер-контейнера
Я пытаюсь настроить автоматизацию Android в облаке (в частности, Docker).
Вот мой файл докера:
ENV DEBIAN_FRONTEND noninteractive
RUN echo "debconf shared/accepted-oracle-license-v1-1 select true" | debconf-set-selections && \
echo "debconf shared/accepted-oracle-license-v1-1 seen true" | debconf-set-selections
# Update packages
RUN dpkg --add-architecture i386 &&\
apt-get -yqq update && \
apt-get install -qqy \
software-properties-common\
curl \
html2text \
libc6-i386 \
lib32stdc++6 \
lib32gcc1 \
lib32ncurses5 \
bzip2 \
lib32z1 \
unzip \
wget \
build-essential \
expect \
file \
libmagic1 \
python-pip && \
add-apt-repository ppa:webupd8team/java && \
apt-get -yqq update && \
apt-get -yqq install oracle-java8-installer && \
rm -rf /var/lib/apt/lists/*
RUN python -m pip install --upgrade pip
# Install android sdk
RUN wget -q -O /tmp/sdk.zip https://dl.google.com/android/repository/sdk-tools-linux-3952940.zip \
&& unzip -q /tmp/sdk.zip -d /usr/local/android-sdk \
&& rm /tmp/sdk.zip \
&& chown -R root:root /usr/local/android-sdk/
# Add android tools and platform tools to PATH
ENV ANDROID_HOME /usr/local/android-sdk
ENV PATH $PATH:$ANDROID_HOME/tools
ENV PATH $PATH:$ANDROID_HOME/tools/bin
ENV PATH $PATH:$ANDROID_HOME/platform-tools
ENV PATH $PATH:$ANDROID_HOME/platform-tools/bin
# AMULATOR NEEDS THIS ENV
ENV ANDROID_SDK_ROOT $ANDROID_HOME
ENV QEMU_AUDIO_DRV none
# Export JAVA_HOME variable
ENV JAVA_HOME /usr/lib/jvm/java-8-oracle
## accept license
RUN mkdir -p $ANDROID_HOME/licenses
RUN echo '8933bad161af4178b1185d1a37fbf41ea5269c55' > $ANDROID_HOME/licenses/android-sdk-license
RUN sdkmanager --update
RUN sdkmanager 'platform-tools'
RUN sdkmanager 'tools'
RUN sdkmanager 'platforms;android-22'
RUN sdkmanager 'lldb;2.3'
RUN sdkmanager 'emulator'
RUN sdkmanager 'build-tools;22.0.1'
# Extras
RUN sdkmanager 'extras;android;m2repository'
RUN sdkmanager 'extras;google;m2repository'
RUN sdkmanager 'extras;google;google_play_services'
RUN sdkmanager 'extras;m2repository;com;android;support;constraint;constraint-layout;1.0.2'
RUN sdkmanager 'extras;m2repository;com;android;support;constraint;constraint-layout;1.0.1'
RUN sdkmanager 'add-ons;addon-google_apis-google-22'
# RUN sdkmanager 'system-images;android-22;google_apis_playstore;x86'
# No KVM required image
RUN sdkmanager 'system-images;android-22;google_apis;armeabi-v7a'
RUN sdkmanager 'system-images;android-22;default;armeabi-v7a'
# Create fake keymap file
RUN mkdir /usr/local/android-sdk/tools/keymaps && \
touch /usr/local/android-sdk/tools/keymaps/en-us
# EMULATOR
RUN DEBIAN_FRONTEND=noninteractive apt-get -yqq update && apt-get install -y libqt5widgets5
ENV QT_QPA_PLATFORM offscreen
ENV LD_LIBRARY_PATH ${ANDROID_HOME}/emulator/lib64/qt/lib/
Я создаю AVD с помощью этой команды:
avdmanager create avd --name avdtest --force --package 'system-images;android-24;google_apis;armeabi-v7a' --abi 'google_apis/armeabi-v7a' --tag 'google_apis'
Запустите эмулятор с помощью этой команды:
/emulator/emulator -avd avdtest -writable-system -engine classic -no-window -camera-back none -camera-front none -debug all -qemu -m 512
Используя эту настройку, я не могу запустить AVD, получая ошибку:
I/DEBUG ( 61): Build fingerprint: 'Android/sdk_google_phone_armv7/generic:5.1.1/LMY48X/4088218:userdebug/test-keys'
I/DEBUG ( 61): Revision: '0'
I/DEBUG ( 61): ABI: 'arm'
I/DEBUG ( 61): pid: 1844, tid: 1844, name: surfaceflinger >>> /system/bin/surfaceflinger <<<
I/DEBUG ( 61): signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
I/DEBUG ( 61): r0 00000000 r1 00000734 r2 00000006 r3 00000000
I/DEBUG ( 61): r4 b6f5ce38 r5 00000006 r6 00000002 r7 0000010c
I/DEBUG ( 61): r8 ffffffc4 r9 b648d158 sl 00000000 fp bebc4b7c
I/DEBUG ( 61): ip 00000734 sp bebc4998 lr b6eb9745 pc b6edc950 cpsr 60000010
I/DEBUG ( 61):
I/DEBUG ( 61): backtrace:
I/DEBUG ( 61): #00 pc 00039950 /system/lib/libc.so (tgkill+12)
I/DEBUG ( 61): #01 pc 00016741 /system/lib/libc.so (pthread_kill+52)
I/DEBUG ( 61): #02 pc 0001735f /system/lib/libc.so (raise+10)
I/DEBUG ( 61): #03 pc 00013b39 /system/lib/libc.so (__libc_android_abort+36)
I/DEBUG ( 61): #04 pc 00012f18 /system/lib/libc.so (abort+4)
I/DEBUG ( 61): #05 pc 000214ff /system/lib/libsurfaceflinger.so
I/DEBUG ( 61): #06 pc 00017841 /system/lib/libsurfaceflinger.so (android::SurfaceFlinger::init()+104)
I/DEBUG ( 61): #07 pc 00000af1 /system/bin/surfaceflinger
I/DEBUG ( 61): #08 pc 00012dc9 /system/lib/libc.so (__libc_init+44)
I/DEBUG ( 61): #09 pc 00000c08 /system/bin/surfaceflinger
I/DEBUG ( 61):
I/DEBUG ( 61): Tombstone written to: /data/tombstones/tombstone_07
1 ответ
У меня была похожая проблема при запуске образа эмулятора на виртуальной машине Linux (Ubuntu), работающей на хосте Windows 10. У меня возникла эта проблема со сбоем SurfaceFlinger, и устройство никогда не запускалось. Я попробовал много предложений, но в конце концов я попробовал предложения в этих двух статьях:
https://www.jc-tech.info/2018/04/10/android-emulator-crashing-due-to-access-violation/ https://www.jc-tech.info/2017/07/12/ Android-эмулятор висящие-с-черным экраном /
Я думаю, что переход на SwiftShader (см. Первую ссылку) прошел сбой, и, сознательно выбрав аппаратное ускорение, я получил видимый домашний экран эмулятора. ОДНАКО, последний может быть просто потому, что я ждал дольше или использовал образ эмулятора с большим объемом памяти (оба были правдой), и я не тестировал без них. Я не знаю, как вы могли выбрать SwiftShader из командной строки. Если вы выясните как, пожалуйста, опубликуйте это здесь. Я хотел бы знать! В любом случае, поскольку вы работаете с "-no-window", переключение на SwiftShader может быть все, что вам нужно.
В случае, если вы не можете сделать это из командной строки, вы, вероятно, можете создать файл с нужными атрибутами и скопировать его в образ докера при его создании.
РЕДАКТИРОВАТЬ: Я до сих пор не пробовал это в контейнере, но чтобы запустить его из командной строки, в отличие от использования Android Studio на моей виртуальной машине Ubuntu, мне нужно было добавить "-gpu host" в команду эмулятора. Я не думаю, что SwiftShader необходим в конце концов, поскольку это программный рендер.