부팅과 대표 기능의 실행 흐름
기준:
1398d109c391c4044cae26d0e9aea4d3f08d9670. 지정 커밋의 추적 파일을 직접 확인한 정적 구조 분석이며, 현재 HEAD·후속 TaskManager·SKIX 구현을 포함하지 않는다.
D/는 apps/DeviceAgent/app/src/main/java/com/sk/airbot/deviceagent/다. 아래 흐름은 지정 커밋의 코드 연결이다. 비동기 서비스의 실제 준비 순서·시간은 부팅 로그를 별도로 확인해야 한다.
부팅과 초기화
- DeviceAgent Manifest의 directBootAware BootReceiver는
LOCKED_BOOT_COMPLETED를 받도록 선언되어 있다. BootReceiver.onReceive()가 DeviceAgent를startService()한다.DeviceAgent.onCreate()는 프로토콜 초기화 후connectServices()를 호출한다. WssService·StreamingService 시작, AMR·Vision·Pairing·IoT·Update 연결이 여기서 요청된다.- 공통 참조·앱 문맥, 이동 객체, device_manager HAL, 설정 migration, 하드웨어 관찰·필터·팬·LCD 초기화가 이어진다.
- 암호화 서비스 연결 callback에서 MapManager를 초기화한다. SoundFlow는 별도 연결 재시도 경로를 가진다.
ScheduleInitRunner.run()이 활성 예약 재등록과 재등록 알람·일련번호 기반 알람 설정을 비동기로 수행한다.
근거: Manifest, D/receiver/BootReceiver.java:11, D/DeviceAgent.java:310–433, D/schedule/ScheduleInitRunner.java:27.
StartupService도 별도 앱이다. 전체 Android init→zygote→system_server의 등록 코드는 이 패키지 저장소에 없으므로 이 그림에 제품에서 검증한 시작 순서로 넣지 않았다. 관련 모듈은 앱 구성과 플랫폼을 참조한다.
일반 청정과 이동
| 단계 | 처리 | 근거 |
|---|---|---|
| 요청 | PUI·앱이 IDeviceControl에 method·인자를 전달 |
AIDL, D/DeviceAgent.java:264 |
| 상태 입구 | 재부팅 제한, 검사 모드 라우팅, blocked method 검사 | D/main/api/MainApi.java:150 |
| 기능 분기 | setAirCleanerOperation, setAMROperation, return/pause/resume/stopMovement |
같은 파일 :523, :887, :1036 이후 |
| 실제 조정 | 청정 종류와 이동 controller, 정책 및 하드웨어 manager 호출 | D/cleaning/, D/moving/, D/policy/CmdPolicyManager.java |
| 하위 실행 | 이동은 AMRService→AMRAgent; 팬 등은 MCU 프로토콜→device_manager HAL | D/device/item/amr/, D/device/item/mcu/ |
| 결과 | AMR report / HAL callback으로 상태를 반영하고 앱·IoT로 전달 | D/main/MainService.java, D/DeviceAgent.java:112, D/app/AppCmd.java |
여러 기능을 공통 TaskManager가 모두 감싼 구조는 아니다. API별 조건·정책·callback 처리가 나뉘어 있으므로 실제 기능 추가 시 왕복 경로를 함께 읽어야 한다.
예약 실행
ScheduleManager.setSchedule()는 DAO에 저장하고 AlarmManager의 exact alarm을 설정한다. ScheduleAlarmReceiver는 저장된 예약의 존재·활성 상태, 요일·시각·공휴일, GPS 연동 예외를 확인하고 중복 간격을 검사한다. 이후 별도 실행 허용 조건과 기능 동작으로 진행한다.
lastExecutionTimes는 프로세스 메모리의 ConcurrentHashMap이고 최소 간격은 30초다. 재부팅을 넘어선 영속 idempotency라고 설명할 수 없다.- privacy·매핑·Streaming 등 기능 충돌 조건이 수신기 실행 경로에 들어 있다. 후속 TaskManager admission 규칙을 이 커밋에 소급 적용하지 않는다.
- 예약 저장 성공, 알람 발화, 정책 통과, 실제 기능 완료는 서로 다른 단계다.
근거: D/schedule/ScheduleManager.java:29, :76, D/schedule/ScheduleAlarmReceiver.java:40–122, canExecuteSchedule()와 triggerScheduleAction().
WSS와 Streaming
WSS는 WssService → WssControlStub → WssManager의 전용 경로다. manager 아래에 이동, 얼굴 검증, EventAsset 검증·업로드와 복구 책임이 나뉜다. Streaming은 StreamingService → StreamingControlStub → StreamingManager에서 세션 시작·종료, 녹화 자료, 수동 이동을 조정한다.
ipc/TaskExecutor는 DA_TASK_QUEUE HandlerThread에서 ITask.execute()를 호출한다. finally에서 running ID를 지우므로 해당 Java 작업 반환을 표시할 뿐, 장시간 물리 동작의 완료를 추적하는 범용 Task lifecycle이 아니다. WSS와 Streaming의 명령 ID base가 모두 2000이므로 ID만으로 큐를 조회·삭제할 때 충돌 가능성을 검토해야 한다. 실제 오동작 재현은 하지 않았다.
근거: D/ipc/TaskExecutor.java:17–105, D/ipc/WssControlStub.java, D/ipc/StreamingControlStub.java, D/wss/, D/streaming/.
음성·시각·클라우드
LlmManager는 TTS·언어·음성 상태·privacy·lock 변화 등을 Bundle로 표현해 앱 연계에 사용한다. STT·LLM 엔진 전체가 이 클래스 안에 있는 것은 아니다. SoundFlowManager는 외부 오디오 HAL 연결과 상태 이벤트를 담당하고, VisionAIManager는 VisionAgent와 연결한다.
IoT 요청의 기기 실행과 장치 상태의 클라우드 보고는 IotAgent와 DeviceAgent 사이의 IIotControl callback·명령 경계를 따라간다. MQTT 발행 성공이나 Binder 복귀만으로 사용자가 요청한 동작이 완료됐다고 판정하지 않는다.
근거: D/llm/LlmManager.java, D/system/SoundFlowManager.java, D/recognition/VisionAIManager.java, D/main/MainService.java:500 이후, IotAgent 상세.
Connections
전체 목차 · 앱 구성 · DeviceAgent 내부 · IPC · 실행 흐름 · 플랫폼·빌드 · 근거·확인 범위