개발 slecs

메신저 공유 URL 파싱 오류를 난독화 설정으로 해결

목차

v3.1 릴리즈 회고

릴리즈 노트 정리하다가 메신저 공유 URL 파싱이 자꾸 깨졌던 게 떠올라서 한번 정리함.

무엇이 문제였나

기존 추출 로직은 정규식 한 줄로 끝냈었는데, 메신저 쪽에서 공유 포맷을 살짝 바꾸면서 ?p= 뒤에 추가 파라미터가 붙기 시작했음. 사용자 입장에선 같은 링크인데 앱에서만 못 받아내는 상황.

  • 원본 URL 끝에 &shareType=... 파라미터가 새로 붙음
  • 단축 URL은 리다이렉트가 한 단계 더 늘어남
  • 릴리즈 빌드에서만 재현되는 케이스가 있었음

세 번째가 제일 짜증났음. 디버그에선 멀쩡한데 스토어에 올린 빌드에서만 깨지니까 리포트 받고도 한참 헤맸음.

proguard 룰 누락

원인은 결국 난독화였음. URL 파싱 헬퍼 일부 메서드를 리플렉션으로 호출하고 있었는데, 코드 축소 옵션이 켜지면서 메서드 시그니처가 다 갈려버렸음. 디버그에선 축소가 꺼져있으니 안 보였던 것.

-keepclassmembers class **.url.parser.* {
    public *** extract*(java.lang.String);
    public *** resolve*(java.lang.String);
}
-keepattributes Signature, InnerClasses, EnclosingMethod

리플렉션으로 부르는 메서드 패턴을 명시적으로 keep 처리하고, 제네릭 시그니처도 같이 보존하도록 추가함. 사실 처음부터 이렇게 적었어야 했는데 초기에 대충 짜둔 게 1년 넘게 굴러간 거라 손을 못 댔던 부분.

테스트 환경 보강

기존엔 디버그 변형만 자동화 돌리고 있었는데, 이번 일 겪고 나서 릴리즈 변형도 같이 도는 잡을 추가함.

항목 기존 변경 후
디버그 변형 매 PR 매 PR
릴리즈 변형(난독화 ON) 수동만 매 PR
단축 URL 픽스처 없음 12개

특히 단축 URL 픽스처는 실제 리포트 들어왔던 URL 패턴을 모아서 만들어둠. 같은 회귀 두 번 안 맞기 위함.

정리

  • 리플렉션 쓰면 proguard 룰부터 점검
  • 디버그/릴리즈 차이 무시하면 결국 사용자 리포트로 돌아옴
  • 외부 서비스 URL 포맷은 언제든 바뀐다는 가정으로 짜야 함

다음

댓글 0

첫 댓글 달아줘.