Skip to content

CatchPro 고도화 3: 자동상세진입 반응속도 개선

오늘의 결론

오늘 CatchPro 개선의 핵심은 자동확정 판단보다 앞단에 있는 오더리스트에서 상세화면으로 들어가는 반응속도를 다시 잡는 것이었다.
현장 운행 로그를 보면 오더가 보였는데도 상세화면으로 들어가지 못하는 케이스가 반복됐고, 이 문제는 자동확정 조건을 아무리 다듬어도 먼저 해결해야 하는 병목이었다.

로그에서 확인한 문제

최근 운행 로그 기준으로 자동 상세진입 시도는 많았지만, 상세화면이 열리지 않은 기록도 적지 않았다.
특히 중요한 점은 실패 대부분이 단순한 클릭 실패가 아니라는 것이다.
Android 접근성의 ACTION_CLICK은 성공으로 반환됐는데, 실제 인성앱 화면은 상세로 전환되지 않은 케이스가 대부분이었다.

  • 자동 상세진입 시도: 3,434건
  • 상세 미진입 기록: 825건
  • 그중 대부분은 ACTION_CLICK=true였지만 상세화면이 열리지 않은 케이스
  • 상세 미진입 판단은 평균 약 3.2초, 중앙값 약 2.5초로 늦게 기록되는 경향
  • 자동확정 가능 판단 후에도 확정 검증 중 리스트 재진입이 섞여 검증이 깨질 수 있는 구조 확인

즉, 문제는 “조건 판단이 느리다” 이전에 리스트 행을 눌렀다고 판단했지만 실제 상세화면이 열리지 않는 것이었다.

개선 방향

이번 수정은 자동상세진입 핫패스를 보강하는 방향으로 진행했다.
오더 리스트에서는 무거운 분석보다 상세 진입이 우선이고, 상세화면이 열리지 않았을 때 빠르게 한 번 더 보조 탭을 넣는 구조가 필요했다.

1. ACTION_CLICK 성공 후에도 상세 미진입이면 보조 좌표 탭

기존에는 ACTION_CLICK이 성공하면 클릭이 끝난 것으로 봤다.
하지만 로그상 실제 실패는 바로 이 구간에서 많이 발생했다.
그래서 ACTION_CLICK이 성공했더라도 250ms 뒤에도 오더 리스트가 그대로 보이면 같은 행 중심 좌표를 한 번 더 탭하도록 바꿨다.

private fun scheduleAutoEntryFallbackTapIfNeeded(
    pending: PendingAutoListEntry?,
    clickAttempt: AutoEntryClickAttempt,
    packageName: String,
) {
    if (pending == null) return
    if (!clickAttempt.actionClickSucceeded) return
    mainHandler.postDelayed({
        val current = pendingAutoListEntry ?: return@postDelayed
        val root = rootInActiveWindow ?: return@postDelayed
        if (!root.hasInsungOrderListRows() || root.hasVisibleOrderDetailTitle()) return@postDelayed
        dispatchAutoEntryTapGesture(current.tapX, current.tapY)
    }, AutoEntryActionClickFallbackDelayMillis)
}

2. 상세 미진입 판단을 이벤트 의존에서 타이머 기반으로 변경

기존에는 다음 접근성 이벤트가 들어와야 상세 미진입을 확인하는 흐름이었다.
그래서 코드상 대기시간보다 실제 로그 기록 시간이 훨씬 길어질 수 있었다.
이번에는 클릭 시점에 별도 타이머를 예약하고, 650ms 뒤 직접 상세 전환 여부를 확인하게 했다.

private const val AutoEntryNavigationWaitMillis = 650L
private const val AutoEntryActionClickFallbackDelayMillis = 250L

3. 확정 검증 중에는 새 리스트 진입 중단

자동확정 버튼 클릭 후에는 실제 확정 성공 여부를 검증하는 시간이 필요하다.
그런데 이 구간에서 다시 오더리스트 자동상세진입이 돌면, 확정 검증이 깨지거나 로그가 꼬일 수 있다.
그래서 확정 검증 대기 중에는 자동상세진입을 잠시 멈추도록 했다.

trimPendingConfirmAttempts(capturedAtMillis)
if (pendingConfirmAttempts.isNotEmpty()) return false

오늘 반영된 결과

  • ACTION_CLICK=true인데 상세가 안 열리는 케이스에 대한 250ms 보조 탭 추가
  • 상세 미진입 확인을 650ms 타이머 기반으로 변경
  • 확정 검증 중 오더리스트 재진입 차단
  • 보조 탭 발생 시 분석용 로그 기록 추가
  • research.md에 자동상세진입 핫패스 개선 근거와 코드 스니펫 반영
  • 휴대폰에 최신 APK 설치 완료

다음 현장 검증 포인트

다음 운행에서는 자동확정 성공 여부보다 먼저 아래 지표를 본다.

  • 오더리스트가 보인 뒤 상세화면까지 실제 진입 시간이 줄었는지
  • order-list-auto-entry-action-click-fallback-tap 로그가 얼마나 발생하는지
  • 보조 좌표 탭 이후 상세 미진입률이 줄었는지
  • 확정 가능 판단 후 order_confirm_unverified가 줄었는지

CatchPro의 방향은 계속 같다.
복잡한 부가기능보다, 현장에서 오더가 떴을 때 가장 빨리 상세로 들어가고, 조건이 맞으면 가장 빨리 확정하는 기본 기능을 먼저 강하게 만든다.