Skip to content

Commit abe7b0a

Browse files
author
The android_world Authors
committed
Adding a function to install required apps if necessary. A caller can disable the initial installation and postpone it until required. This speeds up the evaluation on a subset of tasks.
PiperOrigin-RevId: 792172207
1 parent 86ad4d3 commit abe7b0a

3 files changed

Lines changed: 35 additions & 2 deletions

File tree

android_world/env/setup_device/apps.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,12 @@ class AppSetup(abc.ABC):
7575
# The short name of the app, as used by adb_utils.
7676
app_name = ""
7777

78+
@classmethod
79+
def package_name(cls) -> str:
80+
return adb_utils.extract_package_name(
81+
adb_utils.get_adb_activity(cls.app_name)
82+
)
83+
7884
@classmethod
7985
def setup(cls, env: interface.AsyncEnv) -> None:
8086
"""Performs setup tasks specific to the app."""

android_world/env/setup_device/setup.py

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,24 @@
6363
)
6464

6565

66-
def get_app_mapping(app_name: str) -> Type[apps.AppSetup]:
66+
def get_installed_packages(env: interface.AsyncEnv) -> frozenset[str]:
67+
"""Returns the set of installed packages."""
68+
return frozenset(adb_utils.get_all_package_names(env.controller.env))
69+
70+
71+
def is_package_installed(package_name: str, env: interface.AsyncEnv) -> bool:
72+
"""Checks if a package is installed."""
73+
installed_packages = get_installed_packages(env)
74+
return package_name in installed_packages
75+
76+
77+
def get_app_mapping(app_name: str) -> Type[apps.AppSetup] | None:
78+
if not app_name:
79+
return None
6780
mapping = {app.app_name: app for app in _APPS}
68-
return mapping[app_name]
81+
if app_name in mapping:
82+
return mapping[app_name]
83+
return None
6984

7085

7186
def get_app_list_to_setup(
@@ -116,6 +131,12 @@ def setup_app(app: Type[apps.AppSetup], env: interface.AsyncEnv) -> None:
116131
app_snapshot.save_snapshot(app.app_name, env.controller)
117132

118133

134+
def install_app_if_not_installed(app_name: str, env: interface.AsyncEnv):
135+
"""Installs the apk of an app only if the apk is not installed."""
136+
path = apps.download_app_data(apk)
137+
adb_utils.install_apk(path, raw_env)
138+
139+
119140
def maybe_install_app(
120141
app: Type[apps.AppSetup], env: interface.AsyncEnv
121142
) -> None:

android_world/task_evals/task_eval.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,12 @@
1717
import abc
1818
import random
1919
from typing import Any
20+
2021
from absl import logging
2122
from android_world.env import adb_utils
2223
from android_world.env import device_constants
2324
from android_world.env import interface
25+
from android_world.env.setup_device import setup
2426
from android_world.utils import app_snapshot
2527
from android_world.utils import datetime_utils
2628

@@ -122,6 +124,10 @@ def _initialize_apps(self, env: interface.AsyncEnv) -> None:
122124
except RuntimeError as error:
123125
logging.warning("Skipping app snapshot loading : %s", error)
124126

127+
def install_apps_if_not_installed(self, env: interface.AsyncEnv) -> None:
128+
for app_name in self.app_names:
129+
setup.install_app_if_not_installed(app_name, env)
130+
125131
@classmethod
126132
def set_device_time(cls, env: interface.AsyncEnv) -> None:
127133
"""Sets the device time."""

0 commit comments

Comments
 (0)