← Docs hub

Binder·HAL·데이터 계약 지도

기준: 1398d109c391c4044cae26d0e9aea4d3f08d9670. 지정 커밋의 추적 파일을 직접 확인한 정적 구조 분석이며, 현재 HEAD·후속 TaskManager·SKIX 구현을 포함하지 않는다.

D/는 DeviceAgent Java 루트, A/는 apps/DeviceAgent/app/src/main/aidl/com/sk/airbot/다. Android bound Service와 vendor HAL을 구분한다. 이 저장소에서 SystemServer에 새 서비스를 등록하는 구조를 확인한 것은 아니다.

공개 진입점

등록 → 계약 → 구현 용도 반환 의미
Manifest .DeviceAgent → A/devicecontrol/IDeviceControl.aidl → D/DeviceAgent.java의 Stub callback 등록·해제, sendModuleCommand(in Bundle, out Bundle) 정수 0 자체는 물리 완료 증거 아님
Manifest .WssService → A/wsscontrol/IWssControl.aidl → D/ipc/WssControlStub.java → WssManager WSS 시작·중지·검증·자료 요청 요청 결과와 후속 WSS 이벤트를 함께 해석
Manifest .StreamingService → A/streamingcontrol/IStreamingControl.aidl → D/ipc/StreamingControlStub.java → StreamingManager 스트리밍·업로드·수동 이동 세션 결과·callback과 구별
Manifest .provider.DeviceAgentProvider → D/provider/DeviceAgentProvider.java ContentProvider 접근 Binder 명령 API와 별도 진입점

근거: apps/DeviceAgent/app/src/main/AndroidManifest.xml, D/DeviceAgent.java:513, D/WssService.java, D/StreamingService.java.

동료와 플랫폼 연결

호출자 → 계약 → 상대 연결 근거 해석 경계
DeviceAgent → IAMRControl → AMRAgent D/device/item/amr/AMRService.java:60, :124; D/main/MainService.java:78 callback AMRAgent Java 소스와 command dispatcher 존재; 하위 로봇 펌웨어는 별도 경계
DeviceAgent → IIotControl → IotAgent D/DeviceAgent.java:560; D/main/MainService.java:525 연결 후 callback 등록, 양방향 명령 전달
DeviceAgent → IPairingControl → PairingAgent D/DeviceAgent.java:556; D/main/MainService.java 네트워크 등록·페어링 협력
DeviceAgent → IUpdateControl → UpdateAgent D/DeviceAgent.java:564; D/main/MainService.java UpdateAgent Java 소스와 UpdateEngine 연계; 플랫폼 엔진은 외부 경계
VisionAIManager → IVisionControl / IFaceControl → VisionAgent D/recognition/VisionAIManager.java; A/visioncontrol/ 시각·얼굴 서비스 연계, 모델 내부는 미확인
WssEventAssetManager → IEventAssetService → EventAssetAgent D/wss/eventasset/WssEventAssetManager.java; A/eventassetcontrol/ 증거 영상·자료 처리와 업로드
DeviceAgent·MCUComm → IDeviceManager HAL D/DeviceAgent.java:337; D/device/item/mcu/MCUComm.java HAL 구현·드라이버는 저장소 밖
SoundFlowManager → ISoundFlowService HAL D/system/SoundFlowManager.java:441 오디오 엔진 구현은 저장소 밖
DeviceAgent → IEncryptionService D/DeviceAgent.java:387 및 EncryptionServiceManager 의존 지도 초기화가 연결 callback에 걸림; 서비스 구현은 이 트리에서 확정하지 않음

MCUAgent의 AIDL·prebuilt는 있으나 DeviceAgent.connectServices()의 MCUAgent bind는 주석 처리되어 있다. 실제 DeviceAgent 경로는 device_manager HAL과 MCU 프로토콜 객체를 따라가야 한다.

명령과 결과는 다른 방향이다

명령과 결과 경로

일반 명령은 method와 개별 Bundle 필드로 의미를 전달한다. MainService의 AMR callback은 reportCmd를 읽어 BatteryStatus·CurrentPosition·MapStatus·DockingStatus 등의 처리를 분기한다. 이후 상태 반영과 PUI·IoT 통지가 이뤄진다. 동일 정수 ACK를 모든 기능의 공통 완료 계약으로 해석하지 않는다.

근거: D/DeviceAgent.java:264, D/main/MainService.java:78, D/app/AppCmd.java, A/devicecontrol/IDeviceControlCallback.aidl.

접근 제어에서 실제 확인한 것

WssControlStub의 여러 진입 메서드는 WssPackageValidator.enforceCallerAccess()를 호출한다. validator는 Binder 호출 UID가 SYSTEM_UID인지 확인하고, 호출 PID의 package 목록을 조회해 패키지 이름을 해시한 허용 목록의 front/remote 역할과 비교한다. 이는 APK 서명 인증서 해시 검증과 다른 동작이다.

StreamingService.onBind()의 CALLER_PACKAGE 로그만으로 호출자 인증이 됐다고 볼 수 없다. 일반 IDeviceControl과 Streaming에 WSS의 같은 validator가 보편 적용된다고도 가정하지 않는다. Manifest의 exported와 shared UID, 각 Stub의 검증은 함께 검토할 항목이다. 이 문서는 전체 보안 감사를 수행한 결과가 아니다.

근거: D/wss/policy/WssPackageValidator.java:47–129, D/ipc/WssControlStub.java, D/ipc/StreamingControlStub.java, Manifest.

데이터 소유와 지속성

데이터 대표 소유·저장 경로
기기 설정·기록 일부 D/data/pref/SKMPreferences.java, PrefsMigrator.java, PrefsCryptoUtil.java
예약 D/schedule/db/ScheduleDao.java, ScheduleDbHelper.java
청정 보고 D/db/CleaningReportDao.java, CleaningReportDatabaseHelper.java
경보 D/alert/AlertDao.java, AlertDbHelper.java
지도·구역 D/map/MapManager.java, MappingManager.java, MapUploader.java
WSS 진행·검증·복구 D/wss/data/, D/wss/eventasset/, WssUploadRecoveryController.java

AIDL 사본이 SDK와 서비스들에 반복된다. 계약 변경 시 한 파일만 수정한 것으로 호환성을 보장할 수 없다. SDK·server·consumer가 같은 메서드 순서와 parcel 형식을 사용하는지 확인해야 한다.

Connections

전체 목차 · 앱 구성 · DeviceAgent 내부 · IPC · 실행 흐름 · 플랫폼·빌드 · 근거·확인 범위

Keyboard shortcuts

⌘K / Ctrl+KOpen command palette
/Focus search
g hGo to home
g pGo to projects
g sGo to sessions
j / kNext / prev row (tables)
?Show this help
EscClose dialogs

Structured queries

Mix key:value filters with free text in the palette:

type:sessionOnly session pages
project:llm-wikiFilter by project name (substring)
model:claudeFilter by model name (substring)
date:>2026-03-01Sessions after a date
date:<2026-04-01Sessions before a date
tags:rustPages mentioning a tag/topic
sort:dateSort results by date (newest first)

Example: type:session project:llm-wiki date:>2026-04 sort:date