【问题标题】:Unable to run an Android application in a Docker container with Gitlab-CI无法使用 Gitlab-CI 在 Docker 容器中运行 Android 应用程序
【发布时间】:2017-08-03 16:00:06
【问题描述】:

我这几天一直在为一个问题苦苦挣扎,希望有人能帮助我...

我尝试将 gitlab ci 用于我的基本 android 应用程序项目。

根据下面的教程Setting up GitLab CI for Android projects,我写了一个.gitlab-ci.yml脚本:

image: openjdk:8-jdk

variables:
  ANDROID_COMPILE_SDK: "25"
  ANDROID_BUILD_TOOLS: "25.0.1"
  ANDROID_SDK_TOOLS: "25.2.3"

before_script:
  - apt-get --quiet update --yes
  - apt-get --quiet install --yes wget tar unzip lib32stdc++6 lib32z1 libqt5widgets5
  - wget --quiet --output-document=tools.zip https://dl.google.com/android/repository/tools_r${ANDROID_SDK_TOOLS}-linux.zip
  - unzip tools.zip -d /sdk
  - rm tools.zip
  - echo y | /sdk/tools/android --silent update sdk --no-ui --all --filter android-${ANDROID_COMPILE_SDK}
  - echo y | /sdk/tools/android --silent update sdk --no-ui --all --filter platform-tools
  - echo y | /sdk/tools/android --silent update sdk --no-ui --all --filter build-tools-${ANDROID_BUILD_TOOLS}
  - echo y | /sdk/tools/android --silent update sdk --no-ui --all --filter extra-android-m2repository
  - echo y | /sdk/tools/android --silent update sdk --no-ui --all --filter extra-google-google_play_services
  - echo y | /sdk/tools/android --silent update sdk --no-ui --all --filter extra-google-m2repository
  - export ANDROID_HOME=/sdk
  - export PATH=$PATH:$ANDROID_HOME/platform-tools/
  - chmod +x ./gradlew

stages:
  - test

functionalTests:
  stage: test
  script:
    - echo y | /sdk/tools/android --silent update sdk --no-ui --all --filter sys-img-x86-google_apis-${ANDROID_COMPILE_SDK}
    - echo no | /sdk/tools/android create avd -n test -t android-${ANDROID_COMPILE_SDK} --abi google_apis/x86
    - /sdk/tools/emulator64-x86 -avd test -no-accel -no-window -no-audio &
    - adb wait-for-device
    - ./gradlew assembleDebug
    - ./gradlew assembleDebugAndroidTest
    - adb devices
    - adb shell service list
    - adb shell input keyevent 82 # Unlock device to allow install...
    - adb install -r app/build/outputs/apk/app-debug.apk
    - adb install -r app/build/outputs/apk/app-debug-androidTest.apk
    - adb shell am instrument -w -r -e debug false -e class com.example.myfirstapp.ManageItemListTest com.example.myfirstapp.test/android.support.test.runner.AndroidJUnitRunner
  artifacts:
    paths:
    - app/build/outputs/

我的第一个困难——正如有人在教程的 cmets 中提到的——是我无法在 docker 容器中管理和启用硬件加速。

目前,我在启动 AVD 时添加了“-no-accel”选项以进一步执行脚本。

但主要问题是'adb shell input keyevent 82'以及以下安装命令失败。

模拟设备正在运行,但显然缺少许多服务,如下所示:

Found 17 services:
0   media.camera: [android.hardware.ICameraService]
1   media.resource_manager: [android.media.IResourceManagerService]
2   media.player: [android.media.IMediaPlayerService]
3   media.sound_trigger_hw: [android.hardware.ISoundTriggerHwService]
4   media.radio: [android.hardware.IRadioService]
5   media.audio_policy: [android.media.IAudioPolicyService]
6   media.drm: [android.media.IMediaDrmService]
7   media.extractor: [android.media.IMediaExtractorService]
8   media.audio_flinger: [android.media.IAudioFlinger]
9   drm.drmManager: [drm.IDrmManagerService]
10  media.codec: [android.media.IMediaCodecService]
11  gpu: [android.ui.IGpuService]
12  SurfaceFlinger: [android.ui.ISurfaceComposer]
13  android.service.gatekeeper.IGateKeeperService: []
14  android.security.keystore: [android.security.IKeystoreService]
15  android.hardware.fingerprint.IFingerprintDaemon: []
16  batteryproperties: [android.os.IBatteryPropertiesRegistrar]

在我的桌面上使用 Android Studio 本地启动的 AVD 实际运行 91 个服务时,仅启动了 17 个服务。

包管理器(包:[android.content.pm.IPackageManager])是缺失的服务之一...

谁能告诉我发生了什么以及该怎么做?

