일부 안드로이드 기기에서 기기를 돌려도 화면 회전이 나타나지 않는 문제를 해결하는 과정과 그 방법을 정리.
기기 방향에 따라 화면이 회전하지 않는 증상
일부 안드로이드 기기에서 기기를 이리저리 돌려봐도 Trindex 앱 화면이 회전하지 않는 문제를 발견했다. 정상 동작이 확인된 기기는 갤럭시 S24 플러스, 플립 5, 노트 9이었고, 문제가 확인된 기기는 갤럭시 A34와 안드로이드 스튜디오의 가상 기기들이었다.
문제 해결하기까지의 시행착오
문제의 원인이 정확하게 파악된 상태라면 굳이 시행착오 과정을 글로 남기지 않고, 원인과 해결 방법만으로 내용을 채웠을 것이다. 하지만 현재 문제는 해결했지만 원인은 여전히 불분명하기에 향후 유사한 문제가 발생할 경우를 대비해서 시행착오 과정도 남긴다.
먼저 git으로 롤백 및 테스트, 원복을 반복한 끝에 0.38.0 버전부터 해당 문제가 발생했음을 확인할 수 있었다. 따라서 0.38.0 버전을 기본으로 두고 일부 코드를 업데이트 이전으로 롤백 해가며, 문제를 발생시키는 코드를 찾아보기로 했다. 다음은 Trindex 0.38.0 버전에서 업데이트된 내용이다.
관련성을 상상하기 힘든 2, 3번은 차치하고, 1, 4, 5번 중 작업 소요가 가장 적은 4, 5번 내용부터 확인을 시작했다.
위와 같이 dependencies의 일부 라이브러리에 버전 업이 되었는데, 이게 4번에 해당되는 내용이다. 두 라이브러리를 각각 이전 버전으로 롤백 해서 테스트를 해 보았지만 문제가 해결되지 않았다.
AGP와 Gradle의 버전 업과 관련된 위 내용이 5번에 해당되는 내용이다. 4번에 비해 문제와 관련성이 떨어진다는 생각도 들었지만 선입견 없이 롤백 테스트를 진행했고, 마찬가지로 여기서도 문제가 해결되지 않았다.
안드로이드 스튜디오의 자체 버전 업도 5번에 해당하는 내용이었지만 이는 문제의 원인과는 관계없을 것이라 판단하고 구 버전으로의 다운그레이드를 시도하지 않았다. 만약 이 부분이 원인이라면 Trindex 0.38.0 버전에서부터 문제가 발생했다는 사실을 알아내지도 못했을 것이다.
1번은 0.38.0 버전의 핵심 업데이트 내용인데, 관련해서 수정된 코드와 삭제 및 편집된 리소스가 너무 많아 일단 해당 부분이 원인이었는지를 판단 정도만이라도 할 수 있도록 롤백이 아닌 제거를 해 보기로 했다. 그리고 오랜 시간을 들여 제거를 마쳤을 때 여전히 문제가 해결되지 않는다는 충격적인 사실을 마주하게 되었다.
이대로 가다가는 프로젝트를 처음 시작할 때처럼 템플릿 수준의 기본 뼈대만 남아도 문제가 해결되지 않을 것 같았다. 이쯤 되니 애초에 내가 작성한 코드에는 문제가 없는 게 아닐까, 특정 시점을 기준으로 안드로이드 정책이 바뀐 게 아닐까 하는 별별 생각이 다 들었는데, 그러한 생각으로 웹 서핑을 하다가 다음의 코드 한 줄을 발견하게 된다.
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
액티비티가 기기 방향에 따라 회전이 되도록 설정하는 코드이다. 그동안은 앱 화면이 회전하는 것을 디폴트 설정으로 알고 있었기 때문에 굳이 사용하지 않았던 코드인데, 갑작스러운 정책 변화가 가능성이 전혀 없는 이야기는 아니라서 시도는 해보기로 했다. 그런데 이게 웬걸. 반응이 있었다! 비록 멀티태스킹 화면 마냥 분할된 채로 회전되고, 이후 먹통까지 되면서 ANR 에러가 발생했지만 말이다.
위 링크는 얼마 전에 해결했던 ANR 이슈에 대한 기록이다. 설마 했지만 동일한 방법을 취하고 나니 화면 분할 문제와 ANR 에러 문제가 말끔히 해결되었다. 이쯤 되니 앞서 진행했던 롤백 테스트의 결과들에도 의문이 생기기 시작했는데, AVD 초기화 후 다시 동일한 테스트를 진행해 보았지만 결과는 같았다.
해결 방법
안드로이드 정책이 바뀌었다는 근거를 찾아내지 못했기 때문에 문제의 원인을 정확히 파악했다고 할 수는 없지만 결국 해결 방법은 위의 코드 한 줄이다. 액티비티의 적당한 시점에 위 코드를 통해 화면 회전 설정을 명시해 주기만 하면 된다. 장시간의 삽질 치고는 허무한 결론이 아닐 수 없다.
코드 추가 이후부터는 빠릿하게 회전하는 모습을 보여준다.