# Android clean-room E2E contract 이 디렉터리의 플로우는 `com.d3ro.voice`의 번들 포함 `e2e` APK를 Metro 없이 설치해 실행하는 출시 게이트다. ## 필수 게이트 | Flow | 계정 | 외부 쓰기 | 검증 범위 | |---|---:|---:|---| | `fresh-install-auth.yaml` | 없음 | 없음 | 기존 사용자 온보딩, 로그인/비밀번호 재설정 진입, 콜드 재실행 상태 유지, 비로그인 광고 차단 | | `fresh-install-signup.yaml` | 없음 | 없음 | 5단계 튜토리얼, 새 사용자 회원가입 진입, 권한 deny/allow/deny 전환, 콜드 재실행, 비로그인 광고 차단 | | `invite-deep-link.yaml` | 없음 | 로컬 pending token 저장 후 닫을 때 삭제 | 앱 소유 custom-scheme 라우터, 로그인 필수 경계, 비로그인 광고 차단 | 필수 게이트는 실제 가입, OAuth, 결제, 팀 가입, 서버 데이터 생성을 수행하지 않는다. CI는 같은 `fresh-install-signup.yaml`을 기본 프로필과 `840x1490` 작은 화면에서 각각 실행하고, 실패 여부와 관계없이 디스플레이 override를 초기화한다. Maestro 실행 전에 debug 앱과 AndroidTest APK를 임시 설치해 `CsprngInstrumentedTest`를 한 번 실행한다. 이 계측 검사는 실제 Android `RNGetRandomValuesModule`에서 16바이트 엔트로피를 두 번 받아 길이, non-zero, 비동일성, UUID v4 version/variant 소비 계약을 확인한 뒤 두 패키지를 제거한다. 이후 검증 대상 E2E APK를 fresh install한다. ## 외부 계정 게이트 `authenticated-parity.yaml`은 CI에 `MOBILE_E2E_EMAIL`과 `MOBILE_E2E_PASSWORD`가 모두 있을 때만 실행한다. 이 플로우는 다음을 실제 앱 UI에서 확인한다. - Free 계정의 Google 테스트 배너 슬롯 - 마이크 권한 거부 오류와 권한 허용 후 녹음 시작/취소 복구 - sideload 환경의 Google Play 구매 차단 - 보상형 광고 상태 표시 - 계정, 기록, 녹음, Talk, 기기, 회의, 템플릿, 메모, 팀, 알림, 사전, 명령, 지식, 액션, 데이터 이동 화면 - 알림 권한 거부 상태와 허용 후 화면 재진입 복구 `invite-app-link-release.yaml`은 live `assetlinks.json`에 등록된 인증서로 서명한 release APK에서만 실행한다. E2E APK의 debug 인증서를 공개 App Link 신뢰 목록에 추가하지 않는다. 실제 OAuth 공급자 동의/콜백, Google Play 결제/복원, 광고 SSV 크레딧 적립, 외부 공유 대상 앱 확인도 공급자 계정과 배포 채널이 필요한 별도 출시 승인 항목이다. 이 저장소의 자동화는 성공을 위조하지 않으며, 실행하지 않은 항목을 CI 증거에 `NOT_RUN`으로 기록한다. ## 실행 전제 - `e2e` APK는 `debuggable=false`, `E2E_TEST_BUILD=true`, arm64-v8a+x86_64 universal이며 `assets/index.android.bundle`을 포함해야 한다. 같은 APK를 hosted x86_64 emulator와 arm64 실제 기기에 설치한다. - `e2e` 및 release Gradle task는 strict SemVer `D3RO_VERSION_NAME`과 1 이상 `D3RO_VERSION_CODE`가 없으면 실패해야 한다. GitHub release는 workflow run number에 고정 offset을 더해 Play용 코드를 단조 증가시키고, GitLab E2E는 project pipeline IID를 사용한다. - Google 공식 테스트 App ID 및 광고 단위만 E2E에 허용한다. - E2E APK는 custom scheme으로 동일한 앱 내부 초대 라우터를 검증한다. HTTPS `autoVerify`는 release signer SHA-256을 live `/.well-known/assetlinks.json`과 대조한 release 전용 flow에서만 검증한다. - release APK는 `E2E_TEST_BUILD=false`이고 Google 테스트 publisher ID를 포함하면 실패해야 한다. - 에뮬레이터 게이트를 실행하는 동안 Metro 서버를 시작하면 안 된다.