Android-тесты Travis CI: нет подключенных устройств

Я пытаюсь настроить Travis для Android. Запуск сборки пока работает, но когда дело доходит до тестов, он жалуется на «Нет подключенных устройств!»

:app:connectedAndroidTestDebug FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:connectedAndroidTestDebug'.
> com.android.builder.testing.api.DeviceException: java.lang.RuntimeException: 
    No connected devices!

Вот мой .travis.yml, и насколько я понимаю, я создаю и запускаю эмулятор для тестов, точно так же, как документация говорит.

language: android
android:
  components:
    # Uncomment the lines below if you want to
    # use the latest revision of Android SDK Tools
    # - platform-tools
    # - tools

    # The BuildTools version used by your project
    - build-tools-22.0.1

    # The SDK version used to compile your project
    - android-22

    # Additional components
    - extra-google-google_play_services
    - extra-google-m2repository
    - extra-android-m2repository
    # - addon-google_apis-google-19
    # - add-on
    # - extra

    # Specify at least one system image,
    # if you need to run emulator(s) during your tests
    - sys-img-armeabi-v7a-android-22
    # - sys-img-x86-android-17

  licenses:
    - 'android-sdk-license-.+'

  # Emulator Management: Create, Start and Wait
  before_script:
    - echo no | android create avd --force -n test -t android-22 --abi armeabi-v7a
    - emulator -avd test -no-skin -no-audio -no-window &
    - android-wait-for-emulator
    - adb shell input keyevent 82 &

Можете ли вы сказать мне, что я делаю неправильно и как это исправить?


person Terry    schedule 07.07.2015    source источник
comment
Давайте пока забудем об эмуляции устройства. Попробуем на реальном устройстве. Можете ли вы на самом деле подтвердить, что ОС распознает реальное устройство? Вы можете сделать это, выполнив adb devices в командной строке терминала/команды с повышенными привилегиями. Если вы видите длинную строку с цифрами, мы можем устранить одну потенциальную проблему.   -  person Shailen    schedule 07.07.2015
comment
Это ведет Трэвис. Я не могу подключить устройство или запустить там оболочку. Все, что я могу сделать, это поместить правильную команду в файл .tavis.yml и быть уверенным, что она запустит эмулятор. К сожалению, я даже не получаю сообщения журнала для этого.   -  person Terry    schedule 08.07.2015


Ответы (4)


К сожалению, мне не разрешено комментировать, так как я просто хочу завершить ответ Доминика Джодоина. Правильный отступ и более длинный ADB_INSTALL_TIMEOUT необходимы, как уже сказал DominicJodoin.

На мой взгляд, ваш эмулятор работает, но не готов установить apk. С - adb wait-for-device вы ждете, пока устройство подключится. Согласно документации, это означает:

Обратите внимание, что эта команда не заставляет adb ждать полной загрузки всей системы. По этой причине вы не должны добавлять его перед другими командами, которые требуют полностью загруженной системы.

Попробуйте вместо этого заменить эту строку на - android-wait-for-emulator в вашем travis.yml.

Travis.yml

language: android
jdk: oraclejdk7
cache:
  directories:
   - node_modules
sudo: false

android:
  components:
   # Uncomment the lines below if you want to
    # use the latest revision of Android SDK Tools
    # - platform-tools
    # - tools

    # The BuildTools version used by your project
    - build-tools-22.0.1

    # The SDK version used to compile your project
    - android-22

    # Additional components
    - extra-google-google_play_services
    - extra-google-m2repository
    - extra-android-m2repository
    # - addon-google_apis-google-19
    # - add-on
    # - extra

    # Specify at least one system image,
    # if you need to run emulator(s) during your tests
    - sys-img-armeabi-v7a-android-21
    # - sys-img-x86-android-17

  licenses:
   - 'android-sdk-license-.+'

env:
  global:
   # install timeout in minutes (2 minutes by default)
    - ADB_INSTALL_TIMEOUT=8

