Giter Site home page Giter Site logo

swarmer's Introduction

Swarmer — create, start and wait for Android emulators to boot in parallel.

Swarmer is a replacement for such bash scripts but with features like:

  • Start multiple Android Emulators and wait for each to boot in parallel.
  • Pass config.ini that'll be applied to created emulator.
  • Redirect Logcat output of an emulator to a file.

Demo

How to use

Swarmer shipped as jar, so just run it java -jar swarmer.jar options.

Dependencies:

Commands

Start

java -jar swarmer.jar start …
Options
Required
  • --emulator-name
    • Name of the emulator, i.e. test_emulator_1.
  • --package
    • Package of the system image for this AVD (e.g.'system-images;android-25;google_apis;x86') to pass to avdmanager create avd --package.
  • --android-abi
    • Android system image abi, i.e. google_apis/x86_64.
  • --path-to-config-ini
    • Path either relative or absolute to the file that will be used as config.ini for created emulator.
    • Easiest way to get config.ini is to create AVD on your machine using Android Studio and then copy config from ~/.android/avd/device_name.avd/config.ini.
    • We recommend to keep config.ini in version control so your team members could review it and builds will be reproducible.
Optional
  • --help, -help, help, -h
    • Print help and exit.
  • --emulator-start-options
    • Options to pass to emulator -avd \$emulatorName command, i.e. --no-window -prop persist.sys.language=en -prop persist.sys.country=US.
  • --emulator-start-timeout-seconds
    • Timeout to wait for emulator to finish boot. Default value is 180 seconds.
  • --redirect-logcat-to
    • Path either relative or absolute to the file that will be used to redirect logcat of started emulator to. No redirection will happen if parameter is not presented.
  • --keep-existing-avds
    • Avoid recreating avds and reuse existing ones whenever possible.
Examples
Start one emulator
java -jar swarmer.jar start \
--emulator-name test_emulator_1 \
--package "system-images;android-25;google_apis;x86" \
--android-abi google_apis/x86_64 \
--path-to-config-ini emulator_config.ini \
--emulator-start-options -prop persist.sys.language=en -prop persist.sys.country=US \
--redirect-logcat-to test_emulator_1_logcat.txt
Start two emulators in parallel
java -jar swarmer.jar start \
--emulator-name test_emulator_1 \
--package "system-images;android-25;google_apis;x86" \
--android-abi google_apis/x86_64 \
--path-to-config-ini emulator_config1.ini \
--emulator-start-options -prop persist.sys.language=en -prop persist.sys.country=US \
--redirect-logcat-to test_emulator_1_logcat.txt \
--emulator-name test_emulator_2 \
--package "system-images;android-23;google_apis;x86" \
--android-abi google_apis/x86_64 \
--path-to-config-ini emulator_config2.ini \
--emulator-start-options -prop persist.sys.language=en -prop persist.sys.country=US \
--redirect-logcat-to test_emulator_2_logcat.txt
Start two emulators sequentially
java -jar swarmer.jar start \
--emulator-name test_emulator_1 \
--android-target android-25 \
--android-abi google_apis/x86_64 \
--path-to-config-ini emulator_config.ini \
--emulator-start-options -prop persist.sys.language=en -prop persist.sys.country=US \
--redirect-logcat-to test_emulator_1_logcat.txt

java -jar swarmer.jar start \
--emulator-name test_emulator_2 \
--package "system-images;android-23;google_apis;x86" \
--android-abi google_apis/x86_64 \
--path-to-config-ini emulator_config2.ini \
--emulator-start-options -prop persist.sys.language=en -prop persist.sys.country=US \
--redirect-logcat-to test_emulator_2_logcat.txt

Stop

java -jar swarmer.jar stop …
Options
Optional
  • --timeout
    • Timeout for emulators to stop in seconds, default is 15 seconds.
Stop all running emulators
java -jar swarmer.jar stop --timeout 10

Download

Swarmer is available on jcenter.

You can download it in your CI scripts or store it in your version control system (not recommended).

