2011-04-21 11 views
5
def start_test(request): 
    os.system('echo Starting emulator...') 
    os.system('./android-sdk-linux_x86/tools/emulator -avd testavd &') 
    return HttpResponse("OK") 

Aquí está el código barebones de lo que estoy tratando de hacer.
Cuando se ejecuta este código, el servidor deja de responder mientras ejecuta el emulador. Cualquier ayuda apreciada.
Estoy usando el servidor de desarrollo django. Aquí está la salida del servidor:Lanzamiento de un emulador de Android de Python-Django

Django version 1.1.1, using settings 'Cloust.settings' 
Development server is running at http://0.0.0.0:8000/ 
Quit the server with CONTROL-C. 
Starting emulator... 
[21/Apr/2011 02:00:06] "GET /start_test/a.apk/ HTTP/1.1" 200 5 
emulator: warning: opening audio output failed 

emulator: emulator window was out of view and was recentred 
+0

¿Por qué estás tratando de hacer esto? El emulador se ejecutará en el servidor y no será visible desde el cliente. ¿Cuál es el punto de? –

+0

@Daniel Roseman: Tengo un poco más de tiempo hoy, así que para responder correctamente a su pregunta, se podrá acceder al emulador a través de VNC. Más específicamente, usando TightVNC y guacamole. – Mark

Respuesta

0

Todavía no he tenido tiempo de resolver adecuadamente este problema, pero utilizando subprocess.Popen me permite ejecutar comandos en el emulador después :

print 'Starting emulator...' 
subprocess.Popen(['emulator', '-avd', 'testavd']) 
os.system('adb wait-for-device') 
os.system('Perform whatever adb commands you need') 

vale la pena señalar que esto está utilizando el servidor de desarrollo de Django, que se ha empezado a utilizar sudo, por lo que, obviamente, esto está lejos de ser ideal.

+0

Heey Mark, puedo lanzar mi AVD. Pero necesito lanzar un AVD limpio, como borrar los datos del usuario e iniciar uno nuevo. ¿Cómo debería hacerlo? –

2

Tal vez debería intentar ejecutar el emulador en un hilo separado?

E.g.

import subprocess 
thread = threading.Thread(target=subprocess.popen(['./android-sdk-linux_x86/tools/emulator', '-avd', 'testavd', '&']) 
thread.start() 
1

Considerando que está usando django, probablemente necesite administrar los emuladores de alguna manera. Enhebrar no es realmente una buena opción en este caso, creo.

yo sugeriría mirar en la gestión de tareas, en este caso con algo como http://code.google.com/p/django-tasks/

0

Un problema con ADB es que necesita varios comandos para hacer las cosas.
Por ejemplo:

adb shell 

su 

cp /data/local/x /data/local/y 

exit 

adb pull /data/local/y 

¿Se puede hacer uso de popen pitón y OS-sistema? Intenté el ejemplo a continuación sin éxito ...

print 'Starting emulator...' 
subprocess.Popen(['emulator', '-avd', 'testavd']) 
os.system('adb wait-for-device') 
os.system('Perform whatever adb commands you need') 
0

No sé si ayudará a uno (espero que lo haga).

Quería que el emulador se abriera antes de que comenzaran las pruebas de automatización y para algunos reson appium no puede hacerlo. en mi caso, necesitaba agregar la ruta completa del emulador.

check_output(["/Users/{USER_NAME}/Library/Android/sdk/tools/emulator", "-avd", "Pixel_API_26"]) 

Espero que ayude a alguien hasta que appium solucione este problema.

Cuestiones relacionadas