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管理"])
# 全局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'}"}

30
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:
"""处理设备事件"""

39
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" 错误
- 解决了 "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