← Docs hub

공기질 판정·청소 후보 우선순위의 도메인 이관

DeviceAgent 안에 있던 PM·가스 등급 판정을 AirQuality 도메인으로 옮기고 실제 기존 호출을 연결했다. 폴더 이동과 함께 기존 앱의 컴파일 대상도 정본으로 바꿨다.

전체 구조에서의 위치

전체 폴더와 역할

구조도 크게 보기

그림의 services/core → domain 중 airquality/policy에 해당한다. 공통 TaskManager나 Cleaning 정책 아래에 넣지 않는다. 기존 호스트와의 호출은 다음과 같다.

센서 갱신 / 공기질 연동 청소의 보고서 평가
  → DeviceAgent AirQualityManager.evaluateAirQuality
  → base/services/core/.../domain/airquality/policy/LegacyAirQualityGradingPolicy
  → 등급 반환 → 기존 호스트 후속 처리
위치 책임
domain/airquality/policy Android 의존성 없는 등급 판정
기존 AirQualityManager 센서 값·기존 상태·가변 경계표 제공
AirQualityManagerService 별도 서비스 수명과 식별자; 이번 변경으로 관측 생산자가 연결되지는 않음
DeviceAgent Gradle 정본 공기질 정책 하위 폴더만 포함

보존한 동작

정책 자체는 상태를 저장하지 않는다. 호출 시 전달한 가스 값이 여러 센서의 원자적 스냅샷이라는 뜻도 아니다.

최초 등급 판정 이관의 검증

정책 테스트 5개, DeviceAgent 기존 테스트 22개 통과. 실제 컴파일 소스 검사와 debug APK 빌드가 성공했고 38개 빌드 작업을 모두 재실행했다. 바이트코드에서 기존 메서드가 정본 정책을 호출하는 것도 확인했다. 계층·폴더·공개 API 경계 검사 통과. APK SHA-256은 e07d35013e5cc78a88d46150964de4d4ebcc5436957c4744c97b0be04b277e7e다.

센서 생산자·상태 소유권·알림 수명·제품 Runtime 연결은 남아 있다. 최초 단계에서는 서버 전체 회귀를 실행하지 않았으며, 아래 후속 단계에서 소스 스냅샷 기준으로 확대했다. AOSP 제품 빌드·실기기 설치는 두 단계 모두 미검증이다. 전체 상태 그림의 AirQuality는 일부 구현으로 유지한다.

후속 이관: 보고서 기반 청소 후보 우선순위

MainApi → CleaningLifecycleCommandHandler → AirQualityPriorityResolver의 기존 호출을 유지하면서 판단 규칙을 같은 폴더의 AirQualityReportPolicy로 옮겼다.

정본 정책 기존 연결부에 남긴 책임
보고서 10회 이상에서 이력 사용 DB에서 최근 전체 청소 보고서 조회
나쁜 등급 기준·보고서 PM/가스 등급 집계 Bundle 읽기·숫자 문자열 해석
나쁜 횟수 우선, 동률이면 최대 PM10 우선 후보 지역의 PM10 제공·지도 근접 순서 계산

횟수가 다르면 PM10을 미리 읽지 않는다. 완전동률의 정렬 순서도 새로 만들지 않고 기존 Map과 stream 동작을 유지한다. 정본 정책은 Android·DB·기존 앱을 참조하지 않는다.

신규 정책 검사 14개와 등급 정책 5개, DeviceAgent 22개가 통과했다. 실제 앱 바이트코드에서 정책 메서드 호출 4개와 debug APK 빌드를 확인했다.

검증을 확대해 서버 674개·SDK 62개 검사 및 Runtime release APK도 확인했다. 기준은 c268aa0 정본에 이번 정책·테스트를 추가한 소스 스냅샷이며, 보존 중인 미완 LLM 등 작업 트리의 다른 수정은 포함하지 않았다. 98개 Gradle 작업을 모두 재실행했다. Runtime APK SHA-256은 b49e87fefd94516665c8605a6088446fb4166ac0fff9744f139d39cf1e6ccaa6다. 이것은 제품 부팅·실기기 검증이나 도메인 전체 이관 완료를 뜻하지 않는다.

상태 계약과 관측 연결부의 폴더 정리

공기질뿐 아니라 IoT·Power도 같은 책임 기준으로 구분했다.

도메인 state/: 상태 값·키 observation/: 기존 관측 변환
AirQuality AirQualityState, AirQualityStateKeys, IndoorAirQualityObservation AirQualityObservationAdapter
IoT IotConnectionState, IotStateKeys AwsIotConnectivityObservationAdapter
Power BatteryObservation, PowerStateKeys BatteryObservationAdapter

각 ManagerService는 도메인 루트, 공기질 판단은 policy/에 둔다. 운영 클래스 10개와 테스트 클래스 3개를 이동했으며 값·TTL·source·예외 동작은 그대로다. 191ada8 정본에 이 폴더 변경만 반영한 소스 스냅샷에서 서버 674개·SDK 62개와 Runtime release 빌드가 통과했다. 다른 미완 작업·실기기는 이 검증에 포함하지 않았다.

폴더가 나뉘었다고 상태 소유권까지 이관된 것은 아니다. AirQuality·Power의 관측 어댑터는 아직 공통 StateManager에 직접 기록한다. IoT는 9월 14일 후속으로 기본 Runtime에 등록하고, 서비스가 발급한 관측 연결에 READY·수명 세대 검사를 적용했다. 변환 어댑터는 더 이상 직접 기록하지 않는다. 세 도메인 모두 실제 생산자 구독·해제 연결은 남아 있다. 전체 구조도의 ‘일부 구현’ 표시는 유지한다. 최신 상태.

Connections

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