Browse Source

daoru

master
hyh 4 months ago
parent
commit
b032585400
  1. 22
      app/api/v1/endpoints/enhanced_adb.py
  2. 30
      app/services/enhanced_adb_service.py
  3. 39
      modify.md

22
app/api/v1/endpoints/enhanced_adb.py

@ -13,8 +13,15 @@ logger = get_enhanced_logger(__name__, LogLevel.DEBUG)
router = APIRouter(prefix="/adb", tags=["ADB管理"]) router = APIRouter(prefix="/adb", tags=["ADB管理"])
# 全局ADB服务实例 # 全局ADB服务实例 - 延迟初始化
adb_service = EnhancedAdbService() 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服务器信息") @router.get("/server/info", response_model=ServerInfo, summary="获取ADB服务器信息")
@ -22,6 +29,7 @@ async def get_server_info():
"""获取ADB服务器信息""" """获取ADB服务器信息"""
try: try:
logger.debug("API请求: 获取ADB服务器信息") logger.debug("API请求: 获取ADB服务器信息")
adb_service = get_adb_service()
result = await adb_service.get_server_info() result = await adb_service.get_server_info()
logger.info("API响应: 获取ADB服务器信息成功", version=result.version) logger.info("API响应: 获取ADB服务器信息成功", version=result.version)
return result return result
@ -36,6 +44,7 @@ async def list_devices(status: Optional[str] = None):
try: try:
logger.debug("API请求: 获取设备列表", status=status) logger.debug("API请求: 获取设备列表", status=status)
status_filter = [status] if status else None status_filter = [status] if status else None
adb_service = get_adb_service()
result = await adb_service.list_devices(status_filter) result = await adb_service.list_devices(status_filter)
logger.info("API响应: 获取设备列表成功", device_count=len(result), status=status) logger.info("API响应: 获取设备列表成功", device_count=len(result), status=status)
return result return result
@ -49,6 +58,7 @@ async def execute_shell_command(device_serial: str, command: ShellCommand):
"""在指定设备上执行Shell命令""" """在指定设备上执行Shell命令"""
try: try:
logger.debug("API请求: 执行Shell命令", device_serial=device_serial, command=command.command) logger.debug("API请求: 执行Shell命令", device_serial=device_serial, command=command.command)
adb_service = get_adb_service()
result = await adb_service.execute_shell_command( result = await adb_service.execute_shell_command(
device_serial, device_serial,
command.command, command.command,
@ -72,6 +82,7 @@ async def get_device_info(device_serial: str):
"""获取设备详细信息""" """获取设备详细信息"""
try: try:
logger.debug("API请求: 获取设备详细信息", device_serial=device_serial) logger.debug("API请求: 获取设备详细信息", device_serial=device_serial)
adb_service = get_adb_service()
result = await adb_service.get_device_info(device_serial) result = await adb_service.get_device_info(device_serial)
if result: if result:
logger.info("API响应: 获取设备详细信息成功", device_serial=device_serial) logger.info("API响应: 获取设备详细信息成功", device_serial=device_serial)
@ -91,6 +102,7 @@ async def ping_device(device_serial: str):
"""ping设备检查连接状态""" """ping设备检查连接状态"""
try: try:
logger.debug("API请求: ping设备", device_serial=device_serial) logger.debug("API请求: ping设备", device_serial=device_serial)
adb_service = get_adb_service()
success = await adb_service.ping_device(device_serial) success = await adb_service.ping_device(device_serial)
logger.info("API响应: ping设备完成", device_serial=device_serial, success=success) logger.info("API响应: ping设备完成", device_serial=device_serial, success=success)
return {"success": success, "message": "设备连接正常" if success else "设备连接失败"} return {"success": success, "message": "设备连接正常" if success else "设备连接失败"}
@ -104,6 +116,7 @@ async def install_apk(device_serial: str, apk_path: str):
"""安装APK文件""" """安装APK文件"""
try: try:
logger.debug("API请求: 安装APK", device_serial=device_serial, apk_path=apk_path) 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) result = await adb_service.install_apk(device_serial, apk_path)
logger.info("API响应: 安装APK完成", device_serial=device_serial, success=result.success) logger.info("API响应: 安装APK完成", device_serial=device_serial, success=result.success)
return result return result
@ -117,6 +130,7 @@ async def uninstall_app(device_serial: str, package_name: str):
"""卸载应用""" """卸载应用"""
try: try:
logger.debug("API请求: 卸载应用", device_serial=device_serial, package_name=package_name) 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) result = await adb_service.uninstall_app(device_serial, package_name)
logger.info("API响应: 卸载应用完成", device_serial=device_serial, success=result.success) logger.info("API响应: 卸载应用完成", device_serial=device_serial, success=result.success)
return result return result
@ -130,6 +144,7 @@ async def get_installed_apps(device_serial: str):
"""获取已安装应用列表""" """获取已安装应用列表"""
try: try:
logger.debug("API请求: 获取已安装应用列表", device_serial=device_serial) logger.debug("API请求: 获取已安装应用列表", device_serial=device_serial)
adb_service = get_adb_service()
apps = await adb_service.get_installed_apps(device_serial) apps = await adb_service.get_installed_apps(device_serial)
logger.info("API响应: 获取已安装应用列表成功", device_serial=device_serial, app_count=len(apps)) logger.info("API响应: 获取已安装应用列表成功", device_serial=device_serial, app_count=len(apps))
return {"apps": apps, "count": len(apps)} return {"apps": apps, "count": len(apps)}
@ -143,6 +158,7 @@ async def list_forward_ports():
"""获取端口转发列表""" """获取端口转发列表"""
try: try:
logger.debug("API请求: 获取端口转发列表") logger.debug("API请求: 获取端口转发列表")
adb_service = get_adb_service()
result = await adb_service.list_forward_ports() result = await adb_service.list_forward_ports()
logger.info("API响应: 获取端口转发列表成功", forward_count=len(result)) logger.info("API响应: 获取端口转发列表成功", forward_count=len(result))
return result return result
@ -159,6 +175,7 @@ async def create_forward_port(request: ForwardRequest):
serial=request.serial, serial=request.serial,
local=request.local, local=request.local,
remote=request.remote) remote=request.remote)
adb_service = get_adb_service()
await adb_service.create_forward_port(request) await adb_service.create_forward_port(request)
logger.info("API响应: 创建端口转发成功", logger.info("API响应: 创建端口转发成功",
serial=request.serial, serial=request.serial,
@ -179,6 +196,7 @@ async def remove_forward_port(local: Optional[str] = None):
"""移除端口转发""" """移除端口转发"""
try: try:
logger.debug("API请求: 移除端口转发", local=local) logger.debug("API请求: 移除端口转发", local=local)
adb_service = get_adb_service()
await adb_service.remove_forward_port(local) await adb_service.remove_forward_port(local)
logger.info("API响应: 移除端口转发成功", local=local or "all") logger.info("API响应: 移除端口转发成功", local=local or "all")
return {"message": f"端口转发移除成功: {local or 'all'}"} return {"message": f"端口转发移除成功: {local or 'all'}"}

30
app/services/enhanced_adb_service.py

@ -22,14 +22,26 @@ class EnhancedAdbService:
self._host = host self._host = host
self._port = port self._port = port
self._device_monitor_task: Optional[asyncio.Task] = None self._device_monitor_task: Optional[asyncio.Task] = None
# 程序启动时自动开始监听 self._monitoring_started = False
self._start_monitoring() # 移除自动启动监控,改为延迟启动
def _start_monitoring(self): async def start_monitoring(self):
"""启动设备监控(程序启动时自动调用)""" """启动设备监控(需要手动调用)"""
if not self._device_monitor_task or self._device_monitor_task.done(): if not self._monitoring_started and (not self._device_monitor_task or self._device_monitor_task.done()):
logger.info("程序启动,自动开始设备监控") logger.info("开始设备监控")
self._device_monitor_task = asyncio.create_task(self._monitor_devices()) 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: async def get_server_info(self) -> ServerInfo:
"""获取ADB服务器信息""" """获取ADB服务器信息"""
@ -104,10 +116,8 @@ class EnhancedAdbService:
logger.info("设备监控被取消") logger.info("设备监控被取消")
except Exception as e: except Exception as e:
logger.error("设备监控异常", error=str(e)) logger.error("设备监控异常", error=str(e))
# 监控异常时自动重启 # 监控异常时不再自动重启,需要手动重新启动
logger.info("设备监控异常,3秒后自动重启...") self._monitoring_started = False
await asyncio.sleep(3)
self._start_monitoring()
async def _handle_device_event(self, event: DeviceEvent) -> None: async def _handle_device_event(self, event: DeviceEvent) -> None:
"""处理设备事件""" """处理设备事件"""

39
modify.md

@ -69,4 +69,41 @@
- `execute_shell_command()` 改为使用 `shell()` - `execute_shell_command()` 改为使用 `shell()`
- `list_forward_ports()` 改为使用 `forward_list()` - `list_forward_ports()` 改为使用 `forward_list()`
- 添加了状态字符串到枚举的转换逻辑 - 添加了状态字符串到枚举的转换逻辑
- 解决了 "AdbClient.__init__() takes 1 positional argument but 3 were given" 错误 - 解决了 "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()` 来清理资源
Loading…
Cancel
Save