SWARMER_VERSION=some-version
curl --fail --location https://jcenter.bintray.com/com/gojuno/swarmer/swarmer/${SWARMER_VERSION}/swarmer-${SWARMER_VERSION}.jar --output /tmp/swarmer.jar

All the releases and changelogs can be found on Releases Page.

Composer

Swarmer works great in combination with Composer — another tool we've built at Juno.

Composer can run Android Instrumentation tests in parallel on multiple connected devices/emulators. In our CI Pipeline we start emulators with Swarmer and then Composer runs tests on them.

How to build

Dependencies: you only need docker and bash installed on your machine.

bash ci/build.sh

License

Copyright 2017 Juno, Inc.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

swarmer's People

Contributors

artem-zinnatullin avatar arturdryomov avatar ming13 avatar simonschiller avatar yunikkk avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

swarmer's Issues

Starting single emulator

I have tried starting one emulator and keep getting this error.

Exception in thread "main" java.lang.IllegalStateException: Process [script, -F, /Users/craigc/Desktop/FastLaneTest/22978607283610.output, /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/usr/local/MacGPG2/bin:/opt/X11/bin:/usr/local/git/bin:/Users/craigc/Library/Android/sdk/platform-tools:/Users/craigc/Library/Android/sdk/platform-tools/adb, devices] exited with non-zero code 15 Script started on Fri Feb 1 14:06:21 2019
screenshot 2019-02-01 at 14 10 48

command: /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/usr/local/MacGPG2/bin:/opt/X11/bin:/usr/local/git/bin:/Users/craigc/Library/Android/sdk/platform-tools:/Users/craigc/Library/Android/sdk/platform-tools/adb devices
script: /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin:/usr/local/MacGPG2/bin:/opt/X11/bin:/usr/local/git/bin:/Users/craigc/Library/Android/sdk/platform-tools:/Users/craigc/Library/Android/sdk/platform-tools/adb: No such file or directory

Could you please help.

Make --android-abi optional

--abi is optional parameter for avdmanager create avd I think it should be optional for swarmer as well.

-b --abi : The ABI to use for the AVD. The default is to auto-select the ABI if the platform has only one ABI for its system images.

Couldn't create an emulator

I tried to create an emulator with shortest list of parameters and got the input.

[Fri Oct 27 21:32:33 MSK 2017]: Already running emulators: []
[Fri Oct 27 21:32:33 MSK 2017]: Creating avd «emulator1».
[Fri Oct 27 21:32:33 MSK 2017]: Error during creation of avd «emulator1», error = java.lang.IllegalStateException: Process [/Users/overtired/Library/Android/sdk/tools/bin/avdmanager, create, avd, --force, --name, «emulator1», --package, system-images;android-25;google_apis;x86, --abi, google_apis/x86] exited with non-zero code 1 Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema
	at com.android.repository.api.SchemaModule$SchemaModuleVersion.<init>(SchemaModule.java:156)
	at com.android.repository.api.SchemaModule.<init>(SchemaModule.java:75)
	at com.android.sdklib.repository.AndroidSdkHandler.<clinit>(AndroidSdkHandler.java:81)
	at com.android.sdklib.tool.AvdManagerCli.run(AvdManagerCli.java:213)
	at com.android.sdklib.tool.AvdManagerCli.main(AvdManagerCli.java:200)
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.annotation.XmlSchema
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)
	... 5 more

[Fri Oct 27 21:32:33 MSK 2017]: Error during creation of avd «emulator1», error = java.lang.IllegalStateException: Process [/Users/overtired/Library/Android/sdk/tools/bin/avdmanager, create, avd, --force, --name, «emulator1», --package, system-images;android-25;google_apis;x86, --abi, google_apis/x86] exited with non-zero code 1 Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema
	at com.android.repository.api.SchemaModule$SchemaModuleVersion.<init>(SchemaModule.java:156)
	at com.android.repository.api.SchemaModule.<init>(SchemaModule.java:75)
	at com.android.sdklib.repository.AndroidSdkHandler.<clinit>(AndroidSdkHandler.java:81)
	at com.android.sdklib.tool.AvdManagerCli.run(AvdManagerCli.java:213)
	at com.android.sdklib.tool.AvdManagerCli.main(AvdManagerCli.java:200)
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.annotation.XmlSchema
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)
	... 5 more

