fix(android): launch apps with checked activity manager commands

This commit is contained in:
chenmingxuan committed 2026-10-16 11:15:14 +08:00
1 parent ef7af9988e
commit f86db1ced6
8 files changed
+334 -15

No files matched your search

+27 -3
View File
@@ -28,6 +28,7 @@ from artemis.controllers.platform_specific_commands_controller import (
)
from artemis.controllers.unified_controller import UnifiedMobileController
from artemis.data_engine.trace import TraceSpan
from artemis.drivers.errors import AppLaunchError
from artemis.utils.logger import get_logger
logger = get_logger(__name__)
@@ -285,6 +286,7 @@ async def launch_app_with_retries(
Tuple of (success: bool, error_message: str | None)
"""
last_error: str | None = None
for attempt in range(1, max_retries + 1):
logger.info(f"Launch attempt {attempt}/{max_retries} for app {app_package}")
@@ -304,13 +306,32 @@ async def launch_app_with_retries(
await controller.terminate_app(app_package)
await asyncio.sleep(1.0)
launch_success = await controller.launch_app(app_package)
launch_error: AppLaunchError | None = None
try:
launch_success = await controller.launch_app(app_package)
except AppLaunchError as exc:
launch_success = False
launch_error = exc
span.payload["retryable"] = exc.retryable
span.payload["launch_error"] = str(exc)
if exc.may_have_started:
logger.warning(f"{exc};先核对应用是否已进入前台,避免重复启动。")
ready, _ = await _poll_for_app_ready(ctx, app_package, max_poll_seconds)
if ready:
span.status = "success"
span.result = "App is ready (launch acknowledgement was unavailable)"
return True, None
if not launch_success:
error_msg = f"Failed to execute launch command for {app_package}"
error_msg = (
str(launch_error)
if launch_error
else (f"Failed to execute launch command for {app_package}")
)
last_error = error_msg
logger.error(error_msg)
span.status = "failed"
span.error = error_msg
if attempt == max_retries:
if attempt == max_retries or (launch_error and not launch_error.retryable):
return False, error_msg
await asyncio.sleep(2)
continue
@@ -326,12 +347,15 @@ async def launch_app_with_retries(
span.status = "failed"
span.error = error_msg
last_error = error_msg
if attempt < max_retries:
logger.warning(f"Attempt {attempt} failed: {error_msg}. Retrying...")
await asyncio.sleep(1)
error_msg = f"Failed to launch {app_package} after {max_retries} attempts"
if last_error:
error_msg += f": {last_error}"
logger.error(error_msg)
return False, error_msg