【问题标题】:calabash-android within travistravis中的calabash-android
【发布时间】:2016-08-16 01:27:20
【问题描述】:

我正在尝试在 travis 中运行 calabash-android。 calabash-android 在我的机器上运行良好,没有任何问题。我有以下 travis.yml:

    language: android
jdk: oraclejdk8
before_cache:
  - rm -f $HOME/.gradle/caches/modules-2/modules-2.lock
cache:
  directories:
    - $HOME/.gradle/caches/
    - $HOME/.gradle/wrapper/
    - $HOME/.gradle/daemon
    - $HOME/.gradle/native
env:
  global:
    # wait up to 10 minutes for adb to connect to emulator
    - ADB_INSTALL_TIMEOUT=20
    - SLAVE_AAPT_TIMEOUT=40

android:
  components:
    - platform-tools
    - tools
    - build-tools-23.0.3
    - android-23
    - extra-android-support
    - extra-android-m2repository
    - extra-google-m2repository
    - sys-img-armeabi-v7a-android-23

before_install:
  # install ruby 2.0.0
  - rvm install 2.0.0
  # install calabash-android
  - gem install calabash-android

before_script:
  - echo no | android create avd --force --name test --target android-23 --abi armeabi-v7a
  - emulator -avd test -no-skin -no-audio -no-window -no-boot-anim &
  - android-wait-for-emulator
  - adb shell settings put global window_animation_scale 0 &
  - adb shell settings put global transition_animation_scale 0 &
  - adb shell settings put global animator_duration_scale 0 &
  - adb shell input keyevent 82 & #for unlocking as "powerkey"
  - sleep 3 # give screen some time to become unlocked
  - ./gradlew clean assembleDebug -PdisablePreDex --continue --stacktrace

script:
  - calabash-android resign /home/travis/build/app/build/outputs/apk/app-debug.apk
  - calabash-android run /home/travis/build/app/build/outputs/apk/app-debug.apk

它适用于功能的第一个场景,然后一旦启动第二个场景,它就会显示此错误:

App did not start (RuntimeError)
 ./features/support/app_life_cycle_hooks.rb:5:in `Before'

有什么想法吗?还是建议?

【问题讨论】:

  • 应用程序无法启动的原因可能有很多。我建议在尝试启动时运行 adb logcat 以查看问题所在

标签: android continuous-integration travis-ci calabash-android


【解决方案1】:

删除-no-boot-anim选项,android-wait-for-emulator脚本依赖启动动画来检测模拟器何时准备就绪。

这是我推荐的一个很好的解释:Detecting when emulator is ready to be used

第二步是等待模拟器完全启动,这样就可以了 用于运行一些代码。事实证明这是最棘手的部分。 特别是对于 API 级别 11+ 的模拟器(当时为 11-14 写作)。

首先,模拟器应该连接到 adb 并且会被列为“离线”。 在这种状态下,模拟器不接受任何 shell 命令。没事了 可以在这种状态下完成。这部分通常很稳定,我 没有看到模拟器启动但从未连接到的情况 亚行。当然,如果发生错误,它不会连接到 adb。所以 此处应使用 timeout 来检测异常延迟或挂起。

下一个状态设备进入所谓的“设备”状态。这是当设备 正在启动。一旦启动,设备就会进入“在线”状态。 这是系统开始启动和模拟器正常运行的时间 进去。

从设备进入“设备”状态的那一刻起,就可以使用 adb shell 在设备上执行不同的命令并查询一些有用的 有关其状态的信息。

我发现了几个应该跟踪的属性,以便 可靠地检测设备何时准备就绪。第一个属性称为 dev.boot 完成。一旦设备完成启动此属性 将设置为 1。

dev.bootcompleted 为 1 后,下一个属性名为 sys.boot_completed 应该被追踪。系统完成后立即设置为 1 启动(这通常是在发送 BOOT_COMPLETED 广播时)。这个 属性仅在 API 级别 9 或更高级别的模拟器上设置。在 8 和 lower 这个属性从不使用(也不应该被跟踪)。

但模拟器仍然没有准备好,即使设置了 sys.boot_completed 到 1. 你会注意到开机动画仍然会运行一段时间 (重要的)一段时间。只有这样 UI 才会出现。但 幸运的是,也有一种方法可以检测到此事件。为此我们需要 跟踪 init.svc.bootanim 属性的值。此属性保持状态 启动动画服务,一旦 UI 出现就会停止。 换句话说,只要 init.svc.bootanim 的值停止,它的 可以安全地假设模拟器正在运行并准备好使用

在你的模拟器完全启动之前,使用-no-boot-anim 的值为stopped

# Originally written by Ralf Kistner <ralf@embarkmobile.com>, but placed in the public domain

set +e

bootanim=""
failcounter=0
timeout_in_sec=360

until [[ "$bootanim" =~ "stopped" ]]; do
  bootanim=`adb -e shell getprop init.svc.bootanim 2>&1 &`
  if [[ "$bootanim" =~ "device not found" || "$bootanim" =~ "device offline"
    || "$bootanim" =~ "running" ]]; then
    let "failcounter += 1"
    echo "Waiting for emulator to start"
    if [[ $failcounter -gt timeout_in_sec ]]; then
      echo "Timeout ($timeout_in_sec seconds) reached; failed to start emulator"
      exit 1
    fi
  fi
  sleep 1
done

echo "Emulator is ready"

现在我怀疑第一个场景是否有效(我从未使用过 calabash-android),但我发现它并不依赖于模拟器是否准备好:

calabash-android - What does resign do?

如果您需要签署应用程序以匹配您的密钥库,则使用辞职。 复制自 GitHub 文档 https://github.com/calabash/calabash-android/wiki/Running-Calabash-Android

除了辞职,你也可以考虑复制你的调试 密钥库到您的文件夹。

apk calabash android 运行必须使用相同的密钥库签名 测试服务器。

使用命令:calabash-android resign &lt;apk&gt; 退出您的申请。

使用 calabash-android build 构建测试服务器将构建 测试服务器并使用与您的应用程序相同的密钥对其进行签名 测试。

第二种情况是这样的:

Running test

运行测试:calabash-android run &lt;apk&gt;

Calabash-android 将与您的应用一起安装检测工具 执行应用程序时。我们称这种仪器为“测试 服务器”。“测试服务器”具有特殊权限,允许它 在测试期间与您的应用程序进行非常密切的交互。每次你测试一个 新的二进制文件或使用升级版本的葫芦一个新的测试服务器 将被建造。测试服务器是一个将运行的仪器 与设备上的应用一起执行测试。

在这种情况下可能存在其他问题,但 fixed the same issue here 删除 -no-boot-anim

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多