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이라고 볼 근거는 없다.
비동기 동작과 완료 의미
- 일반 Binder
sendModuleCommand는MainApi호출 후 초기값인ret=0을 반환한다. MainApi가 정책으로 조기 반환해도 이 값만으로 명령 성공/실패를 구분하지 못한다. 근거:DA/DeviceAgent.java:264–282. - BaseCleaningManager는 HandlerThread와 기능별 callback을 사용한다. 반환과 청정 종료는 다른 시점이다. 근거:
DA/cleaning/BaseCleaningManager.java:213–258,:261–314. - TaskExecutor의 running 표시는
ITask.execute()가 반환되면 finally에서 해제된다. 비동기 AMR/영상 작업의 물리 완료를 추적하는 지표가 아니다.removeTask도 대기 message를 제거한다. 근거:DA/ipc/TaskExecutor.java:50–63,:90. - AMR 결과는
MainService의BatteryStatus,CurrentPosition,MapStatus,MapData등으로 돌아와 도메인 상태를 갱신한다. 근거:DA/main/MainService.java:93–140.
Connections
상세 분석 목차 · 기존 전체 SVG 지도 · 정책 조건표 · 실행 시나리오