android android-emulator jenkins hudson android-emulator-plugin

¿Por qué el complemento de emulador de Android Jenkins está recreando mis instantáneas de emulador en cada compilación?



android-emulator hudson (2)

Uso a Jenkins para construir uno de mis proyectos. El complemento del emulador de Android inicia automáticamente un emulador con la siguiente configuración:

Configuración del complemento emulador:

.

Cada vez que el trabajo se está ejecutando obtengo el siguiente resultado:

Erasing existing emulator data... $ /ci/home/tools/android-sdk//tools/emulator -no-boot-anim -ports 64470,64471 -prop persist.sys.language=de -prop persist.sys.country=DE -avd hudson_de-DE_240_480x720_Google_Inc._Google_APIs_8 -no-snapshot-load -no-snapshot-save -wipe-data . . shell input keyevent 4 [android] Giving the system some time to settle before creating initial snapshot... $ . . localhost:64471 shell log -p v -t Jenkins "Creating snapshot..." [android] Creating snapshot... $

Registro completo a continuación.

Parece que el complemento está creando un nuevo emulador cada vez y no está utilizando instantáneas. Esto toma algo entre 2 y 4 minutos dependiendo de la configuración del emulador.

El complemento crea archivos .avd y .ini en el directorio .android / avd dentro de la carpeta de trabajo. Los avds no se eliminan después del proceso de ejecución.

Si desactivo la configuración de uso de instantáneas, el emulador necesita menos de un minuto para comenzar.

¿Se trata de un problema con el complemento del emulador o las instantáneas no son posibles debido a mi configuración?

Espero que el uso de instantáneas acelere mucho mi proceso de construcción.

Registro completo:

$ /ci/home/tools/android-sdk//tools/android list target [android] Using Android SDK: /ci/home/tools/android-sdk/ [android] Adding 200M SD card to AVD ''hudson_de-DE_240_480x720_Google_Inc._Google_APIs_8''... [android] Setting hardware properties: hw.ramSize: 512 $ /ci/home/tools/android-sdk//platform-tools/adb start-server $ /ci/home/tools/android-sdk//tools/emulator -snapshot-list -no-window -avd hudson_de-DE_240_480x720_Google_Inc._Google_APIs_8 [android] Starting Android emulator and creating initial snapshot [android] Erasing existing emulator data... $ /ci/home/tools/android-sdk//tools/emulator -no-boot-anim -ports 64470,64471 -prop persist.sys.language=de -prop persist.sys.country=DE -avd hudson_de-DE_240_480x720_Google_Inc._Google_APIs_8 -no-snapshot-load -no-snapshot-save -wipe-data * daemon not running. starting it now on port 64472 * * daemon started successfully * $ /ci/home/tools/android-sdk//platform-tools/adb connect localhost:64471 [android] Waiting for emulator to finish booting... $ /ci/home/tools/android-sdk//platform-tools/adb -s localhost:64471 shell getprop dev.bootcomplete error: device offline $ /ci/home/tools/android-sdk//platform-tools/adb connect localhost:64471 $ /ci/home/tools/android-sdk//platform-tools/adb -s localhost:64471 shell getprop dev.bootcomplete $ /ci/home/tools/android-sdk//platform-tools/adb connect localhost:64471 $ /ci/home/tools/android-sdk//platform-tools/adb -s localhost:64471 shell getprop dev.bootcomplete $ /ci/home/tools/android-sdk//platform-tools/adb disconnect localhost:64471 $ /ci/home/tools/android-sdk//platform-tools/adb connect localhost:64471 $ /ci/home/tools/android-sdk//platform-tools/adb -s localhost:64471 shell getprop dev.bootcomplete $ /ci/home/tools/android-sdk//platform-tools/adb connect localhost:64471 $ /ci/home/tools/android-sdk//platform-tools/adb -s localhost:64471 shell getprop dev.bootcomplete $ /ci/home/tools/android-sdk//platform-tools/adb connect localhost:64471 $ /ci/home/tools/android-sdk//platform-tools/adb -s localhost:64471 shell getprop dev.bootcomplete $ /ci/home/tools/android-sdk//platform-tools/adb -s localhost:64471 logcat -v time $ /ci/home/tools/android-sdk//platform-tools/adb connect localhost:64471 [android] Attempting to unlock emulator screen $ /ci/home/tools/android-sdk//platform-tools/adb -s localhost:64471 shell input keyevent 82 $ /ci/home/tools/android-sdk//platform-tools/adb -s localhost:64471 shell input keyevent 4 [android] Giving the system some time to settle before creating initial snapshot... $ /ci/home/tools/android-sdk//platform-tools/adb connect localhost:64471 $ /ci/home/tools/android-sdk//platform-tools/adb -s localhost:64471 logcat -c $ /ci/home/tools/android-sdk//platform-tools/adb -s localhost:64471 shell log -p v -t Jenkins "Creating snapshot..." [android] Creating snapshot... $ /ci/home/tools/android-sdk//platform-tools/adb connect localhost:64471 [android] Emulator is ready for use (took 158 seconds)

