문제 발생
Unity의 AR Foundation 기능을 이용한 앱을 개발할 때 안드로이드 기기에서 튕김 현상이 있었습니다. Galaxy A8 2018, Galaxy S20, Galaxy S21+, Galaxy Z Fold3 모델로 테스트 했을 때 구형 기기인 Galaxy A8 2018에서는 정상적으로 구동되는 반면 나머지 최신 기기들에서는 앱을 실행한 후 카메라 권한을 주자마자 튕기는 현상이 발생하였습니다.
해결 과정
시도1. 처음 시도해본 것은 유니티 버전 또는 AR Foundation packge 버전과 최신 기기간 호환성에 문제가 있다고 생각하여 여러 버전을 테스트 해보았습니다.
가장 최신 Stable 빌드부터 다른 LTS 버전까지 테스트 해보았지만 해결되지 않았습니다.
동일하게 AR Foundation, ARCore 또한 여러 버전을 테스트 해보았지만 해결되지 않았습니다.
시도2. 그대로 따라하기
제가 뭔가 Scene에 잘못 배치하거나 오류가 있을수도 있으니 최근에 올라온 Tutorial 영상들을 그대로 따라해보았습니다. 역시나 해결되지 않았습니다.
시도3. 도와줘요 구글!
감히 버그님을 미천한 제 실력으로 해결하려 한 것이 잘못되었습니다. 위대하신 구글님께 여쭈어봅니다.
https://answers.unity.com/questions/1763787/ar-application-keeps-crashing-when-permitting-came.html
바로 정답을 알려주시네요. 대충 구글의 AR Core가 32비트 지원이 끝났는데 유니티 기본 세팅은 32비트로 돌아가도록 되어 있어서 동작하지 않았나봅니다. 그래서 구형 기기인 A8에서는 잘 동작했던 것이었습니다.
알려주신대로 세팅을 해봅시다. 참고로 가장 최신 빌드인 2021.1.19f1에는 Scripting Backend 옵션은 있지만 Target Architectures 옵션이 뜨지 않습니다. 튕기는 문제도 똑같아서 2020.3.17f1에서 진행하였습니다.
드디어 정상적으로 AR 앱이 작동하고 Plane, Point도 잘 인식합니다.
결론
8시간 이상의 삽질. 구글은 신이고 나는 X신이야!!
문제가 생기면 직접 해결하는 것도 좋지만 검색을 생활화 합시다. 당신의 시간을 아낄 수 있습니다.
미래의 누군가가 저와 동일한 문제가 생겨 이 글에 들어온다면 당신은 현명한 사람입니다.
부록
IL2CPP가 그래서 무엇인가? 궁금해서 찾아봤습니다.
https://youtu.be/0I5wqhWIptU
위 영상에서 소개해주신 내용을 제 나름대로 정리한거라 틀리거나 보완이 필요한 내용이 있을 수 있습니다.
유니티는 C#을 사용합니다. 그리고 모든 플랫폼에서 돌아갑니다. 문제는 C#으로 작성된 프로그램 넣고 땡 하면 돌아가는게 아닙니다. 당장 안드로이드만 해도 자바 기반입니다. 그냥 C#을 때려넣기만 한다고 돌아가지는 않죠. 유니티에서는 멀티 플랫폼 문제를 해결하기 위해 Mono라는 방식을 사용하였습니다.
C#으로 작성된 프로그램을 IL (Intermediate Language) 중간 언어로 변환 후 Mono가 IL을 실시간으로 필요한 부분만 분석하여 안드로이드, iOS 등 다양한 플랫폼에서 돌아가게 합니다. 그리고 이를 Just-In-Time, 줄여서 JIT이라고 부릅니다. 하지만 이러한 방식은 동작속도, 보안 등의 문제로 인해 새로운 방식이 필요했습니다.
여기서 IL2CPP가 등장합니다. IL2CPP는 C# -> IL -> Mono였던 방식을 C# -> IL -> CPP로 변환하여 줍니다. 결과적으로 CPP 코드가 나오고 Mono와 달리 실행하기 전 소스 코드를 미리 컴파일하는 Ahead-Of-Time (AOT) 방식을 이용하기에
실행 속도나 보안면에서 상대적으로 JIT 방식에 비해 이점이 있습니다. 그리고 위에서 문제가 되었던 64비트 지원 문제도 Mono 방식에서는 이슈가 있어 현재는 IL2CPP방식이 주로 쓰입니다.
그런데 아까 위에서 C#은 그냥 넣으면 안 돌아간다면서요? 그런데 C++은 되나요?
안드로이드 기준으로 java만으로 필요한 기능과 성능을 모두 만족시키기는 어렵기에 C나 C++로 작성된 코드를 그대로 쓸 수 있게 해주는 NDK라는 툴셋이 있습니다. 이를 이용하여 C++로 작성된 코드도 돌아갑니다.
딴소리지만 저 캔스톤 스피커 구매를 고려하고있는데 쓸만한가요?