[Fri Oct 27 21:32:33 MSK 2017]: Error during creation of avd «emulator1», error = java.lang.IllegalStateException: Process [/Users/overtired/Library/Android/sdk/tools/bin/avdmanager, create, avd, --force, --name, «emulator1», --package, system-images;android-25;google_apis;x86, --abi, google_apis/x86] exited with non-zero code 1 Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema
	at com.android.repository.api.SchemaModule$SchemaModuleVersion.<init>(SchemaModule.java:156)
	at com.android.repository.api.SchemaModule.<init>(SchemaModule.java:75)
	at com.android.sdklib.repository.AndroidSdkHandler.<clinit>(AndroidSdkHandler.java:81)
	at com.android.sdklib.tool.AvdManagerCli.run(AvdManagerCli.java:213)
	at com.android.sdklib.tool.AvdManagerCli.main(AvdManagerCli.java:200)
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.annotation.XmlSchema
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)
	... 5 more

[Fri Oct 27 21:32:34 MSK 2017]: Error during creation of avd «emulator1», error = java.lang.IllegalStateException: Process [/Users/overtired/Library/Android/sdk/tools/bin/avdmanager, create, avd, --force, --name, «emulator1», --package, system-images;android-25;google_apis;x86, --abi, google_apis/x86] exited with non-zero code 1 Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema
	at com.android.repository.api.SchemaModule$SchemaModuleVersion.<init>(SchemaModule.java:156)
	at com.android.repository.api.SchemaModule.<init>(SchemaModule.java:75)
	at com.android.sdklib.repository.AndroidSdkHandler.<clinit>(AndroidSdkHandler.java:81)
	at com.android.sdklib.tool.AvdManagerCli.run(AvdManagerCli.java:213)
	at com.android.sdklib.tool.AvdManagerCli.main(AvdManagerCli.java:200)
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.annotation.XmlSchema
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)
	... 5 more

[Fri Oct 27 21:32:34 MSK 2017]: Could not create avd «emulator1», error = java.lang.IllegalStateException: Process [/Users/overtired/Library/Android/sdk/tools/bin/avdmanager, create, avd, --force, --name, «emulator1», --package, system-images;android-25;google_apis;x86, --abi, google_apis/x86] exited with non-zero code 1 Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema
	at com.android.repository.api.SchemaModule$SchemaModuleVersion.<init>(SchemaModule.java:156)
	at com.android.repository.api.SchemaModule.<init>(SchemaModule.java:75)
	at com.android.sdklib.repository.AndroidSdkHandler.<clinit>(AndroidSdkHandler.java:81)
	at com.android.sdklib.tool.AvdManagerCli.run(AvdManagerCli.java:213)
	at com.android.sdklib.tool.AvdManagerCli.main(AvdManagerCli.java:200)
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.annotation.XmlSchema
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)
	... 5 more

Exception in thread "main" java.lang.IllegalStateException: Process [/Users/overtired/Library/Android/sdk/tools/bin/avdmanager, create, avd, --force, --name, «emulator1», --package, system-images;android-25;google_apis;x86, --abi, google_apis/x86] exited with non-zero code 1 Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema
	at com.android.repository.api.SchemaModule$SchemaModuleVersion.<init>(SchemaModule.java:156)
	at com.android.repository.api.SchemaModule.<init>(SchemaModule.java:75)
	at com.android.sdklib.repository.AndroidSdkHandler.<clinit>(AndroidSdkHandler.java:81)
	at com.android.sdklib.tool.AvdManagerCli.run(AvdManagerCli.java:213)
	at com.android.sdklib.tool.AvdManagerCli.main(AvdManagerCli.java:200)
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.annotation.XmlSchema
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)
	... 5 more

	at com.gojuno.commander.os.ProcessesKt$process$1.call(Processes.kt:100)
	at com.gojuno.commander.os.ProcessesKt$process$1.call(Processes.kt)
	at rx.internal.operators.OnSubscribeCreate.call(OnSubscribeCreate.java:72)
	at rx.internal.operators.OnSubscribeCreate.call(OnSubscribeCreate.java:32)
	at rx.Observable.unsafeSubscribe(Observable.java:10346)
	at rx.internal.operators.OperatorSubscribeOn$SubscribeOnSubscriber.call(OperatorSubscribeOn.java:100)
	at rx.internal.schedulers.CachedThreadScheduler$EventLoopWorker$1.call(CachedThreadScheduler.java:230)
	at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:514)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:299)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
	at java.base/java.lang.Thread.run(Thread.java:844)

