← Docs hub

DeviceAgent TaskManager

기존 기기 기능을 관리 가능한 실행 Framework로 연결

TaskManager는 이동, 청정, 화면, TTS, 보안, 설정과 예약 기능을 다시 만드는 모듈이 아니다. 호출자와 기존 기기 기능 사이에서 실행 접수, 허용, 순서, 상태, 취소, 실패와 실제 완료 증거를 공통 계약으로 관리한다.

DeviceAgent TaskManager 핵심 구조

1. TaskManager가 없던 기존 DeviceAgent

DeviceAgent에는 이미 기능 API가 있었다. 하지만 여러 기능을 묶는 호출자가 다음 책임까지 직접 가져가야 했다.

기능 수와 호출 채널이 늘수록 이 책임이 서비스 코드와 callback에 반복됐다. 동일한 이동이나 청정도 호출자마다 다른 순서, 상태와 실패 처리를 갖기 쉬웠다.

2. 구축 전과 구축 후의 차이

TaskManager 도입 전후

구분 기존 직접 호출 TaskManager 관리 실행
요청 개별 method와 callback을 호출자가 연결 Task 또는 Workflow로 구조화해 제출
실행 허용 기능별 분기 admission과 policy에서 공통 판정
순서 호출자 callback 체인 단계와 의존관계 데이터
상태 기능별 상태와 로그 공통 lifecycle과 TaskRecord
완료 method 반환 또는 개별 callback completion target과 물리 증거
취소 기능별 별도 구현 Task·queue·workflow 단위 취소
실패 문자열과 예외가 분산 reason code와 복구 가능성
관측 로그를 조합해 추정 event와 correlation ID로 추적

단일 호출도 TaskManager를 통과하면 동일한 상태와 결과 계약을 얻는다. 여러 동작은 caller 코드가 아니라 Workflow 데이터로 조합된다.

3. TaskManager Framework 전체 구성

TaskManager Framework 전체 구조

Framework의 핵심 데이터 흐름

요청부터 완료까지

  1. 앱, PUI, IoT, 예약 또는 내부 서비스가 구조화된 요청을 제출한다.
  2. MainApi.executeMethod()가 control API와 legacy API를 구분한다.
  3. TaskManager가 입력, 호출자, 상태와 자원 정책을 검사한다.
  4. 허용된 Task를 queue 또는 Workflow에 배치한다.
  5. Executor가 기존 DeviceAgent 도메인 API를 호출한다.
  6. callback과 상태 변화가 completion evidence로 변환된다.
  7. TaskManager가 terminal 상태를 확정하고 호출자와 모니터에 event를 전달한다.

4. TaskManager Core가 실제로 소유하는 기능

TaskManager Core Runtime

TaskManager가 관리하는 실행 단위

단위 설명
Task 하나의 기기 기능 실행과 그 lifecycle
Workflow 의존관계를 가진 여러 Task의 실행 계획
Queue 같은 자원 또는 정책 그룹의 실행 순서
TaskRecord 요청, 상태, 시간, 결과와 상관관계를 보존하는 기록
Event 진행, 단계 전환, 완료, 실패와 취소 통지

Core 기능 범위

기능 Core 책임
Admission 요청 형식, 호출자, 기기 상태와 자원 정책 검사
Queueing과 우선순위 충돌 방지, 순서 보장, 선점·병합 정책 적용
복합명령과 workflow 처리 순차·병렬·의존 단계와 실패 정책 관리
Lifecycle SUBMITTED부터 terminal 상태까지 전이 관리
Timeout과 retry 기능별 허용 범위와 상한 적용
취소와 보상 진행 중 기능 중단, 후속 단계 차단, 안전 복구
Completion Gate 물리 또는 runtime evidence가 올 때까지 완료 보류
Reason과 event 실패 원인, 복구 가능성, 진행률과 결과 표준화
Persistence와 observability 실행 이력, correlation과 운영 상태 보존

현재 workflow queue 경계

상위 Workflow는 workflow queue가 소유하고, 하위 Task는 movement, cleaning, state 같은 도메인 queue를 사용한다. 상위 queue가 모든 물리 자원을 직접 잠그지 않으므로 서로 다른 Workflow의 하위 Task 간 충돌은 도메인 policy와 queue에서 차단해야 한다.

5. AOSP와 SKIX 안에서의 위치

AOSP와 SKIX 계층 위치

TaskManager는 이 표준 계층 중 privileged product app 내부에 있다. frameworks/base 내부의 Android SystemService나 Android public SDK API가 아니다.

자연어 해석, 대화 라우팅, 장기 목표 판단은 범위에서 제외한다. TaskManager는 실행할 기기 행동이 이미 결정된 이후의 허용, 수행과 완료를 관리한다.

System / Product Application
-> TaskManagerClient AAR
-> Binder/AIDL product IPC
-> SKIX namuh Product Execution Framework
-> DeviceAgent domain API
-> AIDL / HIDL / HAL / MCU / Sensor

Binder/AIDL은 SDK가 아니라 IPC 계약이다. TaskManagerClient AAR이 앱 개발자에게 안정된 typed facade를 제공하고, DeviceAgent 내부의 TaskManager가 실제 실행 lifecycle을 소유한다.