# Emulator Management: Create, Start and Wait
before_script:
  - echo no | android create avd --force -n test -t android-21 --abi armeabi-v7a
  - emulator -avd test -no-skin -no-audio -no-window &
  - android-wait-for-emulator
  - adb shell input keyevent 82 &

script:
  - android list target
  - ./gradlew connectedAndroidTest
person J-Bossi    schedule 19.07.2015
comment
Спасибо за Ваш ответ! Я попытался использовать команду android-wait-for-emulator, но получил ошибку в :app:preDexDebug: pastebin.com/VbjwVKxz Кажется, та же проблема, что и здесь: stackoverflow.com/questions/22849720/ , поэтому я предполагаю, что это проблема с памятью. Вы знаете, как я могу расширить память, которая используется для его запуска? - person Terry; 20.07.2015
comment
Здравствуйте, я не эксперт в этой теме и не знаю, как увеличить память на travis. В моих сборках я также запускаю сборку gradle с этой опцией -PdisablePreDex". Как указано здесь это улучшит производительность вашего сервера сборки. Насколько я знаю, предварительное индексирование запускает множество процессов, которым требуется память. Вы получаете выгоду от предварительного индексирования, если запускаете инкрементные сборки, чего нельзя сказать о сервере сборки travis. Также измените свой build.gradle, как указано в данной ссылке. - person J-Bossi; 20.07.2015
comment
Отключить ли предварительное индексирование в моем .travis.yml? Если да, то где? - person Terry; 20.07.2015
comment
Да, вы запускаете сборку gradle с помощью этой команды - ./gradlew connectedAndroidTest . просто добавьте туда опцию, чтобы у вас было - ./gradlew connectedAndroidTest -PdisablePreDex - person J-Bossi; 20.07.2015

Я думаю, ваша проблема в том, что изображение sys-img-armeabi-v7a-android-22 еще не доступно на Travis CI.

Действительно, если вы запустите следующую команду в Travis CI: android list target, вывод для android-22 не покажет Tag/ABIs : no ABIs.

Я бы посоветовал вам пока попробовать запустить тесты на sys-img-armeabi-v7a-android-21.

Вы можете взглянуть на пример проекта Android с модульными тестами, которые я разветвил и успешно запустил с вашими компонентами, но с изображением sys-img-armeabi-v7a-android-21 на Travis CI:

Надеюсь это поможет!

Изменить: android-22 изображение скоро будет доступно на Travis CI. См. следующий запрос на вытягивание.

person Dominic Jodoin    schedule 09.07.2015
comment
Спасибо за Ваш ответ! Это сбивает с толку, что это работает для вас, но даже после перехода на android-21 я получаю ту же ошибку. Мой .travis.yml теперь выглядит так: pastebin.com/nfA1pj6r Любые другие идеи, что может быть не так, или что еще я мог попробовать? - person Terry; 10.07.2015
comment
@Terry @DominicJodoin Спасибо за ваш вклад. У меня такая же ошибка и с sys-img-armeabi-v7a-android-21 у меня тоже ошибка... - person David; 10.07.2015
comment
Хорошо, я думаю, что нашел вашу проблему. Неправильный отступ директив before_script: и script:. Убедитесь, что перед ними нет начального пробела. В вашем текущем файле .travis.yml эти директивы отображаются так, как будто они находятся в директиве android:. Скопируйте/вставьте этот фиксированный .travis.yml файл сюда и дайте мне знать, как это работает. - person Dominic Jodoin; 10.07.2015
comment
Кажется, теперь эмулятор запускается, но не удается установить APK с исключением ShellCommandUnresponsibleException. Любая идея, что это значит / как это исправить? Журнал: pastebin.com/vJDt005V - person Terry; 10.07.2015
comment
Попробуйте установить для переменной среды ADB_INSTALL_TIMEOUT более высокое значение времени ожидания. См. stackoverflow.com/a/28949723/213272. - person Dominic Jodoin; 10.07.2015
comment
Я установил его на 8 минут, но это ничего не изменило. Любая другая идея? - person Terry; 13.07.2015
comment
Можете ли вы опубликовать свой .travis.yml файл еще раз? Что еще вы сделали/можете попробовать с примером проекта, который я разместил выше? - person Dominic Jodoin; 13.07.2015
comment
Я только что попробовал это с вашим примером проекта. Я получаю такое же исключение: pastebin.com/qrz0uV19 Значит ли это, что travis нужно как-то настроить по-другому? ? - person Terry; 16.07.2015
comment
Хм, вы можете попробовать разветвить мой проект публично и показать мне результат на Travis CI? - person Dominic Jodoin; 19.07.2015

