Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .bazelignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
android_env/apps
1 change: 1 addition & 0 deletions .bazelversion
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
7.4.0
21 changes: 14 additions & 7 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ jobs:
TEST_TMPDIR: '/tmp'
strategy:
matrix:
python-version: ["3.11", "3.12", "3.13"]
python-version: ["3.11", "3.12"]
steps:
- uses: actions/checkout@v6

Expand All @@ -27,13 +27,20 @@ jobs:
with:
python-version: ${{ matrix.python-version }}

- name: Install dependencies
- name: Setup Bazel
uses: bazel-contrib/setup-bazel@0.19.0
with:
bazelisk-cache: true
disk-cache: true
repository-cache: true

- name: Configure MODULE.bazel python version
run: |
pip install --upgrade pip setuptools
pip install .[testing]
MATRIX_VER="${{ matrix.python-version }}"
VER_UNDERSCORE="${MATRIX_VER//./_}"
sed -i "s/python_version = \"3.11\"/python_version = \"$MATRIX_VER\"/g" MODULE.bazel
sed -i "s/python_3_11/python_$VER_UNDERSCORE/g" MODULE.bazel

- name: Run tests
run: |
# Find all test files, print their names and execute them in parallel
# with a maximum of 20 proccesses.
find . -type f -name "*_test.py" -print0 | xargs -t -0 -n1 -P 20 python3
bazel test //...
1 change: 1 addition & 0 deletions BUILD.bazel
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
exports_files(["requirements.txt"])
26 changes: 26 additions & 0 deletions MODULE.bazel
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
module(
name = "android_env",
version = "1.3.0",
)

# Core rules
bazel_dep(name = "rules_python", version = "0.34.0")
bazel_dep(name = "rules_proto_grpc_python", version = "5.0.0")
bazel_dep(name = "protobuf", version = "27.2")
bazel_dep(name = "rules_proto", version = "6.0.2")

# Hermetic Python Toolchain
python = use_extension("@rules_python//python/extensions:python.bzl", "python")
python.toolchain(
python_version = "3.11",
)
use_repo(python, "python_3_11")

# Pip dependencies
pip = use_extension("@rules_python//python/extensions:pip.bzl", "pip")
pip.parse(
hub_name = "pip",
python_version = "3.11",
requirements_lock = "//:requirements.txt",
)
use_repo(pip, "pip")
127 changes: 127 additions & 0 deletions android_env/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
load("@rules_python//python:defs.bzl", "py_library", "py_test")
load("@rules_python//python:packaging.bzl", "py_package", "py_wheel")

package(default_visibility = ["//visibility:public"])

py_library(
name = "env_interface",
srcs = ["env_interface.py"],
deps = [
"//android_env/proto:adb_py_pb2",
"//android_env/proto:state_py_pb2",
"@pip//dm_env",
"@pip//numpy",
],
)

py_library(
name = "environment",
srcs = ["environment.py"],
deps = [
":env_interface",
"//android_env/components:adb_call_parser",
"//android_env/components:coordinator",
"//android_env/components:task_manager",
"//android_env/components/simulators:base_simulator",
"//android_env/proto:adb_py_pb2",
"//android_env/proto:state_py_pb2",
"@pip//absl_py",
"@pip//dm_env",
"@pip//numpy",
],
)

py_test(
name = "environment_test",
srcs = ["environment_test.py"],
deps = [
":environment",
"//android_env/components:config_classes",
"//android_env/components:coordinator",
"//android_env/components:task_manager",
"//android_env/components/simulators:base_simulator",
"//android_env/components/simulators/fake:fake_simulator",
"//android_env/proto:adb_py_pb2",
"//android_env/proto:state_py_pb2",
"@pip//absl_py",
"@pip//dm_env",
"@pip//numpy",
],
)

py_library(
name = "loader",
srcs = ["loader.py"],
deps = [
":environment",
"//android_env/components:config_classes",
"//android_env/components:coordinator",
"//android_env/components:device_settings",
"//android_env/components:task_manager",
"//android_env/components/simulators/emulator:emulator_simulator",
"//android_env/components/simulators/emulator:tcp_ports",
"//android_env/components/simulators/fake:fake_simulator",
"//android_env/proto:task_py_pb2",
"@pip//absl_py",
"@pip//protobuf",
],
)

py_test(
name = "loader_test",
srcs = ["loader_test.py"],
deps = [
":env_interface",
":loader",
"//android_env/components:config_classes",
"//android_env/components:coordinator",
"//android_env/components:device_settings",
"//android_env/components:task_manager",
"//android_env/components/simulators/emulator:emulator_simulator",
"//android_env/components/simulators/emulator:tcp_ports",
"//android_env/components/simulators/fake:fake_simulator",
"//android_env/proto:task_py_pb2",
"@pip//absl_py",
],
)

# Packaging rules for PyPI release

py_package(
name = "android_env_pkg",
packages = ["android_env"],
deps = [
":loader",
"//android_env/wrappers:a11y_grpc_wrapper",
"//android_env/wrappers:discrete_action_wrapper",
"//android_env/wrappers:flat_interface_wrapper",
"//android_env/wrappers:float_pixels_wrapper",
"//android_env/wrappers:gym_wrapper",
"//android_env/wrappers:image_rescale_wrapper",
"//android_env/wrappers:last_action_wrapper",
"//android_env/wrappers:rate_limit_wrapper",
"//android_env/wrappers:swipe_action_wrapper",
"//android_env/wrappers:tap_action_wrapper",
],
)

py_wheel(
name = "android_env_wheel",
author = "DeepMind",
distribution = "android_env",
license = "Apache License, Version 2.0",
requires = [
"absl-py>=0.1.0",
"dm-env>=1.6",
"numpy>=1.26.0",
"portpicker>=1.6.0",
"pygame>=2.6.0",
"pillow>=10.4.0",
"gymnasium>=0.29.1",
"protobuf>=5.27.2",
"grpcio>=1.64.2",
],
summary = "AndroidEnv: A Gym/Gymnasium Environment for Android",
version = "1.3.0",
deps = [":android_env_pkg"],
)
Loading
Loading