The script for swarmer was ...

#!/bin/bash
java -jar /correctPathToSwarmer/swarmer.jar start \
--emulator-name «emulator1» \
--package "system-images;android-25;google_apis;x86" \
--android-abi google_apis/x86 \
--path-to-config-ini emulator1.ini

What may be wrong?

Timeout error while staring a lot of new emulators simultaneously

I'm starting 5 new emulators with this script

IFS=', ' read -r -a arr <<< "%screenshots_emulators%"

scriptString=" "
for ((i=0; i<${#arr[@]}; i++)); do
    scriptString="$scriptString --emulator-name test_emulator_$i "
    scriptString="$scriptString --package \"system-images;android-26;google_apis;x86\" "
    scriptString="$scriptString --android-abi google_apis/x86 "
    scriptString="$scriptString --path-to-config-ini %EMULATOR_CONFIGS_DIR%${arr[$i]} "
    scriptString="$scriptString --emulator-start-options -prop persist.sys.language=en -prop persist.sys.country=US "
    scriptString="$scriptString --redirect-logcat-to /tmp/test_emulator_$i_logcat.txt "
    echo "config: ${arr[$i]}"
done

echo $scriptString

java -jar /tmp/swarmer.jar start $scriptString

But I get only 3 or 4 emulators running, other 2 don't want to start. So I get TimeoutException

[17:10:01][Step 8/9] Exception in thread "main" java.lang.RuntimeException: java.util.concurrent.TimeoutException
[17:10:01][Step 8/9] 	at rx.exceptions.Exceptions.propagate(Exceptions.java:58)
[17:10:01][Step 8/9] 	at rx.observables.BlockingObservable.blockForSingle(BlockingObservable.java:464)
[17:10:01][Step 8/9] 	at rx.observables.BlockingObservable.firstOrDefault(BlockingObservable.java:196)
[17:10:01][Step 8/9] 	at com.gojuno.swarmer.EmulatorsKt.startEmulators(Emulators.kt:49)
[17:10:01][Step 8/9] 	at com.gojuno.swarmer.MainKt.main(Main.kt:7)
[17:10:01][Step 8/9] Caused by: java.util.concurrent.TimeoutException
[17:10:01][Step 8/9] 	at rx.internal.operators.OperatorTimeoutBase$TimeoutSubscriber.onTimeout(OperatorTimeoutBase.java:177)
[17:10:01][Step 8/9] 	at rx.internal.operators.OperatorTimeout$1$1.call(OperatorTimeout.java:41)
[17:10:01][Step 8/9] 	at rx.internal.schedulers.EventLoopsScheduler$EventLoopWorker$2.call(EventLoopsScheduler.java:189)
[17:10:01][Step 8/9] 	at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
[17:10:01][Step 8/9] 	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
[17:10:01][Step 8/9] 	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
[17:10:01][Step 8/9] 	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
[17:10:01][Step 8/9] 	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
[17:10:01][Step 8/9] 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
[17:10:01][Step 8/9] 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
[17:10:01][Step 8/9] 	at java.lang.Thread.run(Thread.java:745)

Is there some limitation on number of running emulators?

Unsupported os windows 10

I download latest swarmwr wrom https://jcenter.bintray.com/com/gojuno/swarmer/swarmer/0.2.2/:swarmer-0.2.2.jar and try tu run with command

java -jar swarmer.jar start

as a result I have an error:

Exception in thread "main" java.lang.IllegalStateException: Unsupported os windows 10, only [Lcom.gojuno.commander.os.Os;@19aa4dfd are supported.
        at com.gojuno.commander.os.ProcessesKt.os(Processes.kt:133)
        at com.gojuno.commander.os.ProcessesKt.access$os(Processes.kt:1)
        at com.gojuno.commander.os.ProcessesKt$process$1.call(Processes.kt:54)
        at com.gojuno.commander.os.ProcessesKt$process$1.call(Processes.kt)
        at rx.internal.operators.OnSubscribeCreate.call(OnSubscribeCreate.java:72)
        at rx.internal.operators.OnSubscribeCreate.call(OnSubscribeCreate.java:32)
        at rx.Observable.unsafeSubscribe(Observable.java:10346)
        at rx.internal.operators.OperatorSubscribeOn$SubscribeOnSubscriber.call(OperatorSubscribeOn.java:100)
        at rx.internal.schedulers.CachedThreadScheduler$EventLoopWorker$1.call(CachedThreadScheduler.java:230)
        at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
        at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
        at java.util.concurrent.FutureTask.run(Unknown Source)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(Unknown Source)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)

Swarmer got stuck on "Starting emulator" if it started on a remote machine via SSH

ssh remote-machine
java -jar swarmer.jar start ...

Output:

[Fri Jul 21 16:01:59 MSK 2017]: Already running emulators: []
[Fri Jul 21 16:01:59 MSK 2017]: Creating avd test_emulator_1.
[Fri Jul 21 16:02:01 MSK 2017]: Avd test_emulator_1 created in 2.346 seconds.
[Fri Jul 21 16:02:01 MSK 2017]: Ports for emulator test_emulator_1: 5554, 5555.
[Fri Jul 21 16:02:01 MSK 2017]: Starting emulator test_emulator_1.
Timeout 180 seconds, failed to start emulator test_emulator_1.

The same command works well if it executed on the remote-machine directly.

Gradle Plugin

👋 Inspired by the plugin for Composer I wrote a gradle plugin for Swarmer.
It is my first gradle plugin so would love some feedback if you guys are at all interested, if not, that's fine too 😄. If it's something you guys are interested in I'd like feedback on anything, but in particular the DSL and the name spacing before I add tests and set up CI. There is already a 0.1 published if you'd like to try it out quickly.

https://github.com/keiththompson/swarmer-gradle-plugin

Mocking framework

Hi,

hope find you well with this cold call.

I am an author of mocking framework for Kotlin

I see you are using mockito-kotlin.

I just want you to be aware that there is solution that fully supports Kotlin and ask to try it in your new/current projects.

I can help you if you answer to this issue.

Thanks and please star it

[ Timeout ] Why max timeout is 180 sec?

First of all, I really love your work. Thank you so much for that !

When I start an armv7 emulator with a 600 sec timeout (yes those emulators are incredibly slow) a 180 sec timeout stop it. So why is there a 180 sec limitation to this option?

Option to keep existing AVDs

Currently, AVDs get deleted and recreated on every execution of swarmer. To speed up our tests we would like to keep existing AVDs. A flag to keep AVDs if they already exist would be great, something like --keep-existing-avds.

Path of Executable JAR listed in README seems incorrect

The curl command listed
curl --fail --location https://jcenter.bintray.com/com/gojuno/swarmer/swarmer/${SWARMER_VERSION}/swarmer-${SWARMER_VERSION}.jar --output /tmp/swarmer.jarwill download swarmer.jar but the invocation example says java -jar swarmer-latest-version.jar

Shouldn't this be java -jar swarmer.jar ? otherwise i get error Error: Unable to access jarfile /tmp/swarmer-latest-version.jar

Heuristics for waiting boot process to finish not working with -no-window

When starting emulator with options -no-audio -no-window -gpu off TimeoutException will happen while waiting for boot process to finish.
Emulator is started in the background, but since init.svc.bootanim property is not set when starting emulator with provided options the script will result in timeout.

Executed command:

java -jar swarmer-0.2.0.jar start \
--emulator-name ANDROID_25_x86 \
--package "system-images;android-25;google_apis;x86" \
--android-abi x86 \
--path-to-config-ini config/android_25_x86_config.ini \
--emulator-start-options -no-audio -no-window -gpu off -prop persist.sys.language=en -prop persist.sys.country=US

Produced output:

[Thu Jul 13 17:07:59 EEST 2017]: Creating avd ANDROID_25_x86.
[Thu Jul 13 17:08:02 EEST 2017]: Avd ANDROID_25_x86 created in 2.346 seconds.
[Thu Jul 13 17:08:02 EEST 2017]: Ports for emulator ANDROID_25_x86: 5554, 5555.
[Thu Jul 13 17:08:02 EEST 2017]: Starting emulator ANDROID_25_x86.
[Thu Jul 13 17:08:15 EEST 2017]: Emulator Emulator(id=emulator-5554, name=ANDROID_25_x86) started in 13.048 seconds.
[Thu Jul 13 17:08:15 EEST 2017]: Waiting boot process to finish for emulator Emulator(id=emulator-5554, name=ANDROID_25_x86).
Timeout 180 seconds, failed to start emulator ANDROID_25_x86.
Exception in thread "main" java.lang.RuntimeException: java.util.concurrent.TimeoutException
        at rx.exceptions.Exceptions.propagate(Exceptions.java:58)
        at rx.observables.BlockingObservable.blockForSingle(BlockingObservable.java:464)
        at rx.observables.BlockingObservable.firstOrDefault(BlockingObservable.java:196)
        at com.gojuno.swarmer.EmulatorsKt.startEmulators(Emulators.kt:49)
        at com.gojuno.swarmer.MainKt.main(Main.kt:7)
Caused by: java.util.concurrent.TimeoutException
        at rx.internal.operators.OperatorTimeoutBase$TimeoutSubscriber.onTimeout(OperatorTimeoutBase.java:177)
        at rx.internal.operators.OperatorTimeout$1$1.call(OperatorTimeout.java:41)
        at rx.internal.schedulers.EventLoopsScheduler$EventLoopWorker$2.call(EventLoopsScheduler.java:189)
        at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)

Make a new release from master

I see that #42 PR was merged on 3 Jul 2018, but there was no release which includes this PR. Latest release was on 23 May 2018 and now there are 2 commit on master since it.

Is it possible to make a new release?

Option to create snapshots after first boot

In order to make Swarmer faster, it would be great if there was an option for creating snapshots on the initial boot. Maybe with an option like --create-snapshots. The idea is to create a snapshot on the initial boot because the state is clean and then start emulators with -no-snapshot-save so that we never override this clean snapshot. Snapshots should only be created if there is no existing snapshot.

You can manually create a snapshot from an emulator using these commands:

telnet 127.0.0.1 EMULATOR_PORT
auth AUTH_TOKEN // Content of $HOME/.emulator_console_auth_token
avd snapshot save default_boot
quit

This change only makes sense if avds are kept and not recreated (see #41 and #42).

Unable to create and start an emulator

I am unable to create an emulator. I have Android SDK Tools 25.2.3 downloaded and installed system-images;android-25;google_apis;x86 as well. Any pointers would be super helpful. Details Below

Code I am running

#!/usr/bin/env bash
 
SWARMER_VERSION=0.1.0
 curl --fail --location https://jcenter.bintray.com/com/gojuno/swarmer/swarmer/${SWARMER_VERSION}/swarmer-${SWARMER_VERSION}.jar --output /tmp/swarmer.jar
 
 java -jar /tmp/swarmer.jar \
 --emulator-name test_emulator_1 \
 --package "system-images;android-25;google_apis;x86" \
 --android-abi google_apis/x86_64 \
 --path-to-config-ini emulator_config.ini \
 --emulator-start-options -prop persist.sys.language=en -prop persist.sys.country=US \
 --redirect-logcat-to test_emulator_1_logcat.txt

Main Error Message

Cannot run program "/usr/local/android-sdk/tools/bin/avdmanager": error=2, No such file or directory

Full Stacktrace

[Mon Jun 26 19:32:16 UTC 2017]: Error during creation of avd test_emulator_1, error = rx.exceptions.CompositeException: 1 exceptions occurred.
[Mon Jun 26 19:32:16 UTC 2017]: Error during creation of avd test_emulator_1, error = rx.exceptions.CompositeException: 1 exceptions occurred.
[Mon Jun 26 19:32:16 UTC 2017]: Error during creation of avd test_emulator_1, error = rx.exceptions.CompositeException: 1 exceptions occurred.
[Mon Jun 26 19:32:16 UTC 2017]: Could not create avd test_emulator_1, error = rx.exceptions.CompositeException: 1 exceptions occurred.
Exception in thread "main" rx.exceptions.CompositeException: 1 exceptions occurred.
	at rx.internal.operators.OperatorMerge$MergeSubscriber.reportError(OperatorMerge.java:268)
	at rx.internal.operators.OperatorMerge$MergeSubscriber.checkTerminate(OperatorMerge.java:818)
	at rx.internal.operators.OperatorMerge$MergeSubscriber.emitLoop(OperatorMerge.java:579)
	at rx.internal.operators.OperatorMerge$MergeSubscriber.emit(OperatorMerge.java:568)
	at rx.internal.operators.OperatorMerge$InnerSubscriber.onError(OperatorMerge.java:852)
	at rx.internal.operators.OnSubscribeMap$MapSubscriber.onError(OnSubscribeMap.java:88)
	at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.checkTerminated(OperatorObserveOn.java:273)
	at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.call(OperatorObserveOn.java:216)
	at rx.internal.schedulers.CachedThreadScheduler$EventLoopWorker$1.call(CachedThreadScheduler.java:230)
	at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:748)
  ComposedException 1 :
	java.io.IOException: Cannot run program "/usr/local/android-sdk/tools/bin/avdmanager": error=2, No such file or directory
		at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
		at com.gojuno.cmd.common.ProcessesKt$process$1.call(Processes.kt:69)
		at com.gojuno.cmd.common.ProcessesKt$process$1.call(Processes.kt)
		at rx.internal.operators.OnSubscribeCreate.call(OnSubscribeCreate.java:72)
		at rx.internal.operators.OnSubscribeCreate.call(OnSubscribeCreate.java:32)
		at rx.Observable.unsafeSubscribe(Observable.java:10346)
		at rx.internal.operators.OperatorSubscribeOn$SubscribeOnSubscriber.call(OperatorSubscribeOn.java:100)
		at rx.internal.schedulers.CachedThreadScheduler$EventLoopWorker$1.call(CachedThreadScheduler.java:230)
		at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
		at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
		at java.util.concurrent.FutureTask.run(FutureTask.java:266)
		at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
		at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
		at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
		at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
		at java.lang.Thread.run(Thread.java:748)
	Caused by: java.io.IOException: error=2, No such file or directory
		at java.lang.UNIXProcess.forkAndExec(Native Method)
		at java.lang.UNIXProcess.<init>(UNIXProcess.java:247)
		at java.lang.ProcessImpl.start(ProcessImpl.java:134)
		at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
		at com.gojuno.cmd.common.ProcessesKt$process$1.call(Processes.kt:69)
		at com.gojuno.cmd.common.ProcessesKt$process$1.call(Processes.kt)
		at rx.internal.operators.OnSubscribeCreate.call(OnSubscribeCreate.java:72)
		at rx.internal.operators.OnSubscribeCreate.call(OnSubscribeCreate.java:32)
		at rx.Observable.unsafeSubscribe(Observable.java:10346)
		at rx.internal.operators.OperatorSubscribeOn$SubscribeOnSubscriber.call(OperatorSubscribeOn.java:100)
		at rx.internal.schedulers.CachedThreadScheduler$EventLoopWorker$1.call(CachedThreadScheduler.java:230)
		at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
		at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
		at java.util.concurrent.FutureTask.run(FutureTask.java:266)
		at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
		at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
		at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
		at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
		at java.lang.Thread.run(Thread.java:748)

Add support for 'emulator-headless'

Headless emulator support was added in emulator v28.1, is is possible to update swarmer to offer a --headless param option that would simply delegate all calls to $ANDROID_HOME/emulator/emulator-headless instead?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.