亲切的问候,

劳伦特

【问题讨论】:

  • 如果您托管自己的跑步者,您可以使用硬件加速。您只需要与 docker 共享正确的资源。
  • 您好 Jakub,感谢您的提示,但我想让整个过程在云中运行。所以如果我真的找不到解决我目前情况的办法,我会接受你的建议。我在脚本中添加了一个(非常长的)计时器,并尝试使用 ARM 系统映像。然后我又启动了一些服务(21 个而不是 17 个)。然而,像包管理器这样的必需品仍然缺失...... :-(。问候,Laurent
  • 嗯,有带 gpu 的云解决方案,但价格昂贵。但至少当 Elastic GPU 终于到来时,您会知道还有另一种选择。

标签: android docker gitlab-ci


【解决方案1】:

我终于找到了使用 ARM 系统映像的解决方案。 但是还必须等待所有必需的服务启动。 以下是任何感兴趣的人的新脚本:

image: openjdk:8-jdk

variables:
  ANDROID_COMPILE_SDK: "25"
  ANDROID_BUILD_TOOLS: "25.0.1"
  ANDROID_SDK_TOOLS: "25.2.3"

before_script:
  - apt-get --quiet update --yes
  - apt-get --quiet install --yes wget tar unzip lib32stdc++6 lib32z1 libqt5widgets5
  - wget --quiet --output-document=tools.zip https://dl.google.com/android/repository/tools_r${ANDROID_SDK_TOOLS}-linux.zip
  - unzip tools.zip -d /sdk
  - rm tools.zip
  - echo y | /sdk/tools/android --silent update sdk --no-ui --all --filter android-${ANDROID_COMPILE_SDK}
  - echo y | /sdk/tools/android --silent update sdk --no-ui --all --filter platform-tools
  - echo y | /sdk/tools/android --silent update sdk --no-ui --all --filter build-tools-${ANDROID_BUILD_TOOLS}
  - echo y | /sdk/tools/android --silent update sdk --no-ui --all --filter extra-android-m2repository
  - echo y | /sdk/tools/android --silent update sdk --no-ui --all --filter extra-google-google_play_services
  - echo y | /sdk/tools/android --silent update sdk --no-ui --all --filter extra-google-m2repository
  - export ANDROID_HOME=/sdk
  - export PATH=$PATH:$ANDROID_HOME/platform-tools/
  - chmod +x ./gradlew

stages:
  - test

functionalTests:
  stage: test
  script:
    - echo y | /sdk/tools/android --silent update sdk --no-ui --all --filter sys-img-armeabi-v7a-google_apis-${ANDROID_COMPILE_SDK}
    - echo no | /sdk/tools/android create avd -n test -t android-${ANDROID_COMPILE_SDK} --abi google_apis/armeabi-v7a
    - /sdk/tools/emulator64-arm -avd test -no-audio -gpu off -no-boot-anim -no-window &
    - adb wait-for-device
    - OUT=`adb shell service list | grep IPackageManager 2>&1 &` # Now wait for other services startup
    - until [[ $OUT  =~ .*IPackageManager.* ]]; do
    - sleep 20
    - OUT=`adb shell service list | grep IPackageManager 2>&1 &`
    - done
    - ./gradlew assembleDebug
    - ./gradlew assembleDebugAndroidTest
    - adb shell input keyevent 82 # Unlock device to allow install...
    - adb install -r app/build/outputs/apk/app-debug.apk
    - adb install -r app/build/outputs/apk/app-debug-androidTest.apk
    - adb shell am instrument -w -r -e debug false -e class com.example.myfirstapp.ManageItemListTest com.example.myfirstapp.test/android.support.test.runner.AndroidJUnitRunner
  artifacts:
    paths:
    - app/build/outputs/

对于这个基本示例,整个执行需要 25 分钟以上才能完成(我的测试失败了,但那是另一回事了...... ;-))。 要是有硬件加速就好了……

亲切的问候,

劳伦特

【讨论】:

  • 更多信息... UI 测试在 ARM AVD 上失败,而在 x86 上通过。为了使用 gitlab-ci 成功运行测试,我不得不将我的 ARM 映像从 Android 版本 25 降级到 19。我在 gitlab-ci 项目上打开了一个改进请求,要求激活硬件加速:gitlab.com/gitlab-org/gitlab-ci-multi-runner/issues/2242
【解决方案2】:

如果您编辑 gitlab 运行器 .toml 文件并将“privileged:”设置为 true,那么您应该能够在模拟器中使用硬件加速。

这样您就不必再使用不受支持的 ARM 映像,而可以使用英特尔映像。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-06
    • 1970-01-01
    • 2020-07-17
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    相关资源
    最近更新 更多