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

Oto kod podstawowy tego, co próbuję zrobić.
Po wykonaniu tego kodu serwer przestaje odpowiadać podczas działania emulatora. Każda pomoc doceniona.
Używam serwera programistycznego django. Oto dane wyjściowe serwera:Uruchamianie emulatora Androida z 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

Dlaczego próbujesz to zrobić? Emulator będzie działał na serwerze i nie będzie widoczny od klienta. Jaki jest sens? –

+0

@Daniel Roseman: Dzisiaj mam trochę więcej czasu, więc aby właściwie odpowiedzieć na twoje pytanie, emulator będzie dostępny przez VNC. Dokładniej, używając TightVNC i guacamole. – Mark

Odpowiedz

0

ja nadal nie dostał się, aby prawidłowo rozwiązać ten problem, ale przy użyciu subprocess.Popen pozwala mi na wykonywanie poleceń na emulatorze potem :

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

warto zauważyć, że ten wykorzystuje serwer deweloperski Django, który został uruchomiony przy użyciu sudo, więc oczywiście jest to dalekie od ideału.

+0

Heey Mark, jestem w stanie uruchomić mój AVD. Ale muszę uruchomić czysty AVD, na przykład wyczyścić dane użytkownika i uruchomić nowy. Jak mam to zrobić? –

2

Może powinieneś spróbować uruchomić emulator w osobnym wątku?

E.g.

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

Biorąc pod uwagę, że używasz django, prawdopodobnie będziesz musiał jakoś zarządzać emulatorami. Gwintowanie nie jest tak naprawdę dobrym rozwiązaniem w tym przypadku.

bym Proponuję patrząc na zarządzanie zadaniami w tym przypadku z czymś http://code.google.com/p/django-tasks/

0

Jednym z problemów z ADB jest to, że do wykonania zadania potrzebne są liczne polecenia.
Na przykład:

adb shell 

su 

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

exit 

adb pull /data/local/y 

Można to zrobić przy użyciu Pythona popen i OS-system? Wypróbowałem poniższy przykład bez powodzenia.

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

Nie wiem, czy to pomoże (mam nadzieję, że tak).

Chciałem, aby emulator się otworzył, zanim rozpocznie się testowanie automatyki, a dla niektórych aplikacji rezonansowych nie można tego zrobić. w moim przypadku potrzebowałem dodać pełną ścieżkę emulatora.

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

Mam nadzieję, że komuś pomoże, dopóki appium nie rozwiąże tego problemu.

Powiązane problemy