A1 System APK Release Recovery 2026-08-01
이 문서는 A1 실기기에서 MaumAi와 MR6 DeviceAgent를 교체한 뒤 발생한 부팅 불안정 원인을 분리하고, release APK로 복구·재배포한 증거를 기록한다.
결론
장애 배포의 직접적인 릴리스 프로세스 결함은 platform 서명 실패가 아니라 debug build variant 오선택이었다.
| 항목 | 장애 배포본 | 복구 배포본 |
|---|---|---|
| MaumAi variant | debug, application-debuggable |
release, non-debuggable |
| MaumAi version | 1.19.28 |
1.19.36 |
| MaumAi APK 크기 | 994,537,474 bytes | 839,847,786 bytes |
| MaumAi bundled native libs | 16개, 130,930,224 bytes | 0개 |
| DeviceAgent variant | debug, application-debuggable |
MR6 release, non-debuggable |
| DeviceAgent APK 크기 | 13,240,940 bytes | 3,649,326 bytes |
| DeviceAgent version | 0.257 |
0.257 |
| 인증서 SHA-256 | platform cert | 동일 platform cert |
MaumAi는 android.uid.system을 사용하는 persistent system app이다. debug
variant는 release에서 제외되는 QNN, Genie, ONNX, Sherpa 계열 native
library를 APK 안에 함께 넣고 있었다. 따라서 장애 배포는 production
system app과 다른 로딩 표면을 만들었고, persistent app 시작 실패가
반복될 위험이 있었다. DeviceAgent도 minify되지 않은 debug variant가
함께 배포됐다.
이전 부팅의 fatal stack은 DropBox, watchdog, pstore에 남아 있지 않았다. 따라서 정확히 어느 native load 또는 persistent restart가 최종 reboot를 발생시켰는지는 직접 증명하지 않는다. 다만 서명, DB, 저장공간은 배제됐다.
- 두 장애 APK도 platform 인증서 자체는 일치했다.
- MaumAi DB version은 기기와 소스 모두
122였다. - DeviceAgent schedule DB version은 MR6 source 기준
7이며 복구 부팅에서Schedule initialization done이 확인됐다. - remount scratch는 12GB 중 약 1.3GB만 사용해 공간 고갈이 아니었다.
안전 배포 절차
- 기기 설치 APK를 로컬로 pull하고 SHA-256을 기록한다.
- MaumAi는
testDebugUnitTest와assembleRelease를 실행한다. - DeviceAgent는
a1-packages-mr6/apps/DeviceAgent에서testDebugUnitTest와assembleRelease를 실행한다. - 두 APK를 zipalign한 뒤 지정된
platform.jks로 다시 서명한다. apksigner verify --print-certs로 기기 platform 인증서와 비교한다.- 대상 디렉터리에
.new이름으로 push하고 기기 측 SHA-256을 검증한다. - 검증된
.new만 원본 이름으로 rename하고0644,root:root,system_filecontext를 적용한다. sync후 한 번 재부팅하고 부팅, PID, fatal, DB, TaskManager를 확인한다.
debug APK는 platform 인증서로 다시 서명해도 release APK가 되지 않는다.
application-debuggable, release minify/resource shrink, native library
포함 여부를 별도로 검증해야 한다.
2026-08-01 실기기 증거
대상 기기: 192.168.123.118:5555
| 검증 | 결과 |
|---|---|
| MaumAi unit test | BUILD SUCCESSFUL |
| MaumAi release build | BUILD SUCCESSFUL |
| DeviceAgent unit test | BUILD SUCCESSFUL |
| DeviceAgent release build | BUILD SUCCESSFUL |
| platform cert | c8a2e9bc...51192ab8 |
| 재부팅 완료 | sys.boot_completed=1, boot animation stopped |
| 5분 PID 유지 | MaumAi 2698, DeviceAgent 2868 |
| package fatal | 0 |
| DB downgrade / SQLite fatal | 0 |
| DeviceAgent schedule | Schedule initialization done |
| TaskManager | enabled, executor 56개, queue 11개 |
배포 artifact:
artifacts/platform-release-20260801_012320/MaumAi.apkartifacts/platform-release-20260801_012320/DeviceAgent.apk
배포 전 기기 백업:
backup/20260801_010118_192.168.123.118_pre_redeploy/
분리된 후속 이슈
부팅 후 DeviceAgent semantic observation은 MaumAi outbox에 정상 enqueue 됐지만 Cloud endpoint가 HTTP 500을 반환했다. outbox가 이벤트를 보존하고 프로세스는 유지됐다. 이는 APK 서명·부팅·TaskManager 초기화와 분리된 Cloud endpoint 과제다.