from fastapi import FastAPI, Request, WebSocket from fastapi.staticfiles import StaticFiles from fastapi.responses import HTMLResponse import subprocess import asyncio import os app = FastAPI() # Mount static files app.mount("/static", StaticFiles(directory="static"), name="static") # HTML endpoint @app.get("/", response_class=HTMLResponse) async def read_root(): with open("static/index.html") as f: return f.read() # WebSocket for emulator interaction @app.websocket("/ws") async def websocket_endpoint(websocket: WebSocket): await websocket.accept() # Start emulator in headless mode emulator_process = subprocess.Popen( [ "bash", "-c", "cd /opt/android-sdk/emulator && ./emulator -avd test -no-window -no-audio -gpu swiftshader_indirect -no-snapshot -qemu -vnc :0" ], stdout=subprocess.PIPE, stderr=subprocess.PIPE ) # Start VNC to WebSocket proxy vnc_proxy = subprocess.Popen( ["websockify", "6080", "localhost:5900"], stdout=subprocess.PIPE, stderr=subprocess.PIPE ) try: while True: data = await websocket.receive_text() # Handle input commands if needed await websocket.send_text("Emulator is running at /vnc.html") except Exception as e: print(f"WebSocket error: {e}") finally: emulator_process.terminate() vnc_proxy.terminate() if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=7860)