Buildfile para un trabajo de ejemplo:

<?xml version=''1.0'' encoding=''UTF-8''?> <project> <actions/> <description></description> <keepDependencies>false</keepDependencies> <properties/> <scm class="hudson.plugins.git.GitSCM"> <configVersion>2</configVersion> <userRemoteConfigs> <hudson.plugins.git.UserRemoteConfig> <name></name> <refspec></refspec> <url>git@project...</url> </hudson.plugins.git.UserRemoteConfig> </userRemoteConfigs> <branches> <hudson.plugins.git.BranchSpec> <name>master</name> </hudson.plugins.git.BranchSpec> </branches> <disableSubmodules>false</disableSubmodules> <recursiveSubmodules>false</recursiveSubmodules> <doGenerateSubmoduleConfigurations>false</doGenerateSubmoduleConfigurations> <authorOrCommitter>false</authorOrCommitter> <clean>false</clean> <wipeOutWorkspace>false</wipeOutWorkspace> <pruneBranches>false</pruneBranches> <remotePoll>false</remotePoll> <ignoreNotifyCommit>false</ignoreNotifyCommit> <useShallowClone>false</useShallowClone> <buildChooser class="hudson.plugins.git.util.DefaultBuildChooser"/> <gitTool>default</gitTool> <submoduleCfg class="list"/> <relativeTargetDir></relativeTargetDir> <reference></reference> <excludedRegions></excludedRegions> <excludedUsers></excludedUsers> <gitConfigName></gitConfigName> <gitConfigEmail></gitConfigEmail> <skipTag>false</skipTag> <includedRegions></includedRegions> <scmName></scmName> </scm> <canRoam>true</canRoam> <disabled>false</disabled> <blockBuildWhenDownstreamBuilding>true</blockBuildWhenDownstreamBuilding> <blockBuildWhenUpstreamBuilding>true</blockBuildWhenUpstreamBuilding> <triggers class="vector"> <hudson.triggers.SCMTrigger> <spec>*/5 * * * *</spec> </hudson.triggers.SCMTrigger> </triggers> <concurrentBuild>false</concurrentBuild> <builders> <hudson.tasks.Ant> <targets>clean debug install</targets> <antName>(Default)</antName> </hudson.tasks.Ant> <hudson.tasks.Ant> <targets></targets> <antName>(Default)</antName> <buildFile>checkstyle-ant.xml</buildFile> </hudson.tasks.Ant> <hudson.tasks.Shell> <command>os_opts=&quot;-Djava.awt.headless=true&quot; lint --xml lint-results.xml .</command> </hudson.tasks.Shell> <hudson.plugins.android__emulator.monkey.MonkeyBuilder> <packageId>de....</packageId> <eventCount>1000</eventCount> <throttleMs>10</throttleMs> <seed>timestamp</seed> </hudson.plugins.android__emulator.monkey.MonkeyBuilder> <hudson.tasks.Shell> ... distribution script </hudson.tasks.Shell> </builders> <publishers> <org.jenkinsci.plugins.android__lint.LintPublisher> <healthy></healthy> <thresholdLimit>low</thresholdLimit> <pluginName>[android-lint] </pluginName> <defaultEncoding></defaultEncoding> <canRunOnFailed>false</canRunOnFailed> <useStableBuildAsReference>false</useStableBuildAsReference> <useDeltaValues>false</useDeltaValues> <thresholds> <unstableTotalAll></unstableTotalAll> <unstableTotalHigh></unstableTotalHigh> <unstableTotalNormal></unstableTotalNormal> <unstableTotalLow></unstableTotalLow> <unstableNewAll></unstableNewAll> <unstableNewHigh></unstableNewHigh> <unstableNewNormal></unstableNewNormal> <unstableNewLow></unstableNewLow> <failedTotalAll></failedTotalAll> <failedTotalHigh></failedTotalHigh> <failedTotalNormal></failedTotalNormal> <failedTotalLow></failedTotalLow> <failedNewAll></failedNewAll> <failedNewHigh></failedNewHigh> <failedNewNormal></failedNewNormal> <failedNewLow></failedNewLow> </thresholds> <shouldDetectModules>false</shouldDetectModules> <dontComputeNew>false</dontComputeNew> <doNotResolveRelativePaths>false</doNotResolveRelativePaths> <pattern></pattern> </org.jenkinsci.plugins.android__lint.LintPublisher> <hudson.plugins.checkstyle.CheckStylePublisher> <healthy></healthy> <unHealthy></unHealthy> <thresholdLimit>low</thresholdLimit> <pluginName>[CHECKSTYLE] </pluginName> <defaultEncoding></defaultEncoding> <canRunOnFailed>false</canRunOnFailed> <useStableBuildAsReference>false</useStableBuildAsReference> <useDeltaValues>false</useDeltaValues> <thresholds> <unstableTotalAll></unstableTotalAll> <unstableTotalHigh></unstableTotalHigh> <unstableTotalNormal></unstableTotalNormal> <unstableTotalLow></unstableTotalLow> <failedTotalAll></failedTotalAll> <failedTotalHigh></failedTotalHigh> <failedTotalNormal></failedTotalNormal> <failedTotalLow></failedTotalLow> </thresholds> <shouldDetectModules>false</shouldDetectModules> <dontComputeNew>true</dontComputeNew> <doNotResolveRelativePaths>false</doNotResolveRelativePaths> <pattern></pattern> </hudson.plugins.checkstyle.CheckStylePublisher> <hudson.plugins.warnings.WarningsPublisher> <healthy></healthy> <unHealthy></unHealthy> <thresholdLimit>low</thresholdLimit> <pluginName>[WARNINGS] </pluginName> <defaultEncoding></defaultEncoding> <canRunOnFailed>false</canRunOnFailed> <useStableBuildAsReference>false</useStableBuildAsReference> <useDeltaValues>false</useDeltaValues> <thresholds> <unstableTotalAll></unstableTotalAll> <unstableTotalHigh></unstableTotalHigh> <unstableTotalNormal></unstableTotalNormal> <unstableTotalLow></unstableTotalLow> <failedTotalAll></failedTotalAll> <failedTotalHigh></failedTotalHigh> <failedTotalNormal></failedTotalNormal> <failedTotalLow></failedTotalLow> </thresholds> <shouldDetectModules>false</shouldDetectModules> <dontComputeNew>true</dontComputeNew> <doNotResolveRelativePaths>true</doNotResolveRelativePaths> <parserConfigurations/> <consoleParsers> <hudson.plugins.warnings.ConsoleParser> <parserName>Java Compiler (Eclipse)</parserName> </hudson.plugins.warnings.ConsoleParser> </consoleParsers> </hudson.plugins.warnings.WarningsPublisher> <hudson.plugins.analysis.collector.AnalysisPublisher> <healthy></healthy> <unHealthy></unHealthy> <thresholdLimit>low</thresholdLimit> <pluginName>[ANALYSIS-COLLECTOR] </pluginName> <defaultEncoding></defaultEncoding> <canRunOnFailed>false</canRunOnFailed> <useStableBuildAsReference>false</useStableBuildAsReference> <useDeltaValues>false</useDeltaValues> <thresholds> <unstableTotalAll></unstableTotalAll> <unstableTotalHigh></unstableTotalHigh> <unstableTotalNormal></unstableTotalNormal> <unstableTotalLow></unstableTotalLow> <failedTotalAll></failedTotalAll> <failedTotalHigh></failedTotalHigh> <failedTotalNormal></failedTotalNormal> <failedTotalLow></failedTotalLow> </thresholds> <shouldDetectModules>false</shouldDetectModules> <dontComputeNew>true</dontComputeNew> <doNotResolveRelativePaths>true</doNotResolveRelativePaths> <isCheckStyleDeactivated>false</isCheckStyleDeactivated> <isDryDeactivated>true</isDryDeactivated> <isFindBugsDeactivated>true</isFindBugsDeactivated> <isPmdDeactivated>true</isPmdDeactivated> <isOpenTasksDeactivated>true</isOpenTasksDeactivated> <isWarningsDeactivated>false</isWarningsDeactivated> </hudson.plugins.analysis.collector.AnalysisPublisher> <hudson.plugins.android__emulator.monkey.MonkeyRecorder> <failureOutcome>FAILURE</failureOutcome> </hudson.plugins.android__emulator.monkey.MonkeyRecorder> <hudson.plugins.cigame.GamePublisher/> <hudson.tasks.Mailer> <recipients></recipients> <dontNotifyEveryUnstableBuild>false</dontNotifyEveryUnstableBuild> <sendToIndividuals>true</sendToIndividuals> </hudson.tasks.Mailer> </publishers> <buildWrappers> <hudson.plugins.locksandlatches.LockWrapper> <locks> <hudson.plugins.locksandlatches.LockWrapper_-LockWaitConfig> <name>AndroidEmulator</name> </hudson.plugins.locksandlatches.LockWrapper_-LockWaitConfig> </locks> </hudson.plugins.locksandlatches.LockWrapper> <hudson.plugins.android__emulator.AndroidEmulator> <osVersion>Google Inc.:Google APIs:8</osVersion> <screenDensity>240</screenDensity> <screenResolution>480x720</screenResolution> <deviceLocale>de_DE</deviceLocale> <sdCardSize>200M</sdCardSize> <hardwareProperties> <hudson.plugins.android__emulator.AndroidEmulator_-HardwareProperty> <key>hw.ramSize</key> <value>512</value> </hudson.plugins.android__emulator.AndroidEmulator_-HardwareProperty> </hardwareProperties> <wipeData>false</wipeData> <showWindow>true</showWindow> <useSnapshots>true</useSnapshots> <deleteAfterBuild>false</deleteAfterBuild> <startupDelay>0</startupDelay> <commandLineOptions></commandLineOptions> </hudson.plugins.android__emulator.AndroidEmulator> </buildWrappers> </project>


Además de la respuesta de Christopher Orr , hay otra causa posible. En mi entorno, el emulator -snapshot-list listó el tamaño de mi instantánea como "1.0G". El patrón que coincide con las instantáneas en el complemento del emulador de Android a partir del 2014-01-14 coincide con los valores de megabyte de números enteros.

Envié una solicitud de extracción para abordar esa causa.


Se b.android.com/34233 un b.android.com/34233 en SDK Tools r20, por lo que al intentar enumerar las instantáneas disponibles (mediante el emulator -snapshot-list del emulator -snapshot-list ) se produciría un bloqueo.

Dado que el comando se bloquea sin enumerar las instantáneas disponibles, el Complemento del emulador de Android cree que no hay instantáneas existentes, lo que hace que se cree una nueva instantánea en cada compilación.

Descubrí que estos bloqueos solo ocurren con ciertas versiones de la aplicación del emulator , es decir, es posible evitar el bloqueo.

Afortunadamente, el complemento Jenkins te permite seleccionar el binario del emulator para ejecutarlo.

Así que puede solucionar este problema ingresando a la configuración de su trabajo, presionando Avanzado ... en la configuración del emulador y seleccionando el binario " emulator-arm " (u otro).