본문으로 이동
SK-INTELLIX / ENGINEERING전체 모듈 Atlas ↗

DeviceAgent 실행 환경·개별 요소·상태 소유권

기준: a1-packages-mr6, quber/mr7, 7695c9a85fedf6d756490e51c07f6e09f568a4bd. 추적 소스의 정적 분석이다. 미추적 TaskManagerClient 및 작업 산출물은 포함하지 않는다. APK·AOSP 빌드나 기기 동작 검증은 이번 분석 범위가 아니다.

이 문서의 DA/는 apps/DeviceAgent/app/src/main/java/com/sk/airbot/deviceagent/다.

Android 실행 환경

DeviceAgent의 Gradle 설정은 compile/target SDK 33, min SDK 31, Java 11이다. framework.jar, android.system.jar는 compileOnly이고 vendor device_manager/soundflowservice HIDL Java 라이브러리를 참조한다. 일반 Android 공개 SDK만으로 설명할 수 있는 앱이 아니다. 실제 기기의 OS 버전은 SDK 숫자만으로 확정할 수 없다.

근거: apps/DeviceAgent/app/build.gradle:7, :54, :76.

Manifest는 android.uid.system, persistent application, exported인 DeviceAgent/WssService/StreamingService를 선언한다. 이 세 Service에는 별도 android:process가 없으므로 Manifest 기준 같은 앱의 기본 프로세스에서 동작한다. 각 Manager도 이 프로세스 내부 객체다. system UID 선언은 실제 설치·서명 조건 충족의 증명이 아니다.

근거: apps/DeviceAgent/app/src/main/AndroidManifest.xml:4, :50, :72.

입구와 조정자

요소 입력과 책임 다음 연결 근거
DeviceAgent / IDeviceControl.Stub Bundle의 method 확인, MainApi 호출 MainApi.executeMethod DA/DeviceAgent.java:264
MainApi 제품 모드별 라우팅, 차단 검사, 문자열 API 분기 FactoryState/ICTState/SelfTestState 또는 기능별 Manager DA/main/api/MainApi.java:150
StateManager 제품 main/sub 상태, wizard/mapping, 특정 메서드 차단 MainApi와 CmdPolicy가 조회 DA/event/StateManager.java:44, :114, :149
CmdPolicyManager 여러 기능의 현재 상태를 모아 허용 조건과 선행 stop/resume 결정 청정·이동·인터랙션 controller DA/policy/CmdPolicyManager.java:153, :471, :577
MainService AMR callback의 reportCmd 분기 BatteryManager, MovingController, AMRMap, AppCmd DA/main/MainService.java:79
WssControlStub API별 SYSTEM_UID와 FRONT/REMOTE 역할 검사 WssManager의 request 계열 DA/ipc/WssControlStub.java:90
WssPackageValidator Binder UID/PID 및 PID에 연결된 package name의 해시로 역할 분류 미허용 시 예외 DA/wss/policy/WssPackageValidator.java:41, :58, :106
TaskExecutor WSS/Streaming 작업을 DA_TASK_QUEUE에 적재 ITask.execute 실행 DA/ipc/TaskExecutor.java:38, :97
DeviceAgentProvider preferences URI의 query/insert/update Preferences 저장소 DA/provider/DeviceAgentProvider.java:16

WssPackageValidator가 해시하는 대상은 package name 문자열이다. APK 인증서의 SHA-256 검증이라고 설명하면 안 된다. 모든 일반 IDeviceControl API에 동일 검사가 적용된다고 확장해 해석하지 않는다.

초기화 순서와 환경 의존

DeviceAgent.onCreate는 프로토콜 초기화와 connectServices, 공통 객체 연결, AppInfo context/handler 등록, 이동 controller 준비를 수행한다. 이후 vendor IDeviceManager.getService()와 preferences 암호화·이관 callback을 연결한다. 따라서 Binder 연결 준비, 저장소 이관, 기능 초기화는 한 번의 생성자 호출로 동시에 완료되는 것이 아니다.

근거: DA/DeviceAgent.java:310–369. 민감한 seed 값·암호화 자료는 이 문서에 수록하지 않는다.

상태는 어디에 있는가

상태 종류 소유 요소 정책에서 쓰는 방식
제품 운영 모드 StateManager 일반 운영인지, UPGRADE/VITALSIGN/STREAMING_ALPHA인지 판단
청정 파라미터·액션 CleaningTransaction / BaseCleaningManager 새 START, 진행 중, BASIC 여부, pause/resume 판단
주행·복귀·도킹·우선순위 RobotMovementController / MovingController 이동 충돌, station 여부, 긴급 복귀, 예약 선점 판단
배터리 측정값 BatteryManager AMR report를 보관하고 변환된 capacity 제공
오류 활성 상태·분류 Error / ErrorHandler MAJOR, MOVING_EX_S02, CLEANING, S02/S03 등 정책 입력
프라이버시·홈잠금·야간 설정 Settings / SettingPreferences 새 요청 차단과 Vision/SoundFlow/LLM side effect
보안 세션 WssTransaction / WssManager 보안 실행 여부·시작 가능 조건·설정·구독 상태
LiveView 세션 StreamingManager 스트리밍 실행 상태·이동·중지 요청
예약·이력 ScheduleDao, AlertDao 등 영속 설정 조회와 시간 기반 트리거

근거: DA/policy/CmdPolicyManager.java:153–192, DA/device/manager/BatteryManager.java:35, :195, DA/settings/Settings.java:329, DA/schedule/ScheduleAlarmReceiver.java:50, DA/wss/policy/WssPolicyChecker.java:48.

이 구성은 단일 상태 저장소가 아니다. 정책의 checkConditions()는 여러 객체에서 값을 읽어 자신의 필드를 갱신한다. 동시성·상태 갱신 순서를 검토할 때는 각 callback과 Handler 문맥을 함께 추적해야 한다. 하나의 원자적 snapshot이라고 볼 근거는 없다.

비동기 동작과 완료 의미

상태와 결과 순환

SVG 원본 · Mermaid 원본

Connections

상세 분석 목차 · 기존 전체 SVG 지도 · 정책 조건표 · 실행 시나리오