File size: 3,815 Bytes
42cc6d2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# Copyright (c) Meta Platforms, Inc. and affiliates.
# All rights reserved.
#
# This source code is licensed under the BSD-style license found in the
# LICENSE file in the root directory of this source tree.

"""
FastAPI application for the Android Environment.

This module creates an HTTP server that exposes the AndroidEnvironment
over HTTP endpoints, making it accessible via HTTPEnvClient.

The server is configured via environment variables:
    - ANDROID_AVD_NAME: Name of the Android Virtual Device (required)
    - ANDROID_TASK_PATH: Path to task textproto file (required)
    - ANDROID_ADB_PATH: Path to ADB (default: ~/Android/Sdk/platform-tools/adb)
    - ANDROID_EMULATOR_PATH: Path to emulator (default: ~/Android/Sdk/emulator/emulator)
    - ANDROID_AVD_HOME: AVD home directory (default: ~/.android/avd)
    - ANDROID_SDK_ROOT: SDK root directory (default: ~/Android/Sdk)
    - ANDROID_RUN_HEADLESS: Run headless (default: true)
    - ANDROID_IMAGE_FORMAT: Image encoding format (default: JPEG)
    - ANDROID_IMAGE_QUALITY: JPEG quality 1-100 (default: 85)

Usage:
    # Development (with environment variables):
    export ANDROID_AVD_NAME=Pixel_6_API_33
    export ANDROID_TASK_PATH=/workspace/tasks/my_task.textproto
    uvicorn envs.android_env.server.app:app --reload --host 0.0.0.0 --port 8000

    # Production:
    uvicorn envs.android_env.server.app:app --host 0.0.0.0 --port 8000

    # Or run directly:
    python -m envs.android_env.server.app
"""

import os
from pathlib import Path

from core.env_server.http_server import create_app

from ..models import AndroidAction, AndroidObservation
from .android_environment import AndroidEnvironment

# Get configuration from environment variables
AVD_NAME = os.getenv("ANDROID_AVD_NAME")
TASK_PATH = os.getenv("ANDROID_TASK_PATH")
ADB_PATH = os.getenv("ANDROID_ADB_PATH", "~/Android/Sdk/platform-tools/adb")
EMULATOR_PATH = os.getenv(
    "ANDROID_EMULATOR_PATH", "~/Android/Sdk/emulator/emulator"
)
AVD_HOME = os.getenv("ANDROID_AVD_HOME", "~/.android/avd")
SDK_ROOT = os.getenv("ANDROID_SDK_ROOT", "~/Android/Sdk")
RUN_HEADLESS = os.getenv("ANDROID_RUN_HEADLESS", "true").lower() == "true"
IMAGE_FORMAT = os.getenv("ANDROID_IMAGE_FORMAT", "JPEG")
IMAGE_QUALITY = int(os.getenv("ANDROID_IMAGE_QUALITY", "85"))

# Validate required configuration
if not AVD_NAME:
    raise ValueError(
        "ANDROID_AVD_NAME environment variable is required. "
        "Set it to the name of your Android Virtual Device."
    )

if not TASK_PATH:
    raise ValueError(
        "ANDROID_TASK_PATH environment variable is required. "
        "Set it to the path of your task textproto file."
    )

# Expand paths
ADB_PATH = str(Path(ADB_PATH).expanduser())
EMULATOR_PATH = str(Path(EMULATOR_PATH).expanduser())
AVD_HOME = str(Path(AVD_HOME).expanduser())
SDK_ROOT = str(Path(SDK_ROOT).expanduser())
TASK_PATH = str(Path(TASK_PATH).expanduser())

print(f"Initializing Android Environment with:")
print(f"  AVD Name: {AVD_NAME}")
print(f"  Task Path: {TASK_PATH}")
print(f"  ADB Path: {ADB_PATH}")
print(f"  Emulator Path: {EMULATOR_PATH}")
print(f"  AVD Home: {AVD_HOME}")
print(f"  SDK Root: {SDK_ROOT}")
print(f"  Headless: {RUN_HEADLESS}")
print(f"  Image Format: {IMAGE_FORMAT} (Quality: {IMAGE_QUALITY})")

# Create the environment instance
env = AndroidEnvironment(
    task_path=TASK_PATH,
    avd_name=AVD_NAME,
    adb_path=ADB_PATH,
    emulator_path=EMULATOR_PATH,
    android_avd_home=AVD_HOME,
    android_sdk_root=SDK_ROOT,
    run_headless=RUN_HEADLESS,
    image_format=IMAGE_FORMAT,
    image_quality=IMAGE_QUALITY,
)

# Create the FastAPI app with web interface
app = create_app(env, AndroidAction, AndroidObservation, env_name="android_env")


if __name__ == "__main__":
    import uvicorn

    uvicorn.run(app, host="0.0.0.0", port=8000)