androweb / app.py
sudo-soldier's picture
Create app.py
ef5d0f8 verified
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)