Product Execution Framework의 의미

6. MainApi에 삽입된 세 실행 경로

DeviceAgent 연결 구조

경로 목적
Task control API submitTask, submitWorkflow, 조회, 취소와 planning context 처리
Managed legacy API 기존 method를 Task로 감싸 공통 lifecycle 적용
Direct legacy API 미편입 기능과 원복 경로 유지

TaskManager는 선택 적용으로 도입한다. 기능을 편입해도 executor가 기존 API를 재사용하며, 문제가 있으면 동일 method의 direct legacy 경로로 원복할 수 있어야 한다.

7. 전체 기능 API를 공통 Framework로 묶는 원리

  1. 기존 공개 기능명을 canonical taskMethod로 보존한다.
  2. validator가 필수 payload와 type을 검사한다.
  3. policy catalog가 queue, mode, priority, timeout과 completion target을 선언한다.
  4. executor adapter가 기존 DeviceAgent API를 호출한다.
  5. domain callback을 공통 completion evidence로 변환한다.
  6. reason contract와 event가 호출자에 결과를 반환한다.

새 기능은 Core에 조건문을 계속 추가하는 대신 validator, policy, executor와 completion adapter를 등록한다. 조합 기능은 callback 체인 코드를 새로 만들기보다 이미 등록된 Task를 Workflow로 구성한다.

8. 실행 예시

단일 Task: 스테이션 복귀

submitTask(returnToStation)
-> movement admission
-> 기존 복귀 API 호출
-> movement.started
-> docking/charging evidence
-> COMPLETED

접수 성공은 완료가 아니다. 스테이션 도킹 또는 제품이 정한 동등한 완료 증거가 있어야 terminal 상태가 된다.

Workflow: 이동 후 청정하고 복귀

관리형 Workflow 예시

setMoveTo(room)
-> movement.arrived
-> startBasicAirClear
-> cleaning.stopped
-> returnToStation
-> movement.stationCharging

중간 단계가 실패하거나 취소되면 의존하는 후속 단계는 실행하지 않는다. 실패 정책에 따라 Workflow를 종료하거나, 안전한 보상 Task를 수행하거나, 상위 호출자에 판단을 요청한다.

지연 실행

scheduleWorkflow(runAt or relativeDelayMs)
-> SCHEDULED
-> due 시점에 fresh context로 재검증
-> 기존 submitWorkflow runtime 재진입

TaskManager scheduling은 실행 시점을 관리한다. 반복 제품 일정의 UI·DB·정책은 기존 Schedule 도메인이 유지하고, due 이후 실제 동작을 공통 Task runtime에 연결한다.

9. 완료, 취소와 실패

실행과 완료 evidence 왕복

상황 판정 원칙
이동 API 반환 접수 또는 시작, 완료 아님
도착·도킹 callback 이동 완료 evidence
청정 stop callback 청정 완료 또는 취소 evidence
TTS 종료 playback 종료 evidence
바이탈·보안 앱 사용자 완료·취소 또는 mode 종료까지 장기 세션
PUI 취소 현재 Task 취소와 후속 dependent step 차단
timeout 원인과 복구 가능성을 포함한 terminal 실패

호출자는 내부 예외 문자열이 아니라 reason_code, recoverability, suggested_action과 관련 상태를 받아 사용자 안내, 재시도 또는 원복을 결정한다.

10. 현재 구현과 검증 범위

현재 소스 정합 기준은 다음과 같이 구분한다.

증거 의미
61 declared / 61 policy / 60 executor registered 선언·정책·실행기 등록 정합성, 실기기 성공 수가 아님
270/270 host/JVM 검사 계약과 runtime 회귀 통과, 보드 물리 완료 증거가 아님
monitor event timeline 요청, 단계와 terminal event 상관관계
실기기 log·callback actuator와 runtime의 실제 완료·실패 증거

SET_MAIN_STATE처럼 정책은 있으나 모든 제품 상태에서의 물리 acceptance가 닫히지 않은 기능은 “구현됨”과 “제품 검증 완료”를 분리해 표시한다. 시스템 앱 교체 검증은 platform certificate 일치 후 release APK를 /system/priv-app에 반영해야 하며 debug certificate APK를 사용하지 않는다.

11. 구조 변화의 효과

관점 효과
사용자 진행, 취소와 실패 이유가 일관되고 복합 기능의 중간 상태를 알 수 있다.
제품 기획 기존 Task 조각을 조합해 새 시나리오를 설계하고 채널별 중복 구현을 줄인다.
개발 기능 코드와 실행 관리가 분리되고 신규 기능의 변경 범위가 국소화된다.
검증 요청부터 물리 완료까지 ID와 event로 추적한다.
운영 queue, timeout, 실패 원인과 병목을 공통 지표로 관찰한다.
플랫폼 앱, PUI, IoT, 예약과 선택적 Planner가 같은 실행 Core를 공유한다.

TaskManager의 목적은 queue 자체가 아니라, 기기 기능을 수명주기와 증거를 가진 실행 단위로 만들고 그 조합을 제품 자산으로 재사용하는 데 있다.

12. 기준 문서

외부 구조 원리 참고:

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