Skip to content

安卓环境

代码入口

安卓环境提供了通过adb来操纵安卓模拟器(虚拟手机)或真实安卓手机的运行环境。一般的,可以从环境中直接观察到的为屏幕截图和UI树结构信息,可以在环境中操作的动作集合为:点击、输入文本、滑动、返回桌面、长按等操作。

空间定义

观察空间

定义:spaces.Dict({"screenshot": spaces.Text(256), "xml": spaces.Text(256)}),提供屏幕截图的本地地址和UI树结构信息的本地地址。

观察值说明

字段说明文本最大长度
screenshot屏幕截图的本地地址256
xmlUI树结构信息的本地地址256

空间sample示例:

OrderedDict([('screenshot', 'cQUnpNjpsOeTAFG3TkFWRQpRBcF3vAPeblVbM7Kc4KRcnCe2UVMH1WEeAjAwbil1gimsZYztZBzrfIiYQY820ZEjOgFB'), ('xml', 'siXd9XILsNnJTA9sqpNSfaIysHIJ75CbOYfmrIaDAxxObK0X0DKpGI5EazYBCIFFvUDfdw8ZkHVHhWCSS7AIsD2p7mgu7766pRt37gjhY8cxb')])
OrderedDict([('screenshot', 'cQUnpNjpsOeTAFG3TkFWRQpRBcF3vAPeblVbM7Kc4KRcnCe2UVMH1WEeAjAwbil1gimsZYztZBzrfIiYQY820ZEjOgFB'), ('xml', 'siXd9XILsNnJTA9sqpNSfaIysHIJ75CbOYfmrIaDAxxObK0X0DKpGI5EazYBCIFFvUDfdw8ZkHVHhWCSS7AIsD2p7mgu7766pRt37gjhY8cxb')])

动作空间

定义:

python
from gymnasium import spaces
import numpy as np
from metagpt.environment.android.env_space import EnvActionType

device_shape = (720, 1080)

space = spaces.Dict(
    {
        "action_type": spaces.Discrete(len(EnvActionType)),
        "coord": spaces.Box(
            np.array([0, 0], dtype=np.int64), np.array([device_shape[0], device_shape[1]], dtype=np.int64)
        ),
        "tgt_coord": spaces.Box(
            np.array([0, 0], dtype=np.int64), np.array([device_shape[0], device_shape[1]], dtype=np.int64)
        ),
        "input_txt": spaces.Text(256),
        "orient": spaces.Text(16),
        "dist": spaces.Text(16),
    }
)
from gymnasium import spaces
import numpy as np
from metagpt.environment.android.env_space import EnvActionType

device_shape = (720, 1080)

space = spaces.Dict(
    {
        "action_type": spaces.Discrete(len(EnvActionType)),
        "coord": spaces.Box(
            np.array([0, 0], dtype=np.int64), np.array([device_shape[0], device_shape[1]], dtype=np.int64)
        ),
        "tgt_coord": spaces.Box(
            np.array([0, 0], dtype=np.int64), np.array([device_shape[0], device_shape[1]], dtype=np.int64)
        ),
        "input_txt": spaces.Text(256),
        "orient": spaces.Text(16),
        "dist": spaces.Text(16),
    }
)

动作值说明

字段说明取值说明
action_type动作类型不同动作对应不同IntEnum值,依次None、SYSTEM_BACK、SYSTEM_TAP、USER_INPUT、USER_LONGPRESS、USER_SWIPE、USER_SWIPE_TO
coord基础操作的开始坐标,尺寸为(2,)的ndarray第一个数值最小值为0,最大值为屏幕宽度。第二个数值最小值为0,最大值为屏幕高度。单位pixel
tgt_coord用于滑动动作,对应目标位置坐标。尺寸为(2,)的ndarray第一个数值最小值为0,最大值为屏幕宽度。第二个数值最小值为0,最大值为屏幕高度。单位pixel
input_txt输入的文本最大长度256
orient滑动方向对应updownleftright
dist滑动距离对应longmedium

空间sample示例:

OrderedDict([('action_type', 1), ('coord', array([ 55.44057, 842.3602 ], dtype=float32)), ('dist', '6NY'), ('input_txt', 'GdW'), ('orient', 'mSWYHlXuVIdBmqo'), ('tgt_coord', array([431.0454 , 658.18286], dtype=float32))])
OrderedDict([('action_type', 1), ('coord', array([ 55.44057, 842.3602 ], dtype=float32)), ('dist', '6NY'), ('input_txt', 'GdW'), ('orient', 'mSWYHlXuVIdBmqo'), ('tgt_coord', array([431.0454 , 658.18286], dtype=float32))])

使用时,使用EnvAction初始化一个action:要执行的动作类型及对应的所需入参,并通过env.step(action)进行动作执行,并得到对应的奖励和新的观察。

使用

python
from pathlib import Path
from metagpt.environment.android.android_ext_env import AndroidExtEnv
from metagpt.environment.android.env_space import (
    EnvAction,
    EnvActionType,
    EnvObsParams,
    EnvObsType,
)
from metagpt.logs import logger

env = AndroidExtEnv(device_id="emulator-5554", screenshot_dir="/android/path/to/store/screenshot", xml_dir="/android/path/to/store/xml")

obs, _ = env.reset()  # 得到完整观察值

screenshot_path: Path = env.observe(
    EnvObsParams(
        obs_type=EnvObsType.GET_SCREENSHOT, ss_name="step_0", local_save_dir="/local/path/to/store/screenshot"
    )
)  # 得到局部观察值

action = EnvAction(action_type=EnvActionType.USER_INPUT, input_txt="user_input")  # 初始化一组动作值,关于用户输入文本。
obs, _, _, _, info = env.step(action)  # 执行动作并得到新的完整观察

logger.info(f'action execute result: {info["res"]}')  # 动作执行的结果值
from pathlib import Path
from metagpt.environment.android.android_ext_env import AndroidExtEnv
from metagpt.environment.android.env_space import (
    EnvAction,
    EnvActionType,
    EnvObsParams,
    EnvObsType,
)
from metagpt.logs import logger

env = AndroidExtEnv(device_id="emulator-5554", screenshot_dir="/android/path/to/store/screenshot", xml_dir="/android/path/to/store/xml")

obs, _ = env.reset()  # 得到完整观察值

screenshot_path: Path = env.observe(
    EnvObsParams(
        obs_type=EnvObsType.GET_SCREENSHOT, ss_name="step_0", local_save_dir="/local/path/to/store/screenshot"
    )
)  # 得到局部观察值

action = EnvAction(action_type=EnvActionType.USER_INPUT, input_txt="user_input")  # 初始化一组动作值,关于用户输入文本。
obs, _, _, _, info = env.step(action)  # 执行动作并得到新的完整观察

logger.info(f'action execute result: {info["res"]}')  # 动作执行的结果值

Released under the MIT License.