← Docs hub

제품 빌드·네이티브 서비스·권한 경계

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

저장소와 제품 빌드의 관계

루트 Android.mk는 all-subdir-makefiles를 포함한다. apps/, libs/, service/의 Android.mk도 하위 makefile을 포함한다. 이 저장소 자체에 전체 Android product·lunch target·SystemServer·커널·HAL 구현은 없다. README.md는 빈 파일이어서 구현 근거로 사용할 설명이 없다.

packages.mk:1–2는 LOCAL_USED_AIRBOT_PACKAGES_PREBUILT가 n이고 LOCAL_USED_AIRBOT_PACKAGES가 y일 때 모듈·정책·권한 복사를 추가한다. 변수명만 읽고 조건을 반대로 해석하면 안 된다.

단계 저장소가 정의하는 것 외부에서 확인할 것
모듈 발견 루트 및 하위 Android.mk 상위 제품이 이 경로를 포함하는가
제품 선택 packages.mk PRODUCT_PACKAGES 및 HQA 조건 제품 변수의 실제 값과 외부 모듈 정의
앱 빌드 source BUILD_PACKAGE 또는 APK BUILD_PREBUILT 의존 JAR·AAR·HAL Java library 존재
배치 다수 앱의 system/priv-app, 권한 XML system 복사 선언 최종 이미지·설치 APK·서명
native 기동 executable module과 LOCAL_INIT_RC rc 포함·init 실행·SELinux 허용

빌드와 설치 증거의 경계

AOSP와 Gradle이 공존한다

DeviceAgent의 AOSP module 본체는 apps/DeviceAgent/app/src/main/Android.mk다. 상위 디렉터리의 Android.mk는 재귀 include다. Gradle app/build.gradle도 따로 존재한다. 어느 빌드 경로를 실행했는지에 따라 의존·리소스·서명 설정이 달라질 수 있으므로 Gradle 성공을 AOSP 성공이라고 보고하지 않는다.

IotAgent와 PairingAgent의 Android.mk는 각각 로컬 APK 파일을 BUILD_PREBUILT로 선택한다. 소스를 고쳐도 해당 prebuilt를 갱신하지 않으면 AOSP 이미지에 반영된다고 보장할 수 없다. AMRAgent·UpdateAgent·VisionAgent는 Java/AIDL source BUILD_PACKAGE이고, 라이브러리 일부가 prebuilt인 구조다.

ICT·SKMLauncher는 제품 선택 목록에는 있지만 해당 디렉터리에 Android.mk가 없다. EventAssetAgent·SKMLauncher2·AirbotSdkProject도 이 트리의 Android.mk 설치 선언만으로 탑재 위치를 확정할 수 없다.

native 서비스 전체

모듈 빌드·시작 실제 책임
ethernetagent service/ethernetagent/Android.mk, ethernetagent.rc → /system/bin/ethernetagent; class main, root/system ethernetStatic.c가 boot 완료·factory property를 확인하고 eth0 링크, 주소, 라우팅과 ping을 관리
logwriter service/logwriter/Android.mk, logwriter.rc → /system/bin/logwriter; class main, root/system main→entryLogWriter→logcat·파일 observer·압축 worker
a1_decrypt service/decrypt/Android.mk → 외부 prebuilt executable·rc 선언만 이 저장소에 존재; 바이너리·rc 구현은 외부 경계

Ethernet 경로

ethernetStatic.c:523의 main이 상태 property를 초기화하고, boot 완료·factory 모드 조건을 거쳐 interface flag를 검사한다. 링크 변경 시 주소·route를 설정하고 연결 상태를 property로 전달한다. 연결 시 ICMP 검사도 수행한다. 제품 네트워크 값 자체는 이 구조 문서에 복제하지 않았다.

근거: service/ethernetagent/ethernetStatic.c:74, :246, :467, :523. 소켓·ioctl·netlink가 실제 허용되는지, eth0가 존재하는지, 상대가 응답하는지는 미검증이다.

로그 경로

main.cpp:21–46이 signal handler와 환경을 설정한 뒤 entryLogWriter()를 호출한다. logwriter.cpp:146–166이 logcat 및 event/comm observer를 시작한다. worker는 logcat 프로세스, inotify 회전 감지, gzip 압축을 연결한다. ZipCompressor.cpp는 minizip을 이용한 ZIP 처리를 제공한다.

로그 수집은 제품 동작의 관찰 경로다. logcat 수집 성공이 상위 업무 성공을 증명하지는 않는다. Android.mk의 externla/zlib 경로 표기는 오타 가능성이 있으나 이 문서 작업에서 빌드를 실행해 실패 여부를 검증하지 않았다.

복호화 경계

service/decrypt/Android.mk:4–10은 저장소 밖의 prebuilts/packages/decrypt 아래 binary와 rc를 참조한다. packages.mk 기본 선택 목록에는 a1_decrypt가 없다. 선언 존재·실제 선택·실제 서비스 기동을 구분한다.

native library

libs/serial_port/Android.mk는 libserial_port를 32/64비트 shared-library prebuilt로 선언하고 system/lib·system/lib64 경로를 지정한다. ELF 검사가 비활성화돼 있다. 복수 .so 파일이 tree에 있지만 ABI·SONAME·linker namespace 적합성은 별도 ELF·이미지 검증 항목이다. packages.mk의 직접 copy 줄은 주석이며, 이 줄을 활성 설치 경로로 읽으면 안 된다.

권한과 정책

sepolicy/system_app.te는 빈 파일이다. packages.mk에 정책 디렉터리 편입 선언은 있으나 이 파일로 daemon domain·file_contexts·property_contexts의 허용을 증명할 수 없다.

apps/permissions/의 privapp XML은 IoT·Update·Pairing·DeviceAgent·Factory·Startup·Launcher package별 권한을 선언한다. 생성 Python은 ANDROID_PRODUCT_OUT, ANDROID_HOST_OUT, host aapt와 실제 APK/framework-res를 이용해 누락 allowlist를 계산한다. 파일이 존재한다는 사실과 실제 privileged 권한이 부여됐다는 사실은 다르다.

근거: packages.mk:6, :33; apps/permissions/ XML 및 privapp_permissions_vendor.py; 각 Manifest와 Android.mk.

운영 스크립트

파일 하는 일 구조상 한계
script/build_DA.sh 외부 QSSI 환경 설정·lunch·mm, DeviceAgent APK 확인, adb root/remount/push checkout·인증서·백업 검증을 자동으로 충분히 보장하는 배포 gate가 아님
script/cmd_test.sh 반복 broadcast로 MCU 시험 명령 전달 요청 전송 도구이며 실제 장치 결과 assertion이 아님

이번 작업에서는 이 스크립트를 실행하거나 시스템 APK를 교체하지 않았다. 향후 실기기 배포에서는 MR6 산출물, 설치 APK 백업, platform certificate와 pushed hash를 별도로 확인해야 한다.

Open Questions

  1. 실제 제품 makefile이 어떤 변수와 모듈 override로 이 패키지를 선택하는가?
  2. SmartFactory·HQA·Gradle-only 모듈과 decrypt prebuilt의 실제 공급 위치는 어디인가?
  3. init·SELinux·privapp allowlist가 완성된 이미지에서 일치하는가?
  4. IotAgent·PairingAgent prebuilt APK와 같은 디렉터리 소스가 일치하는가?
  5. 실제 device_manager·SoundFlow·암호화 서비스의 버전과 callback 계약은 무엇인가?

확대 구조도와 연결별 근거

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