DeviceAgent 내부 골격과 도메인 책임
기준:
1398d109c391c4044cae26d0e9aea4d3f08d9670. 지정 커밋의 추적 파일을 직접 확인한 정적 구조 분석이며, 현재 HEAD·후속 TaskManager·SKIX 구현을 포함하지 않는다.
이 페이지에서 D/는 apps/DeviceAgent/app/src/main/java/com/sk/airbot/deviceagent/를 뜻한다. 클래스 수·파일 길이는 지정 커밋 기준이며, 역할 설명은 호출부와 구현을 함께 확인했다.
중심 클래스
| 클래스 | 구조상 책임 | 근거 |
|---|---|---|
| DeviceAgent (573줄) | Service 생명주기, IDeviceControl Stub, callback 등록, 초기화와 동료 연결 | D/DeviceAgent.java:78, :132, :264, :310, :538 |
| MainApi (4,210줄) | method 문자열·Bundle 해석, 상태별 우회·차단, 도메인 실행과 조회 | D/main/api/MainApi.java:150 |
| MainCommon | 주요 객체의 공통 참조 보관 | D/main/MainCommon.java |
| MainService (642줄) | AMR report 해석, IoT·Pairing·Update 연결 callback, 상태·UI·IoT 전달 | D/main/MainService.java:78, :525 |
| MainAmr / MainMcu / MainHandler | AMR·MCU 처리와 Handler 기반 작업 연결 | D/main/ |
| StateManager (707줄) | 주·보조 상태, blocked method, 모드 전환과 호출자 사망 처리 | D/event/StateManager.java |
| CmdPolicyManager (1,581줄) | 실행 가능 조건과 도메인 실행·중단·재개가 함께 존재 | D/policy/CmdPolicyManager.java |
| EventManager | 제품 상태에 따른 EyeLED 등의 표현 조정 | D/event/EventManager.java |
| AppCmd | 동료 앱 명령 및 호출자 callback 전달 | D/app/AppCmd.java |
MainApiCleaning.java는 6줄의 골격이다. 청정 책임이 이 클래스로 분리되어 있다고 볼 수 없다. 기존 설계 문서의 “270개 명령”은 산정 방식이 불명확하므로 여기서는 API 개수로 재인용하지 않는다. 원문에 method.equals( 문자열은 274회 나타나지만 중복·보조 조건까지 포함하므로 고유 API 수가 아니다.
진입 이후의 처리
DeviceAgent.sendModuleCommand()가 Bundle의method를 읽는다. 비어 있으면 반환한다.MainApi.executeMethod()가 재부팅 허용 상태, Factory·ICT·SelfTest 모드,StateManager.checkBlockedStatus()를 확인한다.- 문자열 분기에서 Bundle을 해석해 청정·이동·설정·예약 등의 manager를 호출한다.
- 동료 callback이나 HAL callback이 상태를 갱신하고
AppCmd를 통해 PUI·IoT·LLM에 전파된다.
근거: D/DeviceAgent.java:264–283, D/main/api/MainApi.java:150–207, D/main/MainService.java.
전체 기능 패키지 지도
| 패키지 | 책임과 대표 구현 |
|---|---|
cleaning/ |
AirCleaningManager, BaseCleaningManager, Basic/Moving/FollowMe/AreaAICleaningManager, CleaningTransaction: 청정 방식과 이동 결합 |
moving/ |
MovingController, RobotMovementController, MovingLocationManager, AirQualityMappingController·ScanningManager: 위치·이동·공기질 탐색 |
map/ |
MapManager, MappingManager, MapUploader: 지도·구역 상태, 매핑, 업로드 |
device/item/amr/ |
AMRService와 Motor/Map/Battery/Sensor/System 등: AMR 계약을 기능별로 감쌈 |
device/item/mcu/ |
MCUComm, Protocol·Protocol_v2, MCUDataParser·Manager, 팬·필터·센서·틸트·UV·OTA 모델 |
device/item/soc/ |
Soc, SocLcd, SocLcdBrightness: SoC 화면 관련 제어 |
device/manager/ |
Battery, EyeLed, FilterBody, LCD, SocHeat, AppWatcher 등 하드웨어·운영 상태 조정 |
device/interface/ |
하드웨어 접근 인터페이스 정의 |
wss/ |
WssManager, 이동·Vision 검증·정책·EventAsset·업로드 복구: 보안 기능 생명주기 |
streaming/ |
StreamingManager, 이벤트 Bundle 구성: 영상 세션과 수동 이동 연결 |
ipc/ |
WssControlStub, StreamingControlStub, TaskExecutor: 전용 IPC 입구와 작업 큐 |
schedule/ |
ScheduleManager, ScheduleAlarmReceiver, ScheduleInitRunner, ScheduleDao: 영속 예약과 알람 |
interaction/ |
InterScheduleManager, ActionWelcome/Wakeup/Relax, Information: 제품 상호작용 |
event/, policy/ |
상태 전이·표현, 명령 허용 조건과 정책 실행 |
llm/, recognition/ |
LlmManager·VisionAIManager·VoiceLocationRecogManager 등 음성·시각 연계 |
system/, service/ |
SoundFlowManager와 System, DeviceControlService: 플랫폼·장치 연결 |
settings/, data/pref/ |
Settings, TempSettings, SKMPreferences, PrefsMigrator: 설정과 암호화 저장 이행 |
data/, db/ |
위치·기기·오류·공기질 모델, CleaningReport DB |
alert/, maintenance/, report/ |
경보 DB, 오류 이력·부품·사용량·청정 보고 |
body/, calibration/ |
틸팅·환영 동작, 센서·이동 보정과 알람 |
ota/, update/ |
OTAManager, UpdateManager: 업데이트 모드와 동료 연동 |
boot/, receiver/ |
BootInitManager, BootReceiver, AiModeCleanAlarmReceiver: 부팅과 자동 동작 진입 |
provider/, iot/ |
DeviceAgentProvider, IotManager: 데이터 제공과 IoT 연계 |
app/, main/ |
공통 앱 문맥·명령·callback 정책, 중심 실행 클래스 |
toast/, util/ |
ToastBuffer, 시간·암호화·공유메모리·알람 등 보조 기능 |
activity/, test/ |
MCUTestActivity와 시뮬레이터·시험 지원 |
| 루트 State 클래스 | FactoryState, ICTState, SelfTestState: 생산·검사 모드 전용 처리 |
각 행의 근거는 D/ 뒤에 해당 패키지 경로다. 근거 목록에 모든 상위 패키지별 파일 수를 수록했다.
상태·실행·저장은 어떻게 나뉘는가
상태는 하나의 통합 Store에만 모여 있지 않다. StateManager는 제품 모드와 차단 상태를 관리하고, 이동·배터리·지도·청정 manager는 자기 기능 상태를 관리하며, SKMPreferences와 SQLite helper들은 지속할 데이터를 따로 보관한다. MainService가 AMR report를 해석하면서 이 상태들을 갱신한다.
CmdPolicyManager는 순수한 허용 판정기만이 아니다. 실행 호출도 포함하므로 정책 변경은 실제 동작 회귀와 함께 확인해야 한다. EventManager 역시 범용 이벤트 버스로 해석하면 안 된다.
구조적 결합과 미확인 항목
- MainApi 문자열·Bundle 계약과 큰 분기 구조는 호출자와 장치 기능의 변경을 결합한다.
- 초기화는 여러 비동기 연결과 설정 migration callback에 걸쳐 있다.
onCreate()종료만으로 모든 동료가 준비됐다고 볼 수 없다. - singleton·공통 참조·다중 callback 경로가 함께 존재하므로 재시작 시 상태 정합성은 실기기 증거가 필요하다.
- 위 항목은 코드 구조에 대한 해석이다. 실제 장애 발생이나 성능 저하를 측정한 결론은 아니다.
확대 구조도와 연결별 근거
Connections
전체 목차 · 앱 구성 · DeviceAgent 내부 · IPC · 실행 흐름 · 플랫폼·빌드 · 근거·확인 범위