Я хотел использовать более новый эмулятор. К сожалению, мне не удалось заставить его работать на Android-26 или 27, но я смог заставить его работать на Android-25. Имена ABI были изменены. Вот что работает для меня:

language: android

jdk:
  - oraclejdk8

env:
  global:
    - ANDROID_BUILD_TOOLS_VERSION=26.0.2
    - ANDROID_ABI=arm64-v8a
    - ANDROID_TAG=google_apis
    - ANDROID_API_LEVEL=26
    - EMULATOR_API_LEVEL=25
    - ADB_INSTALL_TIMEOUT=8 # minutes (2 minutes by default)

android:
  components:
    # Uncomment the lines below if you want to
    # use the latest revision of Android SDK Tools
    - tools
    - platform-tools
    - tools

    # The BuildTools version used by your project
    - build-tools-$ANDROID_BUILD_TOOLS_VERSION

    # The SDK version used to compile your project
    - android-$ANDROID_API_LEVEL
    - android-$EMULATOR_API_LEVEL

    # Support library
    # Latest artifacts in local repository
    - extra-android-m2repository

    # Specify at least one system image,
    # if you need to run emulator(s) during your tests
    - sys-img-$ANDROID_ABI-$ANDROID_TAG-$EMULATOR_API_LEVEL

before_cache:
  - rm -f  $HOME/.gradle/caches/modules-2/modules-2.lock
  - rm -fr $HOME/.gradle/caches/*/plugin-resolution/
cache:
  directories:
    - $HOME/.gradle/caches/
    - $HOME/.gradle/wrapper/

# Emulator Management: Create, Start and Wait
before_script:
  - android list targets
  - echo no | android create avd --force -n test -t "android-"$EMULATOR_API_LEVEL --abi $ANDROID_ABI --tag $ANDROID_TAG
  - emulator -list-avds
  - emulator -avd test -no-window &
  - android-wait-for-emulator
  - adb devices
  - adb shell input keyevent 82 &
person Gavriel    schedule 20.01.2018

Я нашел бит ключа ADB_TIMEOUT_INSTALL в ответе J-Bossi, и он запускает эмулятор в before_script, как сейчас рекомендует Travis-CI, но у меня были проблемы с нехваткой памяти виртуальной машины. Поэтому вместо того, чтобы запускать эмулятор во время сборки, я изменил свою конфигурацию, чтобы запустить сборку, затем запустить эмулятор, а затем запустить тесты.

sudo: false

language: android

env:
  global:
    # switch glibc to a memory conserving mode
    - MALLOC_ARENA_MAX=2
    # wait up to 10 minutes for adb to connect to emulator
    - ADB_INSTALL_TIMEOUT=10

android:
  components:
    - platform-tools
    - extra-android-m2repository
    - build-tools-22.0.1
    - android-22
    - sys-img-armeabi-v7a-android-22

script:
  - ./gradlew assemble lint

after_script:
  # Emulator Management: Create, Start and Wait
  - echo no | android create avd --force -n test -t android-22 --abi armeabi-v7a
  - emulator -avd test -no-skin -no-audio -no-window &
  - android-wait-for-emulator
  - adb shell input keyevent 82 &
  # now run the tests
  - ./gradlew connectedCheck
person Hans-Christoph Steiner    schedule 24.09.2015
comment
проблема в том, что если скрипт проходит успешно, то сборка считается успешной, даже несмотря на то, что connectCheck может не пройти - person Gavriel; 21.01.2018