diff --git a/app/api/v1/endpoints/enhanced_adb.py b/app/api/v1/endpoints/enhanced_adb.py index 151f139..20ca119 100644 --- a/app/api/v1/endpoints/enhanced_adb.py +++ b/app/api/v1/endpoints/enhanced_adb.py @@ -13,8 +13,15 @@ logger = get_enhanced_logger(__name__, LogLevel.DEBUG) router = APIRouter(prefix="/adb", tags=["ADB管理"]) -# 全局ADB服务实例 -adb_service = EnhancedAdbService() +# 全局ADB服务实例 - 延迟初始化 +adb_service = None + +def get_adb_service(): + """获取ADB服务实例(延迟初始化)""" + global adb_service + if adb_service is None: + adb_service = EnhancedAdbService() + return adb_service @router.get("/server/info", response_model=ServerInfo, summary="获取ADB服务器信息") @@ -22,6 +29,7 @@ async def get_server_info(): """获取ADB服务器信息""" try: logger.debug("API请求: 获取ADB服务器信息") + adb_service = get_adb_service() result = await adb_service.get_server_info() logger.info("API响应: 获取ADB服务器信息成功", version=result.version) return result @@ -36,6 +44,7 @@ async def list_devices(status: Optional[str] = None): try: logger.debug("API请求: 获取设备列表", status=status) status_filter = [status] if status else None + adb_service = get_adb_service() result = await adb_service.list_devices(status_filter) logger.info("API响应: 获取设备列表成功", device_count=len(result), status=status) return result @@ -49,6 +58,7 @@ async def execute_shell_command(device_serial: str, command: ShellCommand): """在指定设备上执行Shell命令""" try: logger.debug("API请求: 执行Shell命令", device_serial=device_serial, command=command.command) + adb_service = get_adb_service() result = await adb_service.execute_shell_command( device_serial, command.command, @@ -72,6 +82,7 @@ async def get_device_info(device_serial: str): """获取设备详细信息""" try: logger.debug("API请求: 获取设备详细信息", device_serial=device_serial) + adb_service = get_adb_service() result = await adb_service.get_device_info(device_serial) if result: logger.info("API响应: 获取设备详细信息成功", device_serial=device_serial) @@ -91,6 +102,7 @@ async def ping_device(device_serial: str): """ping设备检查连接状态""" try: logger.debug("API请求: ping设备", device_serial=device_serial) + adb_service = get_adb_service() success = await adb_service.ping_device(device_serial) logger.info("API响应: ping设备完成", device_serial=device_serial, success=success) return {"success": success, "message": "设备连接正常" if success else "设备连接失败"} @@ -104,6 +116,7 @@ async def install_apk(device_serial: str, apk_path: str): """安装APK文件""" try: logger.debug("API请求: 安装APK", device_serial=device_serial, apk_path=apk_path) + adb_service = get_adb_service() result = await adb_service.install_apk(device_serial, apk_path) logger.info("API响应: 安装APK完成", device_serial=device_serial, success=result.success) return result @@ -117,6 +130,7 @@ async def uninstall_app(device_serial: str, package_name: str): """卸载应用""" try: logger.debug("API请求: 卸载应用", device_serial=device_serial, package_name=package_name) + adb_service = get_adb_service() result = await adb_service.uninstall_app(device_serial, package_name) logger.info("API响应: 卸载应用完成", device_serial=device_serial, success=result.success) return result @@ -130,6 +144,7 @@ async def get_installed_apps(device_serial: str): """获取已安装应用列表""" try: logger.debug("API请求: 获取已安装应用列表", device_serial=device_serial) + adb_service = get_adb_service() apps = await adb_service.get_installed_apps(device_serial) logger.info("API响应: 获取已安装应用列表成功", device_serial=device_serial, app_count=len(apps)) return {"apps": apps, "count": len(apps)} @@ -143,6 +158,7 @@ async def list_forward_ports(): """获取端口转发列表""" try: logger.debug("API请求: 获取端口转发列表") + adb_service = get_adb_service() result = await adb_service.list_forward_ports() logger.info("API响应: 获取端口转发列表成功", forward_count=len(result)) return result @@ -159,6 +175,7 @@ async def create_forward_port(request: ForwardRequest): serial=request.serial, local=request.local, remote=request.remote) + adb_service = get_adb_service() await adb_service.create_forward_port(request) logger.info("API响应: 创建端口转发成功", serial=request.serial, @@ -179,6 +196,7 @@ async def remove_forward_port(local: Optional[str] = None): """移除端口转发""" try: logger.debug("API请求: 移除端口转发", local=local) + adb_service = get_adb_service() await adb_service.remove_forward_port(local) logger.info("API响应: 移除端口转发成功", local=local or "all") return {"message": f"端口转发移除成功: {local or 'all'}"} diff --git a/app/services/enhanced_adb_service.py b/app/services/enhanced_adb_service.py index 3cd9fcf..df8d4c8 100644 --- a/app/services/enhanced_adb_service.py +++ b/app/services/enhanced_adb_service.py @@ -22,14 +22,26 @@ class EnhancedAdbService: self._host = host self._port = port self._device_monitor_task: Optional[asyncio.Task] = None - # 程序启动时自动开始监听 - self._start_monitoring() + self._monitoring_started = False + # 移除自动启动监控,改为延迟启动 - def _start_monitoring(self): - """启动设备监控(程序启动时自动调用)""" - if not self._device_monitor_task or self._device_monitor_task.done(): - logger.info("程序启动,自动开始设备监控") + async def start_monitoring(self): + """启动设备监控(需要手动调用)""" + if not self._monitoring_started and (not self._device_monitor_task or self._device_monitor_task.done()): + logger.info("开始设备监控") self._device_monitor_task = asyncio.create_task(self._monitor_devices()) + self._monitoring_started = True + + async def stop_monitoring(self): + """停止设备监控""" + if self._device_monitor_task and not self._device_monitor_task.done(): + self._device_monitor_task.cancel() + try: + await self._device_monitor_task + except asyncio.CancelledError: + pass + self._monitoring_started = False + logger.info("设备监控已停止") async def get_server_info(self) -> ServerInfo: """获取ADB服务器信息""" @@ -104,10 +116,8 @@ class EnhancedAdbService: logger.info("设备监控被取消") except Exception as e: logger.error("设备监控异常", error=str(e)) - # 监控异常时自动重启 - logger.info("设备监控异常,3秒后自动重启...") - await asyncio.sleep(3) - self._start_monitoring() + # 监控异常时不再自动重启,需要手动重新启动 + self._monitoring_started = False async def _handle_device_event(self, event: DeviceEvent) -> None: """处理设备事件""" diff --git a/modify.md b/modify.md index 3497479..4b5bcd3 100644 --- a/modify.md +++ b/modify.md @@ -69,4 +69,41 @@ - `execute_shell_command()` 改为使用 `shell()` - `list_forward_ports()` 改为使用 `forward_list()` - 添加了状态字符串到枚举的转换逻辑 -- 解决了 "AdbClient.__init__() takes 1 positional argument but 3 were given" 错误 \ No newline at end of file +- 解决了 "AdbClient.__init__() takes 1 positional argument but 3 were given" 错误 + +## 2025-08-07 - 修复路由注册失败问题 + +### 问题描述 +应用启动时出现路由注册失败错误: +``` +{"timestamp": "2025-08-07T16:10:55.327368", "level": "ERROR", "message": "路由注册失败", "logger_name": "app.core.app.router", "context": {"request_id": null, "user_id": null, "session_id": null, "module": "structured_log", "function": "_log", "line_number": 123, "timestamp": "2025-08-07T16:10:55.327368", "duration_ms": null, "extra": {"error": "no running event loop"}}, "exception": null, "stack_trace": null} +``` + +### 问题原因 +`EnhancedAdbService` 类在构造函数中自动启动了设备监控,调用了 `asyncio.create_task()`,但此时还没有运行的事件循环,导致 "no running event loop" 错误。 + +### 修复方案 + +#### 1. 修改 EnhancedAdbService 类 (`app/services/enhanced_adb_service.py`) +- 移除构造函数中的自动启动监控逻辑 +- 将 `_start_monitoring()` 方法改为异步的 `start_monitoring()` 方法 +- 添加 `stop_monitoring()` 方法用于停止监控 +- 修改 `_monitor_devices()` 方法,移除自动重启逻辑 + +#### 2. 修改 enhanced_adb 端点 (`app/api/v1/endpoints/enhanced_adb.py`) +- 将全局 `EnhancedAdbService` 实例改为延迟初始化 +- 添加 `get_adb_service()` 函数实现延迟初始化 +- 更新所有端点函数,在需要时调用 `get_adb_service()` 获取服务实例 + +### 修改的文件 +1. `app/services/enhanced_adb_service.py` - 修复异步初始化问题 +2. `app/api/v1/endpoints/enhanced_adb.py` - 实现延迟初始化 + +### 影响 +- 修复了应用启动时的路由注册失败问题 +- 设备监控功能现在需要手动启动,而不是自动启动 +- 提高了应用的启动稳定性 + +### 后续建议 +- 如果需要自动启动设备监控,可以在应用启动完成后(有事件循环运行时)手动调用 `start_monitoring()` +- 考虑在应用关闭时调用 `stop_monitoring()` 来清理资源 \ No newline at end of file