DeviceAgent · 입구·상태·정책·결과 — 상세 구조도
기준 커밋:
1398d109c391c4044cae26d0e9aea4d3f08d9670. 도식은 기존 구현을 설명한다. 제품 이미지 설치·실기기 성공을 증명하지 않는다.
동일 APK의 세 Service와 제품 상태 처리 — 별도 process 선언 없음
SVG 원본 크게 열기 · Mermaid 원본 · 모듈 분석 본문
읽는 순서와 연결 의미
행은 책임·실행 경로별 묶음이며 별도 프로세스라는 뜻은 아니다. 같은 행의 인접 연결은 화살표로, 행을 넘거나 떨어진 상자 사이 연결은 동일한 E 번호의 출력·입력 포트로 표시한다. 아래 표는 방향과 의미를 모두 풀어 쓴 것이다. 그림의 코드 파일명을 눌러 저장소로 이동하는 기능은 없으며, 아래 경로로 지정 커밋을 조회할 수 있다.
| 연결 | 출발 → 도착 | 동작 | 종류 |
|---|---|---|---|
| E01 | IDeviceControl Stub → MainApi | executeMethod | 호출·명령 |
| E02 | MainApi → StateManager | blocked 검사 | 호출·명령 |
| E03 | MainService → 도메인 상태 객체 | 상태 반영 | 결과·이벤트 |
| E04 | 도메인 상태 객체 → AppCmd | 기능 결과 | 결과·이벤트 |
| E05 | AppCmd → 호출자 callback | 알림 | 결과·이벤트 |
| E06 | WssService → TaskExecutor | manager가 enqueue | 호출·명령 |
| E07 | StreamingService → TaskExecutor | manager가 enqueue | 호출·명령 |
구성요소별 책임과 코드 근거
| 상자 | 구성요소 | 책임·상태 | 지정 커밋의 소스 경로 |
|---|---|---|---|
| N01 | IDeviceControl Stub | DeviceAgent.sendModuleCommand / method + Bundle 읽기 | apps/DeviceAgent/app/src/main/java/com/sk/airbot/deviceagent/DeviceAgent.java |
| N02 | MainApi | executeMethod / 모드 라우팅 / 문자열 분기별 도메인 호출 | apps/DeviceAgent/app/src/main/java/com/sk/airbot/deviceagent/main/api/MainApi.java |
| N03 | StateManager | checkBlockedStatus / 주·보조 상태 / 호출자 사망 | apps/DeviceAgent/app/src/main/java/com/sk/airbot/deviceagent/event/StateManager.java |
| N04 | CmdPolicyManager | 허용 조건 + 실행 동작 / 기능별 stop / resume | apps/DeviceAgent/app/src/main/java/com/sk/airbot/deviceagent/policy/CmdPolicyManager.java |
| N05 | MainService | AMR reportCmd 해석 / position / battery / docking | apps/DeviceAgent/app/src/main/java/com/sk/airbot/deviceagent/main/MainService.java |
| N06 | 도메인 상태 객체 | 청정·이동·지도 상태 / 통합 Store가 아닌 분산 소유 | apps/DeviceAgent/app/src/main/java/com/sk/airbot/deviceagent/cleaning/BaseCleaningManager.java |
| N07 | AppCmd | PUI / IoT / LLM 연계 / Bundle과 callback 전달 | apps/DeviceAgent/app/src/main/java/com/sk/airbot/deviceagent/app/AppCmd.java |
| N08 | 호출자 callback | IDeviceControlCallback / 논리 상태와 완료 의미 구분 | apps/DeviceAgent/app/src/main/aidl/com/sk/airbot/devicecontrol/IDeviceControlCallback.aidl |
| N09 | WssService | onBind → WssControlStub / WssManager 전용 입구 | apps/DeviceAgent/app/src/main/java/com/sk/airbot/deviceagent/WssService.java |
| N10 | StreamingService | StreamingControlStub / StreamingManager 전용 입구 | apps/DeviceAgent/app/src/main/java/com/sk/airbot/deviceagent/StreamingService.java |
| N11 | TaskExecutor | DA_TASK_QUEUE HandlerThread / runnable 반환 시 running 해제 | apps/DeviceAgent/app/src/main/java/com/sk/airbot/deviceagent/ipc/TaskExecutor.java |
| N12 | DeviceAgentProvider | 설정 query / insert / update / 명령 Binder와 별도 진입점 | apps/DeviceAgent/app/src/main/java/com/sk/airbot/deviceagent/provider/DeviceAgentProvider.java |
해석 경계와 변경 시 검토
- MainApiCleaning은 골격이다. 모든 청정 기능이 분리된 구현으로 그리지 않는다.
- TaskExecutor는 WSS/Streaming 요청 큐다. 후속 TaskManager·물리 완료 추적기는 아니다.
- CmdPolicyManager 호출은 MainApi/도메인별 경로에 분산되어 있다. 모든 명령의 단일 관문으로 단순화하지 않는다.