# 눈치 1.8.0 · 제작 GIANTwo 다른 Android 휴대폰에 설치하고, 보호를 켠 뒤 유튜브·인터넷으로 이동하는 흐름을 추가했습니다. 웹 체험은 페이지가 보이는 동안만 작동합니다. 다른 앱 위 거리 보호에는 Android 앱 설치가 필요합니다. 공유 주소: https://production.d2933mjwer914y.amplifyapp.com/ APK: https://production.d2933mjwer914y.amplifyapp.com/downloads/nunchi-1.8.0.apk ## 1단계 · 설치 또는 업데이트 1. 카카오톡으로 공유 주소를 보내세요. 받는 Android 휴대폰에서 링크를 열어 'Android 눈치 설치 · 업데이트'를 누릅니다. 카카오톡 안에서 다운로드/설치가 열리지 않으면 메뉴의 '다른 브라우저로 열기'로 Chrome 또는 Samsung Internet에서 엽니다. 2. 받은 APK를 열고 설치합니다. 본인이 신뢰하는 이 파일에 대해 브라우저/내 파일의 설치 권한이 요청되면 허용하세요. 기기 관리 정책이나 보호자 제한이 설치를 막으면 관리자·보호자의 허용이 필요합니다. 제한을 우회하지 않습니다. 3. 기존 눈치/눈사이가 있으면 삭제하지 말고 업데이트합니다. 같은 패키지와 1.7.0의 동일 인증서를 사용했고 versionCode를 9→10으로 올렸습니다. 다른 키로 서명된 설치본이면 업데이트할 수 없으므로 삭제하지 말고 오류 내용을 확인하세요. 4. 최소 Android 8.0(API26), 전면 카메라 필요. ARM32/ARM64/x86/x86_64 라이브러리를 포함합니다. iPhone에는 이 APK를 설치할 수 없습니다. 모든 Android 기종에서 실물 검증한 것은 아닙니다. ## 2단계 · 새 휴대폰 설정과 다른 앱 사용 1. 눈치를 열고 카메라·알림·다른 앱 위 표시 권한을 확인합니다. 다른 앱 위 표시는 검은 휴식 화면에 필요합니다. 2. 새 휴대폰에서는 실제 사용할 사람이 자로 35cm를 맞춰 거리 보정을 완료합니다. 기기마다 카메라가 달라 다른 휴대폰의 보정값을 그대로 쓰지 않습니다. 설정 QR은 기준 거리·안내 방식 등을 전달하며 수신 기기 보정·기록을 덮어쓰지 않습니다. 3. 보호자 설정에서 기준 거리, 목소리 또는 진동, 최대 안내 음량을 저장합니다. 음성 미리 듣기로 실제 출력도 확인합니다. 4. 홈의 '보호 시작'을 누르고 실제 거리·안내 준비 상태가 나타날 때까지 기다립니다. 준비 후 '보호 켜고 유튜브로 이동' 또는 '보호 켜고 인터넷으로 이동'을 누릅니다. 게임은 보호를 켠 뒤 홈 버튼으로 나가 엽니다. 5. 화면 상단 상시 알림으로 실행 상태를 확인합니다. 카메라 포그라운드 서비스가 측정을 담당하며 Activity가 다른 앱으로 전환돼도 보호 세션을 종료하지 않습니다. 웹의 '설치된 눈치 1.8 열기'는 홈 화면만 열며 자동으로 카메라를 켜지 않습니다. 6. 기기에 따라 화면 잠금·다른 카메라 앱·배터리 정책·사용 제한으로 카메라가 중단될 수 있습니다. 제한 안내가 나오면 눈치로 돌아와 상태를 확인하고 필요한 조치 후 직접 보호를 시작하세요. 기기가 가림을 제한하는 앱에서는 가림을 보장하지 않습니다. 7. 홈·상시 알림·검은 휴식 화면에서 '보호 종료'를 누르면 기존의 통합 종료 처리가 실행됩니다. ## 보존한 기능 가까움 첫 유효 판단부터 안내, 일반 안내 완료 5회 → 전환 안내 1회 → 10초 가림, 안전거리 복귀 시 취소, 가까운 거리에서 내부 안내 크기 증가, 보호자 최대 음량, 네 목소리·진동, 기존 사진·눈치/GIANTwo 디자인을 유지했습니다. 휴대폰 전체 미디어 음량은 강제 변경하지 않습니다. 패키지·설정 키·거리 보정·기록 스키마·QR 형식은 유지했습니다. 이번 버전의 실제 기기 업데이트 데이터 유지 검사는 USB 미승인으로 하지 못했으며, 핵심/저장소/센서/음성 소스와 자산의 동일성을 비교했습니다. 개발 환경: JDK17, Android SDK/platform/build-tools36, Gradle wrapper8.13. 검증 명령: gradlew.bat --no-daemon --max-workers=1 :core:test :app:testDebugUnitTest :app:lintDebug :app:assembleDebug :app:assemblePreview :app:assemblePreviewAndroidTest 개발용(debug) 인증서로 서명된 설치 가능한 APK입니다. 스토어 배포용 서명이라고 표시하지 않습니다. 서명키는 소스 ZIP에 포함하지 않습니다. # 눈치 1.8.0 검증 · 2026-10-04 ## 실행한 자동 검증 - 전체 Gradle 명령 BUILD SUCCESSFUL. core 125 + app 141 = 266개, 실패·오류·건너뜀 0. - Android lint: 오류 0, 경고 42개. 경고 없는 빌드라고 표시하지 않습니다. 새 Uri.parse 두 곳은 KTX 권장 경고이며 숨기지 않았습니다. - debug APK, preview APK, preview 테스트 APK 빌드 완료. preview 기기 테스트는 실행하지 못했습니다. - 새 전환 회귀 테스트 12개: 수정 전 12개 실패(웹→앱 route 및 보호 후 이동 API 없음), 수정 후 12개 통과. Android 8/11/15 Robolectric 환경 각 4개입니다. 실제 기기나 OS 에뮬레이터 실행과 구분합니다. - 준비 전 앱 이탈 차단, 웹 링크의 홈 진입과 자동 보호 미시작, YouTube 이동 후 Activity 중지에도 현재 세션 유지, 기본 브라우저 Intent와 미허용 목적지 무시를 검증했습니다. - APK 서명 검증, 기존 1.7.0 인증서 비교, zipalign -P16 검증 통과. 인증서 SHA256 dc25fe7e2b78e5fe832e72e2e04ac5a025ab56542f1fb0f6f59fe3d56ae9b73c. - versionName1.8.0 / code10 / min26 / target36 / com.giantwo.noonsai. ABI: arm64-v8a, armeabi-v7a, x86, x86_64. - 권한: CAMERA, POST_NOTIFICATIONS, VIBRATE, FOREGROUND_SERVICE, FOREGROUND_SERVICE_CAMERA, SYSTEM_ALERT_WINDOW, AndroidX 내부 수신자. INTERNET 권한 없음. 새로운 사용자 권한 없음. - 기존 core/src 및 app/src/main 파일 중 변경은 MainActivity, NoonsaiUi, Manifest뿐이며 나머지 67개 바이트 동일. 핵심 거리/카메라/오디오/설정/보정/기록 소스·기존 이미지와 음원 보존. ## 확인한 원인과 범위 공유 웹 체험은 화면이 보이는 동안의 브라우저 카메라 기능입니다. 다른 앱 위에서도 지속되는 Android 보호와 구분되지 않아 설치 없이 사용한 경로가 문제였습니다. 사이트에서 Android 설치/열기를 우선하고 네이티브에서 보호 준비 후 다른 앱으로 이동하게 했습니다. 기존 네이티브 서비스 자체가 앱 전환으로 중단되는 새로운 결함을 실물 로그로 재현했다고 주장하지 않습니다. ## 웹 자동 검증 웹 17개 단위 테스트 통과. 실제 Chromium에서 로컬 파일 음원 8개의 재생 완료 콜백, MediaPipe worker 초기화와 빈 프레임 추론, 설정 저장/새로고침, 보정 전 보호 시작 방지, 320/390/844/1440px 가로 넘침 없음, Android 설치·열기 링크를 검사했습니다. 사람의 실제 청취와 실제 얼굴 거리 정확도 검사가 아닙니다. 공개 배포 후 검증은 웹 프로젝트의 deployment 기록에 추가합니다. ## 실기기 미검증 현재 USB 기기는 ADB unauthorized 상태입니다. 사용자 허용 응답 후에도 컴퓨터 승인이 확인되지 않아 이번 1.8.0의 설치·실제 유튜브/브라우저/게임 카메라 지속·가림·소리·진동·거리 정확도·성능(P95)·업데이트 후 데이터 유지를 확인하지 못했습니다. 다른 제조사 기기도 미검증입니다. 1.7.0 이전 실기기 기록은 역사 자료이며 이번 버전 통과로 계산하지 않습니다. 설치 후 체크: [ ] 새 기기35cm보정 [ ]40cm안전 [ ]20/15cm경고 [ ]유튜브 일반/전체/가로 [ ]브라우저/게임 [ ]5회+전환+10초가림 [ ]목소리/진동 [ ]보호종료 즉시정리 [ ]재실행 설정/기록 유지. 카메라 timestamp 검증 불가, 얼굴 검출 실패, 잠금/타 앱 카메라/기기 정책에서는 측정 제한이 남습니다. 근거: docs/evidence/background-handoff-20261004의 full-validation, handoff-red/green, test-results, lint-results, 서명/정렬/badging, package-audit. # 눈치 1.8.0 변경 파일 기준: 최신 눈치1.7.0(code9). 원본 프로젝트는 보존하고 별도 작업 폴더에서 수정했습니다. - app/build.gradle.kts: versionName1.8.0, versionCode10. - app/src/main/AndroidManifest.xml: nunchi://open browsable route, singleTask. 패키지·권한 유지. - app/src/main/java/com/giantwo/noonsai/MainActivity.kt: 준비 상태를 재확인한 YouTube/기본 브라우저 이동, 앱 없음/제한 오류 표시, 웹 재진입은 홈으로만 이동. Activity 중지 시 기존 서비스 유지. - app/src/main/java/com/giantwo/noonsai/ui/NoonsaiUi.kt: 홈의 다른 앱 보호 안내와 준비 상태별 이동 버튼, 오버레이 권한 안내, 제조사/카메라 제약 표시. - app/src/test/java/com/giantwo/noonsai/service/ProtectedAppHandoffTest.kt: Android8/11/15의 12개 회귀 검사. - README.md, docs/verification.md, docs/final-changes.md, tools/package-android-handoff.py: 설치·새 기기 보정·검증 범위와 재현 가능한 배포 패키징. 이전1.7 문서는 history에 보존. 별도 웹 프로젝트: Android APK설치/네이티브 열기 우선, 웹 체험의 전면 제한 표시, 네이티브 이동 직전 웹 카메라/오디오 정리, 캐시 버전1.1, 실제 음원 재생/링크/반응형 검사. 기존 AWS주소를 유지합니다. Supabase DB/Auth/Storage 변경은 이 기능에 필요하지 않아 적용하지 않았습니다.